diff --git a/.github/workflows/api-model-runtime-tests.yml b/.github/workflows/api-model-runtime-tests.yml new file mode 100644 index 00000000000000..a263d033e3925a --- /dev/null +++ b/.github/workflows/api-model-runtime-tests.yml @@ -0,0 +1,58 @@ +name: Run Pytest + +on: + pull_request: + branches: + - main + push: + branches: + - deploy/dev + - feat/model-runtime + +jobs: + test: + runs-on: ubuntu-latest + + env: + OPENAI_API_KEY: sk-IamNotARealKeyJustForMockTestKawaiiiiiiiiii + AZURE_OPENAI_API_BASE: https://difyai-openai.openai.azure.com + AZURE_OPENAI_API_KEY: xxxxb1707exxxxxxxxxxaaxxxxxf94 + ANTHROPIC_API_KEY: sk-ant-api11-IamNotARealKeyJustForMockTestKawaiiiiiiiiii-NotBaka-ASkksz + CHATGLM_API_BASE: http://a.abc.com:11451 + XINFERENCE_SERVER_URL: http://a.abc.com:11451 + XINFERENCE_GENERATION_MODEL_UID: generate + XINFERENCE_CHAT_MODEL_UID: chat + XINFERENCE_EMBEDDINGS_MODEL_UID: embedding + XINFERENCE_RERANK_MODEL_UID: rerank + GOOGLE_API_KEY: abcdefghijklmnopqrstuvwxyz + HUGGINGFACE_API_KEY: hf-awuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwuwu + HUGGINGFACE_TEXT_GEN_ENDPOINT_URL: a + HUGGINGFACE_TEXT2TEXT_GEN_ENDPOINT_URL: b + HUGGINGFACE_EMBEDDINGS_ENDPOINT_URL: c + MOCK_SWITCH: true + + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.10' + + - name: Cache pip dependencies + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('api/requirements.txt') }} + restore-keys: ${{ runner.os }}-pip- + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pytest + pip install -r api/requirements.txt + + - name: Run pytest + run: pytest api/tests/integration_tests/model_runtime/anthropic api/tests/integration_tests/model_runtime/azure_openai api/tests/integration_tests/model_runtime/openai api/tests/integration_tests/model_runtime/chatglm api/tests/integration_tests/model_runtime/google api/tests/integration_tests/model_runtime/xinference api/tests/integration_tests/model_runtime/huggingface_hub/test_llm.py diff --git a/.github/workflows/api-unit-tests.yml b/.github/workflows/api-unit-tests.yml deleted file mode 100644 index 6e795c953f9104..00000000000000 --- a/.github/workflows/api-unit-tests.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Run Pytest - -on: - pull_request: - branches: - - main - push: - branches: - - deploy/dev - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.10' - - - name: Cache pip dependencies - uses: actions/cache@v2 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('api/requirements.txt') }} - restore-keys: ${{ runner.os }}-pip- - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install pytest - pip install -r api/requirements.txt - - - name: Run pytest - run: pytest api/tests/unit_tests diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9321d2807fbdd1..9db7fbfe9c1ef7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,6 +55,11 @@ Did you have an issue, like a merge conflict, or don't know how to open a pull r Stuck somewhere? Have any questions? Join the [Discord Community Server](https://discord.gg/j3XRWSPBf7). We are here to help! + +### Provider Integrations +If you see a model provider not yet supported by Dify that you'd like to use, follow these [steps](api/core/model_runtime/README.md) to submit a PR. + + ### i18n (Internationalization) Support We are looking for contributors to help with translations in other languages. If you are interested in helping, please join the [Discord Community Server](https://discord.gg/AhzKf7dNgk) and let us know. diff --git a/api/.vscode/launch.json b/api/.vscode/launch.json index e3c1f797c61601..cb718f9f60abcf 100644 --- a/api/.vscode/launch.json +++ b/api/.vscode/launch.json @@ -4,6 +4,21 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "Python: Celery", + "type": "python", + "request": "launch", + "module": "celery", + "justMyCode": true, + "args": ["-A", "app.celery", "worker", "-P", "gevent", "-c", "1", "--loglevel", "info", "-Q", "dataset,generation,mail"], + "envFile": "${workspaceFolder}/.env", + "env": { + "FLASK_APP": "app.py", + "FLASK_DEBUG": "1", + "GEVENT_SUPPORT": "True" + }, + "console": "integratedTerminal" + }, { "name": "Python: Flask", "type": "python", diff --git a/api/Dockerfile b/api/Dockerfile index 12ce05ac03b981..c18ce73dfa507d 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -34,9 +34,6 @@ RUN apt-get update \ COPY --from=base /pkg /usr/local COPY . /app/api/ -RUN python -c "from transformers import GPT2TokenizerFast; GPT2TokenizerFast.from_pretrained('gpt2')" -ENV TRANSFORMERS_OFFLINE true - COPY docker/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/api/app.py b/api/app.py index 487cd45fb4f0fe..4e5fd1f24bd368 100644 --- a/api/app.py +++ b/api/app.py @@ -6,9 +6,12 @@ if not os.environ.get("DEBUG") or os.environ.get("DEBUG").lower() != 'true': from gevent import monkey monkey.patch_all() - if os.environ.get("VECTOR_STORE") == 'milvus': - import grpc.experimental.gevent - grpc.experimental.gevent.init_gevent() + # if os.environ.get("VECTOR_STORE") == 'milvus': + import grpc.experimental.gevent + grpc.experimental.gevent.init_gevent() + + import langchain + langchain.verbose = True import time import logging @@ -18,9 +21,8 @@ from flask import Flask, request, Response from flask_cors import CORS -from core.model_providers.providers import hosted from extensions import ext_celery, ext_sentry, ext_redis, ext_login, ext_migrate, \ - ext_database, ext_storage, ext_mail, ext_code_based_extension + ext_database, ext_storage, ext_mail, ext_code_based_extension, ext_hosting_provider from extensions.ext_database import db from extensions.ext_login import login_manager @@ -79,8 +81,6 @@ def create_app(test_config=None) -> Flask: register_blueprints(app) register_commands(app) - hosted.init_app(app) - return app @@ -95,6 +95,7 @@ def initialize_extensions(app): ext_celery.init_app(app) ext_login.init_app(app) ext_mail.init_app(app) + ext_hosting_provider.init_app(app) ext_sentry.init_app(app) @@ -105,13 +106,18 @@ def load_user_from_request(request_from_flask_login): if request.blueprint == 'console': # Check if the user_id contains a dot, indicating the old format auth_header = request.headers.get('Authorization', '') - if ' ' not in auth_header: - raise Unauthorized('Invalid Authorization header format. Expected \'Bearer \' format.') - auth_scheme, auth_token = auth_header.split(None, 1) - auth_scheme = auth_scheme.lower() - if auth_scheme != 'bearer': - raise Unauthorized('Invalid Authorization header format. Expected \'Bearer \' format.') - + if not auth_header: + auth_token = request.args.get('_token') + if not auth_token: + raise Unauthorized('Invalid Authorization token.') + else: + if ' ' not in auth_header: + raise Unauthorized('Invalid Authorization header format. Expected \'Bearer \' format.') + auth_scheme, auth_token = auth_header.split(None, 1) + auth_scheme = auth_scheme.lower() + if auth_scheme != 'bearer': + raise Unauthorized('Invalid Authorization header format. Expected \'Bearer \' format.') + decoded = PassportService().verify(auth_token) user_id = decoded.get('user_id') diff --git a/api/commands.py b/api/commands.py index deaa2e1675b7bc..9e4681b42f530b 100644 --- a/api/commands.py +++ b/api/commands.py @@ -12,16 +12,12 @@ from qdrant_client.http.models import TextIndexParams, TextIndexType, TokenizerType from tqdm import tqdm from flask import current_app, Flask -from langchain.embeddings import OpenAIEmbeddings from werkzeug.exceptions import NotFound from core.embedding.cached_embedding import CacheEmbedding from core.index.index import IndexBuilder -from core.model_providers.model_factory import ModelFactory -from core.model_providers.models.embedding.openai_embedding import OpenAIEmbedding -from core.model_providers.models.entity.model_params import ModelType -from core.model_providers.providers.hosted import hosted_model_providers -from core.model_providers.providers.openai_provider import OpenAIProvider +from core.model_manager import ModelManager +from core.model_runtime.entities.model_entities import ModelType from libs.password import password_pattern, valid_password, hash_password from libs.helper import email as email_validate from extensions.ext_database import db @@ -327,6 +323,8 @@ def create_qdrant_indexes(): except NotFound: break + model_manager = ModelManager() + page += 1 for dataset in datasets: if dataset.index_struct_dict: @@ -334,19 +332,23 @@ def create_qdrant_indexes(): try: click.echo('Create dataset qdrant index: {}'.format(dataset.id)) try: - embedding_model = ModelFactory.get_embedding_model( + embedding_model = model_manager.get_model_instance( tenant_id=dataset.tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model + ) except Exception: try: - embedding_model = ModelFactory.get_embedding_model( - tenant_id=dataset.tenant_id + embedding_model = model_manager.get_default_model_instance( + tenant_id=dataset.tenant_id, + model_type=ModelType.TEXT_EMBEDDING, ) - dataset.embedding_model = embedding_model.name - dataset.embedding_model_provider = embedding_model.model_provider.provider_name + dataset.embedding_model = embedding_model.model + dataset.embedding_model_provider = embedding_model.provider except Exception: + provider = Provider( id='provider_id', tenant_id=dataset.tenant_id, diff --git a/api/config.py b/api/config.py index 2f0ec1cdb74eb1..df8d24de373068 100644 --- a/api/config.py +++ b/api/config.py @@ -87,7 +87,7 @@ def __init__(self): # ------------------------ # General Configurations. # ------------------------ - self.CURRENT_VERSION = "0.3.34" + self.CURRENT_VERSION = "0.4.0" self.COMMIT_SHA = get_env('COMMIT_SHA') self.EDITION = "SELF_HOSTED" self.DEPLOY_ENV = get_env('DEPLOY_ENV') diff --git a/api/controllers/console/__init__.py b/api/controllers/console/__init__.py index 6fa896c3e82190..95a9fe3a089949 100644 --- a/api/controllers/console/__init__.py +++ b/api/controllers/console/__init__.py @@ -18,7 +18,7 @@ from .datasets import datasets, datasets_document, datasets_segments, file, hit_testing, data_source # Import workspace controllers -from .workspace import workspace, members, providers, model_providers, account, tool_providers, models +from .workspace import workspace, members, model_providers, account, tool_providers, models # Import explore controllers from .explore import installed_app, recommended_app, completion, conversation, message, parameter, saved_message, audio diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index ff41c929ac7894..c5d24f04997755 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -4,6 +4,10 @@ from datetime import datetime from flask_login import current_user + +from core.model_manager import ModelManager +from core.model_runtime.entities.model_entities import ModelType +from core.provider_manager import ProviderManager from libs.login import login_required from flask_restful import Resource, reqparse, marshal_with, abort, inputs from werkzeug.exceptions import Forbidden @@ -13,9 +17,7 @@ from controllers.console.app.error import AppNotFoundError, ProviderNotInitializeError from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required, cloud_edition_billing_resource_check -from core.model_providers.error import ProviderTokenNotInitError, LLMBadRequestError -from core.model_providers.model_factory import ModelFactory -from core.model_providers.model_provider_factory import ModelProviderFactory +from core.errors.error import ProviderTokenNotInitError, LLMBadRequestError from events.app_event import app_was_created, app_was_deleted from fields.app_fields import app_pagination_fields, app_detail_fields, template_list_fields, \ app_detail_fields_with_site @@ -73,39 +75,41 @@ def post(self): raise Forbidden() try: - default_model = ModelFactory.get_text_generation_model( - tenant_id=current_user.current_tenant_id + provider_manager = ProviderManager() + default_model_entity = provider_manager.get_default_model( + tenant_id=current_user.current_tenant_id, + model_type=ModelType.LLM ) except (ProviderTokenNotInitError, LLMBadRequestError): - default_model = None + default_model_entity = None except Exception as e: logging.exception(e) - default_model = None + default_model_entity = None if args['model_config'] is not None: # validate config model_config_dict = args['model_config'] # get model provider - model_provider = ModelProviderFactory.get_preferred_model_provider( - current_user.current_tenant_id, - model_config_dict["model"]["provider"] + model_manager = ModelManager() + model_instance = model_manager.get_default_model_instance( + tenant_id=current_user.current_tenant_id, + model_type=ModelType.LLM ) - if not model_provider: - if not default_model: - raise ProviderNotInitializeError( - f"No Default System Reasoning Model available. Please configure " - f"in the Settings -> Model Provider.") - else: - model_config_dict["model"]["provider"] = default_model.model_provider.provider_name - model_config_dict["model"]["name"] = default_model.name + if not model_instance: + raise ProviderNotInitializeError( + f"No Default System Reasoning Model available. Please configure " + f"in the Settings -> Model Provider.") + else: + model_config_dict["model"]["provider"] = model_instance.provider + model_config_dict["model"]["name"] = model_instance.model model_configuration = AppModelConfigService.validate_configuration( tenant_id=current_user.current_tenant_id, account=current_user, config=model_config_dict, - mode=args['mode'] + app_mode=args['mode'] ) app = App( @@ -129,21 +133,27 @@ def post(self): app_model_config = AppModelConfig(**model_config_template['model_config']) # get model provider - model_provider = ModelProviderFactory.get_preferred_model_provider( - current_user.current_tenant_id, - app_model_config.model_dict["provider"] - ) - - if not model_provider: - if not default_model: - raise ProviderNotInitializeError( - f"No Default System Reasoning Model available. Please configure " - f"in the Settings -> Model Provider.") - else: - model_dict = app_model_config.model_dict - model_dict['provider'] = default_model.model_provider.provider_name - model_dict['name'] = default_model.name - app_model_config.model = json.dumps(model_dict) + model_manager = ModelManager() + + try: + model_instance = model_manager.get_default_model_instance( + tenant_id=current_user.current_tenant_id, + model_type=ModelType.LLM + ) + except ProviderTokenNotInitError: + raise ProviderNotInitializeError( + f"No Default System Reasoning Model available. Please configure " + f"in the Settings -> Model Provider.") + + if not model_instance: + raise ProviderNotInitializeError( + f"No Default System Reasoning Model available. Please configure " + f"in the Settings -> Model Provider.") + else: + model_dict = app_model_config.model_dict + model_dict['provider'] = model_instance.provider + model_dict['name'] = model_instance.model + app_model_config.model = json.dumps(model_dict) app.name = args['name'] app.mode = args['mode'] diff --git a/api/controllers/console/app/audio.py b/api/controllers/console/app/audio.py index 628b586d5a7da7..7829374238249d 100644 --- a/api/controllers/console/app/audio.py +++ b/api/controllers/console/app/audio.py @@ -2,6 +2,8 @@ import logging from flask import request + +from core.model_runtime.errors.invoke import InvokeError from libs.login import login_required from werkzeug.exceptions import InternalServerError @@ -14,8 +16,7 @@ UnsupportedAudioTypeError, ProviderNotSupportSpeechToTextError from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required -from core.model_providers.error import LLMBadRequestError, LLMAPIUnavailableError, LLMAuthorizationError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError from flask_restful import Resource from services.audio_service import AudioService from services.errors.audio import NoAudioUploadedServiceError, AudioTooLargeServiceError, \ @@ -56,8 +57,7 @@ def post(self, app_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e diff --git a/api/controllers/console/app/completion.py b/api/controllers/console/app/completion.py index b62c751a0dbdb5..b1deb100da03ba 100644 --- a/api/controllers/console/app/completion.py +++ b/api/controllers/console/app/completion.py @@ -5,6 +5,10 @@ import flask_login from flask import Response, stream_with_context + +from core.application_queue_manager import ApplicationQueueManager +from core.entities.application_entities import InvokeFrom +from core.model_runtime.errors.invoke import InvokeError from libs.login import login_required from werkzeug.exceptions import InternalServerError, NotFound @@ -16,9 +20,7 @@ ProviderModelCurrentlyNotSupportError from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required -from core.conversation_message_task import PubHandler -from core.model_providers.error import LLMBadRequestError, LLMAPIUnavailableError, LLMAuthorizationError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError from libs.helper import uuid_value from flask_restful import Resource, reqparse @@ -56,7 +58,7 @@ def post(self, app_id): app_model=app_model, user=account, args=args, - from_source='console', + invoke_from=InvokeFrom.DEBUGGER, streaming=streaming, is_model_config_override=True ) @@ -75,8 +77,7 @@ def post(self, app_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -97,7 +98,7 @@ def post(self, app_id, task_id): account = flask_login.current_user - PubHandler.stop(account, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.DEBUGGER, account.id) return {'result': 'success'}, 200 @@ -132,7 +133,7 @@ def post(self, app_id): app_model=app_model, user=account, args=args, - from_source='console', + invoke_from=InvokeFrom.DEBUGGER, streaming=streaming, is_model_config_override=True ) @@ -151,8 +152,7 @@ def post(self, app_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -182,9 +182,8 @@ def generate() -> Generator: yield "data: " + json.dumps(api.handle_error(ProviderQuotaExceededError()).get_json()) + "\n\n" except ModelCurrentlyNotSupportError: yield "data: " + json.dumps(api.handle_error(ProviderModelCurrentlyNotSupportError()).get_json()) + "\n\n" - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: - yield "data: " + json.dumps(api.handle_error(CompletionRequestError(str(e))).get_json()) + "\n\n" + except InvokeError as e: + yield "data: " + json.dumps(api.handle_error(CompletionRequestError(e.description)).get_json()) + "\n\n" except ValueError as e: yield "data: " + json.dumps(api.handle_error(e).get_json()) + "\n\n" except Exception: @@ -207,7 +206,7 @@ def post(self, app_id, task_id): account = flask_login.current_user - PubHandler.stop(account, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.DEBUGGER, account.id) return {'result': 'success'}, 200 diff --git a/api/controllers/console/app/generator.py b/api/controllers/console/app/generator.py index f454426ab4b29c..90cb0a836756cf 100644 --- a/api/controllers/console/app/generator.py +++ b/api/controllers/console/app/generator.py @@ -1,4 +1,6 @@ from flask_login import current_user + +from core.model_runtime.errors.invoke import InvokeError from libs.login import login_required from flask_restful import Resource, reqparse @@ -8,8 +10,7 @@ from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required from core.generator.llm_generator import LLMGenerator -from core.model_providers.error import ProviderTokenNotInitError, QuotaExceededError, LLMBadRequestError, LLMAPIConnectionError, \ - LLMAPIUnavailableError, LLMRateLimitError, LLMAuthorizationError, ModelCurrentlyNotSupportError +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError class RuleGenerateApi(Resource): @@ -36,8 +37,7 @@ def post(self): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) return rules diff --git a/api/controllers/console/app/message.py b/api/controllers/console/app/message.py index b26287fd4bd27d..fb13f4f68e565b 100644 --- a/api/controllers/console/app/message.py +++ b/api/controllers/console/app/message.py @@ -14,8 +14,9 @@ AppMoreLikeThisDisabledError, ProviderQuotaExceededError, ProviderModelCurrentlyNotSupportError from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required, cloud_edition_billing_resource_check -from core.model_providers.error import LLMRateLimitError, LLMBadRequestError, LLMAuthorizationError, LLMAPIConnectionError, \ - ProviderTokenNotInitError, LLMAPIUnavailableError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.entities.application_entities import InvokeFrom +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from libs.login import login_required from fields.conversation_fields import message_detail_fields, annotation_fields from libs.helper import uuid_value @@ -208,7 +209,13 @@ def get(self, app_id, message_id): app_model = _get_app(app_id, 'completion') try: - response = CompletionService.generate_more_like_this(app_model, current_user, message_id, streaming) + response = CompletionService.generate_more_like_this( + app_model=app_model, + user=current_user, + message_id=message_id, + invoke_from=InvokeFrom.DEBUGGER, + streaming=streaming + ) return compact_response(response) except MessageNotExistsError: raise NotFound("Message Not Exists.") @@ -220,8 +227,7 @@ def get(self, app_id, message_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -249,8 +255,7 @@ def generate() -> Generator: except ModelCurrentlyNotSupportError: yield "data: " + json.dumps( api.handle_error(ProviderModelCurrentlyNotSupportError()).get_json()) + "\n\n" - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: yield "data: " + json.dumps(api.handle_error(CompletionRequestError(str(e))).get_json()) + "\n\n" except ValueError as e: yield "data: " + json.dumps(api.handle_error(e).get_json()) + "\n\n" @@ -290,8 +295,7 @@ def get(self, app_id, message_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except Exception: logging.exception("internal server error.") diff --git a/api/controllers/console/app/model_config.py b/api/controllers/console/app/model_config.py index 5103fddca3fe44..7ed92a65312431 100644 --- a/api/controllers/console/app/model_config.py +++ b/api/controllers/console/app/model_config.py @@ -31,7 +31,7 @@ def post(self, app_id): tenant_id=current_user.current_tenant_id, account=current_user, config=request.json, - mode=app.mode + app_mode=app.mode ) new_app_model_config = AppModelConfig( diff --git a/api/controllers/console/datasets/datasets.py b/api/controllers/console/datasets/datasets.py index b4323f18ec2d23..ac793746601f1b 100644 --- a/api/controllers/console/datasets/datasets.py +++ b/api/controllers/console/datasets/datasets.py @@ -4,6 +4,8 @@ from flask_login import current_user from controllers.console.apikey import api_key_list, api_key_fields +from core.model_runtime.entities.model_entities import ModelType +from core.provider_manager import ProviderManager from libs.login import login_required from flask_restful import Resource, reqparse, marshal, marshal_with from werkzeug.exceptions import NotFound, Forbidden @@ -14,8 +16,7 @@ from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required from core.indexing_runner import IndexingRunner -from core.model_providers.error import LLMBadRequestError, ProviderTokenNotInitError -from core.model_providers.models.entity.model_params import ModelType +from core.errors.error import LLMBadRequestError, ProviderTokenNotInitError from fields.app_fields import related_app_list from fields.dataset_fields import dataset_detail_fields, dataset_query_detail_fields from fields.document_fields import document_status_fields @@ -23,7 +24,6 @@ from models.dataset import DocumentSegment, Document from models.model import UploadFile, ApiToken from services.dataset_service import DatasetService, DocumentService -from services.provider_service import ProviderService def _validate_name(name): @@ -55,16 +55,20 @@ def get(self): current_user.current_tenant_id, current_user) # check embedding setting - provider_service = ProviderService() - valid_model_list = provider_service.get_valid_model_list(current_user.current_tenant_id, - ModelType.EMBEDDINGS.value) - # if len(valid_model_list) == 0: - # raise ProviderNotInitializeError( - # f"No Embedding Model available. Please configure a valid provider " - # f"in the Settings -> Model Provider.") + provider_manager = ProviderManager() + configurations = provider_manager.get_configurations( + tenant_id=current_user.current_tenant_id + ) + + embedding_models = configurations.get_models( + model_type=ModelType.TEXT_EMBEDDING, + only_active=True + ) + model_names = [] - for valid_model in valid_model_list: - model_names.append(f"{valid_model['model_name']}:{valid_model['model_provider']['provider_name']}") + for embedding_model in embedding_models: + model_names.append(f"{embedding_model.model}:{embedding_model.provider.provider}") + data = marshal(datasets, dataset_detail_fields) for item in data: if item['indexing_technique'] == 'high_quality': @@ -75,6 +79,7 @@ def get(self): item['embedding_available'] = False else: item['embedding_available'] = True + response = { 'data': data, 'has_more': len(datasets) == limit, @@ -130,13 +135,20 @@ def get(self, dataset_id): raise Forbidden(str(e)) data = marshal(dataset, dataset_detail_fields) # check embedding setting - provider_service = ProviderService() - # get valid model list - valid_model_list = provider_service.get_valid_model_list(current_user.current_tenant_id, - ModelType.EMBEDDINGS.value) + provider_manager = ProviderManager() + configurations = provider_manager.get_configurations( + tenant_id=current_user.current_tenant_id + ) + + embedding_models = configurations.get_models( + model_type=ModelType.TEXT_EMBEDDING, + only_active=True + ) + model_names = [] - for valid_model in valid_model_list: - model_names.append(f"{valid_model['model_name']}:{valid_model['model_provider']['provider_name']}") + for embedding_model in embedding_models: + model_names.append(f"{embedding_model.model}:{embedding_model.provider.provider}") + if data['indexing_technique'] == 'high_quality': item_model = f"{data['embedding_model']}:{data['embedding_model_provider']}" if item_model in model_names: diff --git a/api/controllers/console/datasets/datasets_document.py b/api/controllers/console/datasets/datasets_document.py index 128a76f18ac416..1b501037ab1eba 100644 --- a/api/controllers/console/datasets/datasets_document.py +++ b/api/controllers/console/datasets/datasets_document.py @@ -2,8 +2,12 @@ from datetime import datetime from typing import List -from flask import request, current_app +from flask import request from flask_login import current_user + +from core.model_manager import ModelManager +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.errors.invoke import InvokeAuthorizationError from libs.login import login_required from flask_restful import Resource, fields, marshal, marshal_with, reqparse from sqlalchemy import desc, asc @@ -18,9 +22,8 @@ from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required, cloud_edition_billing_resource_check from core.indexing_runner import IndexingRunner -from core.model_providers.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError, \ +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError, \ LLMBadRequestError -from core.model_providers.model_factory import ModelFactory from extensions.ext_redis import redis_client from fields.document_fields import document_with_segments_fields, document_fields, \ dataset_and_document_fields, document_status_fields @@ -272,10 +275,12 @@ def post(self): args = parser.parse_args() if args['indexing_technique'] == 'high_quality': try: - ModelFactory.get_embedding_model( - tenant_id=current_user.current_tenant_id + model_manager = ModelManager() + model_manager.get_default_model_instance( + tenant_id=current_user.current_tenant_id, + model_type=ModelType.TEXT_EMBEDDING ) - except LLMBadRequestError: + except InvokeAuthorizationError: raise ProviderNotInitializeError( f"No Embedding Model available. Please configure a valid provider " f"in the Settings -> Model Provider.") diff --git a/api/controllers/console/datasets/datasets_segments.py b/api/controllers/console/datasets/datasets_segments.py index 6051d12999f5fa..24cf2433e7d076 100644 --- a/api/controllers/console/datasets/datasets_segments.py +++ b/api/controllers/console/datasets/datasets_segments.py @@ -12,8 +12,9 @@ from controllers.console.datasets.error import InvalidActionError, NoFileUploadedError, TooManyFilesError from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required, cloud_edition_billing_resource_check -from core.model_providers.error import LLMBadRequestError, ProviderTokenNotInitError -from core.model_providers.model_factory import ModelFactory +from core.errors.error import LLMBadRequestError, ProviderTokenNotInitError +from core.model_manager import ModelManager +from core.model_runtime.entities.model_entities import ModelType from libs.login import login_required from extensions.ext_database import db from extensions.ext_redis import redis_client @@ -133,10 +134,12 @@ def patch(self, dataset_id, segment_id, action): if dataset.indexing_technique == 'high_quality': # check embedding model setting try: - ModelFactory.get_embedding_model( + model_manager = ModelManager() + model_manager.get_model_instance( tenant_id=current_user.current_tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) except LLMBadRequestError: raise ProviderNotInitializeError( @@ -219,10 +222,12 @@ def post(self, dataset_id, document_id): # check embedding model setting if dataset.indexing_technique == 'high_quality': try: - ModelFactory.get_embedding_model( + model_manager = ModelManager() + model_manager.get_model_instance( tenant_id=current_user.current_tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) except LLMBadRequestError: raise ProviderNotInitializeError( @@ -269,10 +274,12 @@ def patch(self, dataset_id, document_id, segment_id): if dataset.indexing_technique == 'high_quality': # check embedding model setting try: - ModelFactory.get_embedding_model( + model_manager = ModelManager() + model_manager.get_model_instance( tenant_id=current_user.current_tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) except LLMBadRequestError: raise ProviderNotInitializeError( diff --git a/api/controllers/console/datasets/hit_testing.py b/api/controllers/console/datasets/hit_testing.py index ce4897100d9df9..79c7878717d170 100644 --- a/api/controllers/console/datasets/hit_testing.py +++ b/api/controllers/console/datasets/hit_testing.py @@ -12,7 +12,7 @@ from controllers.console.datasets.error import HighQualityDatasetOnlyError, DatasetNotInitializedError from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required -from core.model_providers.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError, \ +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError, \ LLMBadRequestError from fields.hit_testing_fields import hit_testing_record_fields from services.dataset_service import DatasetService diff --git a/api/controllers/console/explore/audio.py b/api/controllers/console/explore/audio.py index 50ddfac98f2cb8..12a5ff518c24be 100644 --- a/api/controllers/console/explore/audio.py +++ b/api/controllers/console/explore/audio.py @@ -11,8 +11,8 @@ NoAudioUploadedError, AudioTooLargeError, \ UnsupportedAudioTypeError, ProviderNotSupportSpeechToTextError from controllers.console.explore.wraps import InstalledAppResource -from core.model_providers.error import LLMBadRequestError, LLMAPIUnavailableError, LLMAuthorizationError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from services.audio_service import AudioService from services.errors.audio import NoAudioUploadedServiceError, AudioTooLargeServiceError, \ UnsupportedAudioTypeServiceError, ProviderNotSupportSpeechToTextServiceError @@ -53,8 +53,7 @@ def post(self, installed_app): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e diff --git a/api/controllers/console/explore/completion.py b/api/controllers/console/explore/completion.py index f1527bf63b5dcb..8d554720d41884 100644 --- a/api/controllers/console/explore/completion.py +++ b/api/controllers/console/explore/completion.py @@ -15,9 +15,10 @@ ProviderQuotaExceededError, ProviderModelCurrentlyNotSupportError, CompletionRequestError from controllers.console.explore.error import NotCompletionAppError, NotChatAppError from controllers.console.explore.wraps import InstalledAppResource -from core.conversation_message_task import PubHandler -from core.model_providers.error import LLMBadRequestError, LLMAPIUnavailableError, LLMAuthorizationError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.application_queue_manager import ApplicationQueueManager +from core.entities.application_entities import InvokeFrom +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from extensions.ext_database import db from libs.helper import uuid_value from services.completion_service import CompletionService @@ -50,7 +51,7 @@ def post(self, installed_app): app_model=app_model, user=current_user, args=args, - from_source='console', + invoke_from=InvokeFrom.EXPLORE, streaming=streaming ) @@ -68,8 +69,7 @@ def post(self, installed_app): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -84,7 +84,7 @@ def post(self, installed_app, task_id): if app_model.mode != 'completion': raise NotCompletionAppError() - PubHandler.stop(current_user, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.EXPLORE, current_user.id) return {'result': 'success'}, 200 @@ -115,7 +115,7 @@ def post(self, installed_app): app_model=app_model, user=current_user, args=args, - from_source='console', + invoke_from=InvokeFrom.EXPLORE, streaming=streaming ) @@ -133,8 +133,7 @@ def post(self, installed_app): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -149,7 +148,7 @@ def post(self, installed_app, task_id): if app_model.mode != 'chat': raise NotChatAppError() - PubHandler.stop(current_user, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.EXPLORE, current_user.id) return {'result': 'success'}, 200 @@ -175,8 +174,7 @@ def generate() -> Generator: yield "data: " + json.dumps(api.handle_error(ProviderQuotaExceededError()).get_json()) + "\n\n" except ModelCurrentlyNotSupportError: yield "data: " + json.dumps(api.handle_error(ProviderModelCurrentlyNotSupportError()).get_json()) + "\n\n" - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: yield "data: " + json.dumps(api.handle_error(CompletionRequestError(str(e))).get_json()) + "\n\n" except ValueError as e: yield "data: " + json.dumps(api.handle_error(e).get_json()) + "\n\n" diff --git a/api/controllers/console/explore/message.py b/api/controllers/console/explore/message.py index 5d07477b5eeb14..13d3696e1266ff 100644 --- a/api/controllers/console/explore/message.py +++ b/api/controllers/console/explore/message.py @@ -5,7 +5,7 @@ from flask import stream_with_context, Response from flask_login import current_user -from flask_restful import reqparse, fields, marshal_with +from flask_restful import reqparse, marshal_with from flask_restful.inputs import int_range from werkzeug.exceptions import NotFound, InternalServerError @@ -13,12 +13,14 @@ from controllers.console import api from controllers.console.app.error import AppMoreLikeThisDisabledError, ProviderNotInitializeError, \ ProviderQuotaExceededError, ProviderModelCurrentlyNotSupportError, CompletionRequestError -from controllers.console.explore.error import NotCompletionAppError, AppSuggestedQuestionsAfterAnswerDisabledError +from controllers.console.explore.error import NotCompletionAppError, AppSuggestedQuestionsAfterAnswerDisabledError, \ + NotChatAppError from controllers.console.explore.wraps import InstalledAppResource -from core.model_providers.error import LLMRateLimitError, LLMBadRequestError, LLMAuthorizationError, LLMAPIConnectionError, \ - ProviderTokenNotInitError, LLMAPIUnavailableError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.entities.application_entities import InvokeFrom +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from fields.message_fields import message_infinite_scroll_pagination_fields -from libs.helper import uuid_value, TimestampField +from libs.helper import uuid_value from services.completion_service import CompletionService from services.errors.app import MoreLikeThisDisabledError from services.errors.conversation import ConversationNotExistsError @@ -83,7 +85,13 @@ def get(self, installed_app, message_id): streaming = args['response_mode'] == 'streaming' try: - response = CompletionService.generate_more_like_this(app_model, current_user, message_id, streaming) + response = CompletionService.generate_more_like_this( + app_model=app_model, + user=current_user, + message_id=message_id, + invoke_from=InvokeFrom.EXPLORE, + streaming=streaming + ) return compact_response(response) except MessageNotExistsError: raise NotFound("Message Not Exists.") @@ -95,8 +103,7 @@ def get(self, installed_app, message_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -123,8 +130,7 @@ def generate() -> Generator: yield "data: " + json.dumps(api.handle_error(ProviderQuotaExceededError()).get_json()) + "\n\n" except ModelCurrentlyNotSupportError: yield "data: " + json.dumps(api.handle_error(ProviderModelCurrentlyNotSupportError()).get_json()) + "\n\n" - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: yield "data: " + json.dumps(api.handle_error(CompletionRequestError(str(e))).get_json()) + "\n\n" except ValueError as e: yield "data: " + json.dumps(api.handle_error(e).get_json()) + "\n\n" @@ -162,8 +168,7 @@ def get(self, installed_app, message_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except Exception: logging.exception("internal server error.") diff --git a/api/controllers/console/universal_chat/audio.py b/api/controllers/console/universal_chat/audio.py index 38bcc25b292b01..ea48b2d82db38b 100644 --- a/api/controllers/console/universal_chat/audio.py +++ b/api/controllers/console/universal_chat/audio.py @@ -11,8 +11,8 @@ NoAudioUploadedError, AudioTooLargeError, \ UnsupportedAudioTypeError, ProviderNotSupportSpeechToTextError from controllers.console.universal_chat.wraps import UniversalChatResource -from core.model_providers.error import LLMBadRequestError, LLMAPIUnavailableError, LLMAuthorizationError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from services.audio_service import AudioService from services.errors.audio import NoAudioUploadedServiceError, AudioTooLargeServiceError, \ UnsupportedAudioTypeServiceError, ProviderNotSupportSpeechToTextServiceError @@ -53,8 +53,7 @@ def post(self, universal_app): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e diff --git a/api/controllers/console/universal_chat/chat.py b/api/controllers/console/universal_chat/chat.py index c50625adc072b1..e7257157f7501d 100644 --- a/api/controllers/console/universal_chat/chat.py +++ b/api/controllers/console/universal_chat/chat.py @@ -12,9 +12,10 @@ from controllers.console.app.error import ConversationCompletedError, AppUnavailableError, ProviderNotInitializeError, \ ProviderQuotaExceededError, ProviderModelCurrentlyNotSupportError, CompletionRequestError from controllers.console.universal_chat.wraps import UniversalChatResource -from core.conversation_message_task import PubHandler -from core.model_providers.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError, \ - LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, LLMRateLimitError, LLMAuthorizationError +from core.application_queue_manager import ApplicationQueueManager +from core.entities.application_entities import InvokeFrom +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from libs.helper import uuid_value from services.completion_service import CompletionService @@ -68,7 +69,7 @@ def post(self, universal_app): app_model=app_model, user=current_user, args=args, - from_source='console', + invoke_from=InvokeFrom.EXPLORE, streaming=True, is_model_config_override=True, ) @@ -87,8 +88,7 @@ def post(self, universal_app): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -99,7 +99,7 @@ def post(self, universal_app): class UniversalChatStopApi(UniversalChatResource): def post(self, universal_app, task_id): - PubHandler.stop(current_user, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.EXPLORE, current_user.id) return {'result': 'success'}, 200 @@ -125,8 +125,7 @@ def generate() -> Generator: yield "data: " + json.dumps(api.handle_error(ProviderQuotaExceededError()).get_json()) + "\n\n" except ModelCurrentlyNotSupportError: yield "data: " + json.dumps(api.handle_error(ProviderModelCurrentlyNotSupportError()).get_json()) + "\n\n" - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: yield "data: " + json.dumps(api.handle_error(CompletionRequestError(str(e))).get_json()) + "\n\n" except ValueError as e: yield "data: " + json.dumps(api.handle_error(e).get_json()) + "\n\n" diff --git a/api/controllers/console/universal_chat/message.py b/api/controllers/console/universal_chat/message.py index 8568d3e9e9015e..38f3712a15ec9a 100644 --- a/api/controllers/console/universal_chat/message.py +++ b/api/controllers/console/universal_chat/message.py @@ -12,8 +12,8 @@ ProviderQuotaExceededError, ProviderModelCurrentlyNotSupportError, CompletionRequestError from controllers.console.explore.error import AppSuggestedQuestionsAfterAnswerDisabledError from controllers.console.universal_chat.wraps import UniversalChatResource -from core.model_providers.error import LLMRateLimitError, LLMBadRequestError, LLMAuthorizationError, LLMAPIConnectionError, \ - ProviderTokenNotInitError, LLMAPIUnavailableError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from libs.helper import uuid_value, TimestampField from services.errors.conversation import ConversationNotExistsError from services.errors.message import MessageNotExistsError, SuggestedQuestionsAfterAnswerDisabledError @@ -132,8 +132,7 @@ def get(self, universal_app, message_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except Exception: logging.exception("internal server error.") diff --git a/api/controllers/console/workspace/model_providers.py b/api/controllers/console/workspace/model_providers.py index e92a07b2ad8507..4086fdf049ea61 100644 --- a/api/controllers/console/workspace/model_providers.py +++ b/api/controllers/console/workspace/model_providers.py @@ -1,16 +1,19 @@ +import io + +from flask import send_file from flask_login import current_user -from libs.login import login_required from flask_restful import Resource, reqparse from werkzeug.exceptions import Forbidden from controllers.console import api -from controllers.console.app.error import ProviderNotInitializeError from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required -from core.model_providers.error import LLMBadRequestError -from core.model_providers.providers.base import CredentialsValidateFailedError -from services.provider_service import ProviderService +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.errors.validate import CredentialsValidateFailedError +from core.model_runtime.utils.encoders import jsonable_encoder +from libs.login import login_required from services.billing_service import BillingService +from services.model_provider_service import ModelProviderService class ModelProviderListApi(Resource): @@ -22,13 +25,36 @@ def get(self): tenant_id = current_user.current_tenant_id parser = reqparse.RequestParser() - parser.add_argument('model_type', type=str, required=False, nullable=True, location='args') + parser.add_argument('model_type', type=str, required=False, nullable=True, + choices=[mt.value for mt in ModelType], location='args') args = parser.parse_args() - provider_service = ProviderService() - provider_list = provider_service.get_provider_list(tenant_id=tenant_id, model_type=args.get('model_type')) + model_provider_service = ModelProviderService() + provider_list = model_provider_service.get_provider_list( + tenant_id=tenant_id, + model_type=args.get('model_type') + ) + + return jsonable_encoder({"data": provider_list}) + + +class ModelProviderCredentialApi(Resource): + + @setup_required + @login_required + @account_initialization_required + def get(self, provider: str): + tenant_id = current_user.current_tenant_id + + model_provider_service = ModelProviderService() + credentials = model_provider_service.get_provider_credentials( + tenant_id=tenant_id, + provider=provider + ) - return provider_list + return { + "credentials": credentials + } class ModelProviderValidateApi(Resource): @@ -36,21 +62,24 @@ class ModelProviderValidateApi(Resource): @setup_required @login_required @account_initialization_required - def post(self, provider_name: str): + def post(self, provider: str): parser = reqparse.RequestParser() - parser.add_argument('config', type=dict, required=True, nullable=False, location='json') + parser.add_argument('credentials', type=dict, required=True, nullable=False, location='json') args = parser.parse_args() - provider_service = ProviderService() + tenant_id = current_user.current_tenant_id + + model_provider_service = ModelProviderService() result = True error = None try: - provider_service.custom_provider_config_validate( - provider_name=provider_name, - config=args['config'] + model_provider_service.provider_credentials_validate( + tenant_id=tenant_id, + provider=provider, + credentials=args['credentials'] ) except CredentialsValidateFailedError as ex: result = False @@ -64,26 +93,26 @@ def post(self, provider_name: str): return response -class ModelProviderUpdateApi(Resource): +class ModelProviderApi(Resource): @setup_required @login_required @account_initialization_required - def post(self, provider_name: str): + def post(self, provider: str): if current_user.current_tenant.current_role not in ['admin', 'owner']: raise Forbidden() parser = reqparse.RequestParser() - parser.add_argument('config', type=dict, required=True, nullable=False, location='json') + parser.add_argument('credentials', type=dict, required=True, nullable=False, location='json') args = parser.parse_args() - provider_service = ProviderService() + model_provider_service = ModelProviderService() try: - provider_service.save_custom_provider_config( + model_provider_service.save_provider_credentials( tenant_id=current_user.current_tenant_id, - provider_name=provider_name, - config=args['config'] + provider=provider, + credentials=args['credentials'] ) except CredentialsValidateFailedError as ex: raise ValueError(str(ex)) @@ -93,109 +122,36 @@ def post(self, provider_name: str): @setup_required @login_required @account_initialization_required - def delete(self, provider_name: str): + def delete(self, provider: str): if current_user.current_tenant.current_role not in ['admin', 'owner']: raise Forbidden() - provider_service = ProviderService() - provider_service.delete_custom_provider( + model_provider_service = ModelProviderService() + model_provider_service.remove_provider_credentials( tenant_id=current_user.current_tenant_id, - provider_name=provider_name + provider=provider ) return {'result': 'success'}, 204 -class ModelProviderModelValidateApi(Resource): - - @setup_required - @login_required - @account_initialization_required - def post(self, provider_name: str): - parser = reqparse.RequestParser() - parser.add_argument('model_name', type=str, required=True, nullable=False, location='json') - parser.add_argument('model_type', type=str, required=True, nullable=False, - choices=['text-generation', 'embeddings', 'speech2text', 'reranking'], location='json') - parser.add_argument('config', type=dict, required=True, nullable=False, location='json') - args = parser.parse_args() - - provider_service = ProviderService() - - result = True - error = None - - try: - provider_service.custom_provider_model_config_validate( - provider_name=provider_name, - model_name=args['model_name'], - model_type=args['model_type'], - config=args['config'] - ) - except CredentialsValidateFailedError as ex: - result = False - error = str(ex) - - response = {'result': 'success' if result else 'error'} - - if not result: - response['error'] = error - - return response - - -class ModelProviderModelUpdateApi(Resource): +class ModelProviderIconApi(Resource): + """ + Get model provider icon + """ @setup_required @login_required @account_initialization_required - def post(self, provider_name: str): - if current_user.current_tenant.current_role not in ['admin', 'owner']: - raise Forbidden() - - parser = reqparse.RequestParser() - parser.add_argument('model_name', type=str, required=True, nullable=False, location='json') - parser.add_argument('model_type', type=str, required=True, nullable=False, - choices=['text-generation', 'embeddings', 'speech2text', 'reranking'], location='json') - parser.add_argument('config', type=dict, required=True, nullable=False, location='json') - args = parser.parse_args() - - provider_service = ProviderService() - - try: - provider_service.add_or_save_custom_provider_model_config( - tenant_id=current_user.current_tenant_id, - provider_name=provider_name, - model_name=args['model_name'], - model_type=args['model_type'], - config=args['config'] - ) - except CredentialsValidateFailedError as ex: - raise ValueError(str(ex)) - - return {'result': 'success'}, 200 - - @setup_required - @login_required - @account_initialization_required - def delete(self, provider_name: str): - if current_user.current_tenant.current_role not in ['admin', 'owner']: - raise Forbidden() - - parser = reqparse.RequestParser() - parser.add_argument('model_name', type=str, required=True, nullable=False, location='args') - parser.add_argument('model_type', type=str, required=True, nullable=False, - choices=['text-generation', 'embeddings', 'speech2text', 'reranking'], location='args') - args = parser.parse_args() - - provider_service = ProviderService() - provider_service.delete_custom_provider_model( - tenant_id=current_user.current_tenant_id, - provider_name=provider_name, - model_name=args['model_name'], - model_type=args['model_type'] + def get(self, provider: str, icon_type: str, lang: str): + model_provider_service = ModelProviderService() + icon, mimetype = model_provider_service.get_model_provider_icon( + provider=provider, + icon_type=icon_type, + lang=lang ) - return {'result': 'success'}, 204 + return send_file(io.BytesIO(icon), mimetype=mimetype) class PreferredProviderTypeUpdateApi(Resource): @@ -203,71 +159,36 @@ class PreferredProviderTypeUpdateApi(Resource): @setup_required @login_required @account_initialization_required - def post(self, provider_name: str): + def post(self, provider: str): if current_user.current_tenant.current_role not in ['admin', 'owner']: raise Forbidden() + tenant_id = current_user.current_tenant_id + parser = reqparse.RequestParser() parser.add_argument('preferred_provider_type', type=str, required=True, nullable=False, choices=['system', 'custom'], location='json') args = parser.parse_args() - provider_service = ProviderService() - provider_service.switch_preferred_provider( - tenant_id=current_user.current_tenant_id, - provider_name=provider_name, + model_provider_service = ModelProviderService() + model_provider_service.switch_preferred_provider( + tenant_id=tenant_id, + provider=provider, preferred_provider_type=args['preferred_provider_type'] ) return {'result': 'success'} -class ModelProviderModelParameterRuleApi(Resource): - - @setup_required - @login_required - @account_initialization_required - def get(self, provider_name: str): - parser = reqparse.RequestParser() - parser.add_argument('model_name', type=str, required=True, nullable=False, location='args') - args = parser.parse_args() - - provider_service = ProviderService() - - try: - parameter_rules = provider_service.get_model_parameter_rules( - tenant_id=current_user.current_tenant_id, - model_provider_name=provider_name, - model_name=args['model_name'], - model_type='text-generation' - ) - except LLMBadRequestError: - raise ProviderNotInitializeError( - f"Current Text Generation Model is invalid. Please switch to the available model.") - - rules = { - k: { - 'enabled': v.enabled, - 'min': v.min, - 'max': v.max, - 'default': v.default, - 'precision': v.precision - } - for k, v in vars(parameter_rules).items() - } - - return rules - - class ModelProviderPaymentCheckoutUrlApi(Resource): @setup_required @login_required @account_initialization_required - def get(self, provider_name: str): - if provider_name != 'anthropic': - raise ValueError(f'provider name {provider_name} is invalid') + def get(self, provider: str): + if provider != 'anthropic': + raise ValueError(f'provider name {provider} is invalid') - data = BillingService.get_model_provider_payment_link(provider_name=provider_name, + data = BillingService.get_model_provider_payment_link(provider_name=provider, tenant_id=current_user.current_tenant_id, account_id=current_user.id) return data @@ -277,11 +198,11 @@ class ModelProviderFreeQuotaSubmitApi(Resource): @setup_required @login_required @account_initialization_required - def post(self, provider_name: str): - provider_service = ProviderService() - result = provider_service.free_quota_submit( + def post(self, provider: str): + model_provider_service = ModelProviderService() + result = model_provider_service.free_quota_submit( tenant_id=current_user.current_tenant_id, - provider_name=provider_name + provider=provider ) return result @@ -291,15 +212,15 @@ class ModelProviderFreeQuotaQualificationVerifyApi(Resource): @setup_required @login_required @account_initialization_required - def get(self, provider_name: str): + def get(self, provider: str): parser = reqparse.RequestParser() parser.add_argument('token', type=str, required=False, nullable=True, location='args') args = parser.parse_args() - provider_service = ProviderService() - result = provider_service.free_quota_qualification_verify( + model_provider_service = ModelProviderService() + result = model_provider_service.free_quota_qualification_verify( tenant_id=current_user.current_tenant_id, - provider_name=provider_name, + provider=provider, token=args['token'] ) @@ -307,19 +228,18 @@ def get(self, provider_name: str): api.add_resource(ModelProviderListApi, '/workspaces/current/model-providers') -api.add_resource(ModelProviderValidateApi, '/workspaces/current/model-providers//validate') -api.add_resource(ModelProviderUpdateApi, '/workspaces/current/model-providers/') -api.add_resource(ModelProviderModelValidateApi, - '/workspaces/current/model-providers//models/validate') -api.add_resource(ModelProviderModelUpdateApi, - '/workspaces/current/model-providers//models') + +api.add_resource(ModelProviderCredentialApi, '/workspaces/current/model-providers//credentials') +api.add_resource(ModelProviderValidateApi, '/workspaces/current/model-providers//credentials/validate') +api.add_resource(ModelProviderApi, '/workspaces/current/model-providers/') +api.add_resource(ModelProviderIconApi, '/workspaces/current/model-providers//' + '/') + api.add_resource(PreferredProviderTypeUpdateApi, - '/workspaces/current/model-providers//preferred-provider-type') -api.add_resource(ModelProviderModelParameterRuleApi, - '/workspaces/current/model-providers//models/parameter-rules') + '/workspaces/current/model-providers//preferred-provider-type') api.add_resource(ModelProviderPaymentCheckoutUrlApi, - '/workspaces/current/model-providers//checkout-url') + '/workspaces/current/model-providers//checkout-url') api.add_resource(ModelProviderFreeQuotaSubmitApi, - '/workspaces/current/model-providers//free-quota-submit') + '/workspaces/current/model-providers//free-quota-submit') api.add_resource(ModelProviderFreeQuotaQualificationVerifyApi, - '/workspaces/current/model-providers//free-quota-qualification-verify') + '/workspaces/current/model-providers//free-quota-qualification-verify') diff --git a/api/controllers/console/workspace/models.py b/api/controllers/console/workspace/models.py index 6df99ebe1bda4f..b5cb97d5478443 100644 --- a/api/controllers/console/workspace/models.py +++ b/api/controllers/console/workspace/models.py @@ -1,16 +1,17 @@ import logging from flask_login import current_user -from libs.login import login_required -from flask_restful import Resource, reqparse +from flask_restful import reqparse, Resource +from werkzeug.exceptions import Forbidden from controllers.console import api from controllers.console.setup import setup_required from controllers.console.wraps import account_initialization_required -from core.model_providers.model_provider_factory import ModelProviderFactory -from core.model_providers.models.entity.model_params import ModelType -from models.provider import ProviderType -from services.provider_service import ProviderService +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.errors.validate import CredentialsValidateFailedError +from core.model_runtime.utils.encoders import jsonable_encoder +from libs.login import login_required +from services.model_provider_service import ModelProviderService class DefaultModelApi(Resource): @@ -21,52 +22,20 @@ class DefaultModelApi(Resource): def get(self): parser = reqparse.RequestParser() parser.add_argument('model_type', type=str, required=True, nullable=False, - choices=['text-generation', 'embeddings', 'speech2text', 'reranking'], location='args') + choices=[mt.value for mt in ModelType], location='args') args = parser.parse_args() tenant_id = current_user.current_tenant_id - provider_service = ProviderService() - default_model = provider_service.get_default_model_of_model_type( + model_provider_service = ModelProviderService() + default_model_entity = model_provider_service.get_default_model_of_model_type( tenant_id=tenant_id, model_type=args['model_type'] ) - if not default_model: - return None - - model_provider = ModelProviderFactory.get_preferred_model_provider( - tenant_id, - default_model.provider_name - ) - - if not model_provider: - return { - 'model_name': default_model.model_name, - 'model_type': default_model.model_type, - 'model_provider': { - 'provider_name': default_model.provider_name - } - } - - provider = model_provider.provider - rst = { - 'model_name': default_model.model_name, - 'model_type': default_model.model_type, - 'model_provider': { - 'provider_name': provider.provider_name, - 'provider_type': provider.provider_type - } - } - - model_provider_rules = ModelProviderFactory.get_provider_rule(default_model.provider_name) - if provider.provider_type == ProviderType.SYSTEM.value: - rst['model_provider']['quota_type'] = provider.quota_type - rst['model_provider']['quota_unit'] = model_provider_rules['system_config']['quota_unit'] - rst['model_provider']['quota_limit'] = provider.quota_limit - rst['model_provider']['quota_used'] = provider.quota_used - - return rst + return jsonable_encoder({ + "data": default_model_entity + }) @setup_required @login_required @@ -76,15 +45,26 @@ def post(self): parser.add_argument('model_settings', type=list, required=True, nullable=False, location='json') args = parser.parse_args() - provider_service = ProviderService() + tenant_id = current_user.current_tenant_id + + model_provider_service = ModelProviderService() model_settings = args['model_settings'] for model_setting in model_settings: + if 'model_type' not in model_setting or model_setting['model_type'] not in [mt.value for mt in ModelType]: + raise ValueError('invalid model type') + + if 'provider' not in model_setting: + continue + + if 'model' not in model_setting: + raise ValueError('invalid model') + try: - provider_service.update_default_model_of_model_type( - tenant_id=current_user.current_tenant_id, + model_provider_service.update_default_model_of_model_type( + tenant_id=tenant_id, model_type=model_setting['model_type'], - provider_name=model_setting['provider_name'], - model_name=model_setting['model_name'] + provider=model_setting['provider'], + model=model_setting['model'] ) except Exception: logging.warning(f"{model_setting['model_type']} save error") @@ -92,22 +72,198 @@ def post(self): return {'result': 'success'} -class ValidModelApi(Resource): +class ModelProviderModelApi(Resource): + + @setup_required + @login_required + @account_initialization_required + def get(self, provider): + tenant_id = current_user.current_tenant_id + + model_provider_service = ModelProviderService() + models = model_provider_service.get_models_by_provider( + tenant_id=tenant_id, + provider=provider + ) + + return jsonable_encoder({ + "data": models + }) + + @setup_required + @login_required + @account_initialization_required + def post(self, provider: str): + if current_user.current_tenant.current_role not in ['admin', 'owner']: + raise Forbidden() + + tenant_id = current_user.current_tenant_id + + parser = reqparse.RequestParser() + parser.add_argument('model', type=str, required=True, nullable=False, location='json') + parser.add_argument('model_type', type=str, required=True, nullable=False, + choices=[mt.value for mt in ModelType], location='json') + parser.add_argument('credentials', type=dict, required=True, nullable=False, location='json') + args = parser.parse_args() + + model_provider_service = ModelProviderService() + + try: + model_provider_service.save_model_credentials( + tenant_id=tenant_id, + provider=provider, + model=args['model'], + model_type=args['model_type'], + credentials=args['credentials'] + ) + except CredentialsValidateFailedError as ex: + raise ValueError(str(ex)) + + return {'result': 'success'}, 200 + + @setup_required + @login_required + @account_initialization_required + def delete(self, provider: str): + if current_user.current_tenant.current_role not in ['admin', 'owner']: + raise Forbidden() + + tenant_id = current_user.current_tenant_id + + parser = reqparse.RequestParser() + parser.add_argument('model', type=str, required=True, nullable=False, location='json') + parser.add_argument('model_type', type=str, required=True, nullable=False, + choices=[mt.value for mt in ModelType], location='json') + args = parser.parse_args() + + model_provider_service = ModelProviderService() + model_provider_service.remove_model_credentials( + tenant_id=tenant_id, + provider=provider, + model=args['model'], + model_type=args['model_type'] + ) + + return {'result': 'success'}, 204 + + +class ModelProviderModelCredentialApi(Resource): + + @setup_required + @login_required + @account_initialization_required + def get(self, provider: str): + tenant_id = current_user.current_tenant_id + + parser = reqparse.RequestParser() + parser.add_argument('model', type=str, required=True, nullable=False, location='args') + parser.add_argument('model_type', type=str, required=True, nullable=False, + choices=[mt.value for mt in ModelType], location='args') + args = parser.parse_args() + + model_provider_service = ModelProviderService() + credentials = model_provider_service.get_model_credentials( + tenant_id=tenant_id, + provider=provider, + model_type=args['model_type'], + model=args['model'] + ) + + return { + "credentials": credentials + } + + +class ModelProviderModelValidateApi(Resource): + + @setup_required + @login_required + @account_initialization_required + def post(self, provider: str): + tenant_id = current_user.current_tenant_id + + parser = reqparse.RequestParser() + parser.add_argument('model', type=str, required=True, nullable=False, location='json') + parser.add_argument('model_type', type=str, required=True, nullable=False, + choices=[mt.value for mt in ModelType], location='json') + parser.add_argument('credentials', type=dict, required=True, nullable=False, location='json') + args = parser.parse_args() + + model_provider_service = ModelProviderService() + + result = True + error = None + + try: + model_provider_service.model_credentials_validate( + tenant_id=tenant_id, + provider=provider, + model=args['model'], + model_type=args['model_type'], + credentials=args['credentials'] + ) + except CredentialsValidateFailedError as ex: + result = False + error = str(ex) + + response = {'result': 'success' if result else 'error'} + + if not result: + response['error'] = error + + return response + + +class ModelProviderModelParameterRuleApi(Resource): + + @setup_required + @login_required + @account_initialization_required + def get(self, provider: str): + parser = reqparse.RequestParser() + parser.add_argument('model', type=str, required=True, nullable=False, location='args') + args = parser.parse_args() + + tenant_id = current_user.current_tenant_id + + model_provider_service = ModelProviderService() + parameter_rules = model_provider_service.get_model_parameter_rules( + tenant_id=tenant_id, + provider=provider, + model=args['model'] + ) + + return jsonable_encoder({ + "data": parameter_rules + }) + + +class ModelProviderAvailableModelApi(Resource): @setup_required @login_required @account_initialization_required def get(self, model_type): - ModelType.value_of(model_type) + tenant_id = current_user.current_tenant_id - provider_service = ProviderService() - valid_models = provider_service.get_valid_model_list( - tenant_id=current_user.current_tenant_id, + model_provider_service = ModelProviderService() + models = model_provider_service.get_models_by_model_type( + tenant_id=tenant_id, model_type=model_type ) - return valid_models + return jsonable_encoder({ + "data": models + }) + +api.add_resource(ModelProviderModelApi, '/workspaces/current/model-providers//models') +api.add_resource(ModelProviderModelCredentialApi, + '/workspaces/current/model-providers//models/credentials') +api.add_resource(ModelProviderModelValidateApi, + '/workspaces/current/model-providers//models/credentials/validate') +api.add_resource(ModelProviderModelParameterRuleApi, + '/workspaces/current/model-providers//models/parameter-rules') +api.add_resource(ModelProviderAvailableModelApi, '/workspaces/current/models/model-types/') api.add_resource(DefaultModelApi, '/workspaces/current/default-model') -api.add_resource(ValidModelApi, '/workspaces/current/models/model-type/') diff --git a/api/controllers/console/workspace/providers.py b/api/controllers/console/workspace/providers.py deleted file mode 100644 index 267fb6975fc260..00000000000000 --- a/api/controllers/console/workspace/providers.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding:utf-8 -*- -from flask_login import current_user -from libs.login import login_required -from flask_restful import Resource, reqparse -from werkzeug.exceptions import Forbidden - -from controllers.console import api -from controllers.console.setup import setup_required -from controllers.console.wraps import account_initialization_required -from core.model_providers.providers.base import CredentialsValidateFailedError -from models.provider import ProviderType -from services.provider_service import ProviderService - - -class ProviderListApi(Resource): - - @setup_required - @login_required - @account_initialization_required - def get(self): - tenant_id = current_user.current_tenant_id - - """ - If the type is AZURE_OPENAI, decode and return the four fields of azure_api_type, azure_api_version:, - azure_api_base, azure_api_key as an object, where azure_api_key displays the first 6 bits in plaintext, and the - rest is replaced by * and the last two bits are displayed in plaintext - - If the type is other, decode and return the Token field directly, the field displays the first 6 bits in - plaintext, the rest is replaced by * and the last two bits are displayed in plaintext - """ - - provider_service = ProviderService() - provider_info_list = provider_service.get_provider_list(tenant_id) - - provider_list = [ - { - 'provider_name': p['provider_name'], - 'provider_type': p['provider_type'], - 'is_valid': p['is_valid'], - 'last_used': p['last_used'], - 'is_enabled': p['is_valid'], - **({ - 'quota_type': p['quota_type'], - 'quota_limit': p['quota_limit'], - 'quota_used': p['quota_used'] - } if p['provider_type'] == ProviderType.SYSTEM.value else {}), - 'token': (p['config'] if p['provider_name'] != 'openai' else p['config']['openai_api_key']) - if p['config'] else None - } - for name, provider_info in provider_info_list.items() - for p in provider_info['providers'] - ] - - return provider_list - - -class ProviderTokenApi(Resource): - - @setup_required - @login_required - @account_initialization_required - def post(self, provider): - # The role of the current user in the ta table must be admin or owner - if current_user.current_tenant.current_role not in ['admin', 'owner']: - raise Forbidden() - - parser = reqparse.RequestParser() - parser.add_argument('token', required=True, nullable=False, location='json') - args = parser.parse_args() - - if provider == 'openai': - args['token'] = { - 'openai_api_key': args['token'] - } - - provider_service = ProviderService() - try: - provider_service.save_custom_provider_config( - tenant_id=current_user.current_tenant_id, - provider_name=provider, - config=args['token'] - ) - except CredentialsValidateFailedError as ex: - raise ValueError(str(ex)) - - return {'result': 'success'}, 201 - - -class ProviderTokenValidateApi(Resource): - - @setup_required - @login_required - @account_initialization_required - def post(self, provider): - parser = reqparse.RequestParser() - parser.add_argument('token', required=True, nullable=False, location='json') - args = parser.parse_args() - - provider_service = ProviderService() - - if provider == 'openai': - args['token'] = { - 'openai_api_key': args['token'] - } - - result = True - error = None - - try: - provider_service.custom_provider_config_validate( - provider_name=provider, - config=args['token'] - ) - except CredentialsValidateFailedError as ex: - result = False - error = str(ex) - - response = {'result': 'success' if result else 'error'} - - if not result: - response['error'] = error - - return response - - -api.add_resource(ProviderTokenApi, '/workspaces/current/providers//token', - endpoint='workspaces_current_providers_token') # PUT for updating provider token -api.add_resource(ProviderTokenValidateApi, '/workspaces/current/providers//token-validate', - endpoint='workspaces_current_providers_token_validate') # POST for validating provider token - -api.add_resource(ProviderListApi, '/workspaces/current/providers') # GET for getting providers list diff --git a/api/controllers/console/workspace/workspace.py b/api/controllers/console/workspace/workspace.py index 2288ae21bd5a1d..de07ab62c717c0 100644 --- a/api/controllers/console/workspace/workspace.py +++ b/api/controllers/console/workspace/workspace.py @@ -34,7 +34,6 @@ 'status': fields.String, 'created_at': TimestampField, 'role': fields.String, - 'providers': fields.List(fields.Nested(provider_fields)), 'in_trial': fields.Boolean, 'trial_end_reason': fields.String, 'custom_config': fields.Raw(attribute='custom_config'), diff --git a/api/controllers/service_api/app/audio.py b/api/controllers/service_api/app/audio.py index 4b03de06379a10..87bdadcdd1bc01 100644 --- a/api/controllers/service_api/app/audio.py +++ b/api/controllers/service_api/app/audio.py @@ -9,8 +9,8 @@ ProviderModelCurrentlyNotSupportError, NoAudioUploadedError, AudioTooLargeError, UnsupportedAudioTypeError, \ ProviderNotSupportSpeechToTextError from controllers.service_api.wraps import AppApiResource -from core.model_providers.error import LLMBadRequestError, LLMAuthorizationError, LLMAPIUnavailableError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from models.model import App, AppModelConfig from services.audio_service import AudioService from services.errors.audio import NoAudioUploadedServiceError, AudioTooLargeServiceError, \ @@ -49,8 +49,7 @@ def post(self, app_model: App, end_user): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e diff --git a/api/controllers/service_api/app/completion.py b/api/controllers/service_api/app/completion.py index 5cd33dcd577ee2..a98b7c7721a3b7 100644 --- a/api/controllers/service_api/app/completion.py +++ b/api/controllers/service_api/app/completion.py @@ -13,9 +13,10 @@ ConversationCompletedError, CompletionRequestError, ProviderQuotaExceededError, \ ProviderModelCurrentlyNotSupportError from controllers.service_api.wraps import AppApiResource -from core.conversation_message_task import PubHandler -from core.model_providers.error import LLMBadRequestError, LLMAuthorizationError, LLMAPIUnavailableError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.application_queue_manager import ApplicationQueueManager +from core.entities.application_entities import InvokeFrom +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from libs.helper import uuid_value from services.completion_service import CompletionService @@ -47,7 +48,7 @@ def post(self, app_model, end_user): app_model=app_model, user=end_user, args=args, - from_source='api', + invoke_from=InvokeFrom.SERVICE_API, streaming=streaming, ) @@ -65,8 +66,7 @@ def post(self, app_model, end_user): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -80,7 +80,7 @@ def post(self, app_model, end_user, task_id): if app_model.mode != 'completion': raise AppUnavailableError() - PubHandler.stop(end_user, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.SERVICE_API, end_user.id) return {'result': 'success'}, 200 @@ -112,7 +112,7 @@ def post(self, app_model, end_user): app_model=app_model, user=end_user, args=args, - from_source='api', + invoke_from=InvokeFrom.SERVICE_API, streaming=streaming ) @@ -130,8 +130,7 @@ def post(self, app_model, end_user): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -145,7 +144,7 @@ def post(self, app_model, end_user, task_id): if app_model.mode != 'chat': raise NotChatAppError() - PubHandler.stop(end_user, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.SERVICE_API, end_user.id) return {'result': 'success'}, 200 @@ -171,8 +170,7 @@ def generate() -> Generator: yield "data: " + json.dumps(api.handle_error(ProviderQuotaExceededError()).get_json()) + "\n\n" except ModelCurrentlyNotSupportError: yield "data: " + json.dumps(api.handle_error(ProviderModelCurrentlyNotSupportError()).get_json()) + "\n\n" - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: yield "data: " + json.dumps(api.handle_error(CompletionRequestError(str(e))).get_json()) + "\n\n" except ValueError as e: yield "data: " + json.dumps(api.handle_error(e).get_json()) + "\n\n" diff --git a/api/controllers/service_api/dataset/dataset.py b/api/controllers/service_api/dataset/dataset.py index 17b659cb1a44d0..813f9295574023 100644 --- a/api/controllers/service_api/dataset/dataset.py +++ b/api/controllers/service_api/dataset/dataset.py @@ -4,11 +4,11 @@ from controllers.service_api import api from controllers.service_api.dataset.error import DatasetNameDuplicateError from controllers.service_api.wraps import DatasetApiResource +from core.model_runtime.entities.model_entities import ModelType +from core.provider_manager import ProviderManager from libs.login import current_user -from core.model_providers.models.entity.model_params import ModelType from fields.dataset_fields import dataset_detail_fields from services.dataset_service import DatasetService -from services.provider_service import ProviderService def _validate_name(name): @@ -27,12 +27,20 @@ def get(self, tenant_id): datasets, total = DatasetService.get_datasets(page, limit, provider, tenant_id, current_user) # check embedding setting - provider_service = ProviderService() - valid_model_list = provider_service.get_valid_model_list(current_user.current_tenant_id, - ModelType.EMBEDDINGS.value) + provider_manager = ProviderManager() + configurations = provider_manager.get_configurations( + tenant_id=current_user.current_tenant_id + ) + + embedding_models = configurations.get_models( + model_type=ModelType.TEXT_EMBEDDING, + only_active=True + ) + model_names = [] - for valid_model in valid_model_list: - model_names.append(f"{valid_model['model_name']}:{valid_model['model_provider']['provider_name']}") + for embedding_model in embedding_models: + model_names.append(f"{embedding_model.model}:{embedding_model.provider.provider}") + data = marshal(datasets, dataset_detail_fields) for item in data: if item['indexing_technique'] == 'high_quality': diff --git a/api/controllers/service_api/dataset/document.py b/api/controllers/service_api/dataset/document.py index 6a4057c1f61629..e851799f75a21d 100644 --- a/api/controllers/service_api/dataset/document.py +++ b/api/controllers/service_api/dataset/document.py @@ -13,7 +13,7 @@ NoFileUploadedError, TooManyFilesError from controllers.service_api.wraps import DatasetApiResource, cloud_edition_billing_resource_check from libs.login import current_user -from core.model_providers.error import ProviderTokenNotInitError +from core.errors.error import ProviderTokenNotInitError from extensions.ext_database import db from fields.document_fields import document_fields, document_status_fields from models.dataset import Dataset, Document, DocumentSegment diff --git a/api/controllers/service_api/dataset/segment.py b/api/controllers/service_api/dataset/segment.py index 2cd6da3d13e3da..9940dba1e132e3 100644 --- a/api/controllers/service_api/dataset/segment.py +++ b/api/controllers/service_api/dataset/segment.py @@ -4,8 +4,9 @@ from controllers.service_api import api from controllers.service_api.app.error import ProviderNotInitializeError from controllers.service_api.wraps import DatasetApiResource, cloud_edition_billing_resource_check -from core.model_providers.error import ProviderTokenNotInitError, LLMBadRequestError -from core.model_providers.model_factory import ModelFactory +from core.errors.error import ProviderTokenNotInitError, LLMBadRequestError +from core.model_manager import ModelManager +from core.model_runtime.entities.model_entities import ModelType from extensions.ext_database import db from fields.segment_fields import segment_fields from models.dataset import Dataset, DocumentSegment @@ -35,10 +36,12 @@ def post(self, tenant_id, dataset_id, document_id): # check embedding model setting if dataset.indexing_technique == 'high_quality': try: - ModelFactory.get_embedding_model( + model_manager = ModelManager() + model_manager.get_model_instance( tenant_id=current_user.current_tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) except LLMBadRequestError: raise ProviderNotInitializeError( @@ -77,10 +80,12 @@ def get(self, tenant_id, dataset_id, document_id): # check embedding model setting if dataset.indexing_technique == 'high_quality': try: - ModelFactory.get_embedding_model( + model_manager = ModelManager() + model_manager.get_model_instance( tenant_id=current_user.current_tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) except LLMBadRequestError: raise ProviderNotInitializeError( @@ -167,10 +172,12 @@ def post(self, tenant_id, dataset_id, document_id, segment_id): if dataset.indexing_technique == 'high_quality': # check embedding model setting try: - ModelFactory.get_embedding_model( + model_manager = ModelManager() + model_manager.get_model_instance( tenant_id=current_user.current_tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) except LLMBadRequestError: raise ProviderNotInitializeError( diff --git a/api/controllers/web/audio.py b/api/controllers/web/audio.py index b3272de1c7a963..e8c2fd335edf9a 100644 --- a/api/controllers/web/audio.py +++ b/api/controllers/web/audio.py @@ -10,8 +10,8 @@ ProviderQuotaExceededError, ProviderModelCurrentlyNotSupportError, NoAudioUploadedError, AudioTooLargeError, \ UnsupportedAudioTypeError, ProviderNotSupportSpeechToTextError from controllers.web.wraps import WebApiResource -from core.model_providers.error import LLMBadRequestError, LLMAPIUnavailableError, LLMAuthorizationError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from services.audio_service import AudioService from services.errors.audio import NoAudioUploadedServiceError, AudioTooLargeServiceError, \ UnsupportedAudioTypeServiceError, ProviderNotSupportSpeechToTextServiceError @@ -51,8 +51,7 @@ def post(self, app_model: App, end_user): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e diff --git a/api/controllers/web/completion.py b/api/controllers/web/completion.py index b49fec5110b21a..01dd3e1ab01416 100644 --- a/api/controllers/web/completion.py +++ b/api/controllers/web/completion.py @@ -13,9 +13,10 @@ ProviderNotInitializeError, NotChatAppError, NotCompletionAppError, CompletionRequestError, \ ProviderQuotaExceededError, ProviderModelCurrentlyNotSupportError from controllers.web.wraps import WebApiResource -from core.conversation_message_task import PubHandler -from core.model_providers.error import LLMBadRequestError, LLMAPIUnavailableError, LLMAuthorizationError, LLMAPIConnectionError, \ - LLMRateLimitError, ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.application_queue_manager import ApplicationQueueManager +from core.entities.application_entities import InvokeFrom +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from libs.helper import uuid_value from services.completion_service import CompletionService @@ -44,7 +45,7 @@ def post(self, app_model, end_user): app_model=app_model, user=end_user, args=args, - from_source='api', + invoke_from=InvokeFrom.WEB_APP, streaming=streaming ) @@ -62,8 +63,7 @@ def post(self, app_model, end_user): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -77,7 +77,7 @@ def post(self, app_model, end_user, task_id): if app_model.mode != 'completion': raise NotCompletionAppError() - PubHandler.stop(end_user, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.WEB_APP, end_user.id) return {'result': 'success'}, 200 @@ -105,7 +105,7 @@ def post(self, app_model, end_user): app_model=app_model, user=end_user, args=args, - from_source='api', + invoke_from=InvokeFrom.WEB_APP, streaming=streaming ) @@ -123,8 +123,7 @@ def post(self, app_model, end_user): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -138,7 +137,7 @@ def post(self, app_model, end_user, task_id): if app_model.mode != 'chat': raise NotChatAppError() - PubHandler.stop(end_user, task_id) + ApplicationQueueManager.set_stop_flag(task_id, InvokeFrom.WEB_APP, end_user.id) return {'result': 'success'}, 200 @@ -164,8 +163,7 @@ def generate() -> Generator: yield "data: " + json.dumps(api.handle_error(ProviderQuotaExceededError()).get_json()) + "\n\n" except ModelCurrentlyNotSupportError: yield "data: " + json.dumps(api.handle_error(ProviderModelCurrentlyNotSupportError()).get_json()) + "\n\n" - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: yield "data: " + json.dumps(api.handle_error(CompletionRequestError(str(e))).get_json()) + "\n\n" except ValueError as e: yield "data: " + json.dumps(api.handle_error(e).get_json()) + "\n\n" diff --git a/api/controllers/web/message.py b/api/controllers/web/message.py index 80b0741c03a4af..d0789ee10af35a 100644 --- a/api/controllers/web/message.py +++ b/api/controllers/web/message.py @@ -14,8 +14,9 @@ AppMoreLikeThisDisabledError, NotCompletionAppError, AppSuggestedQuestionsAfterAnswerDisabledError, \ ProviderQuotaExceededError, ProviderModelCurrentlyNotSupportError from controllers.web.wraps import WebApiResource -from core.model_providers.error import LLMRateLimitError, LLMBadRequestError, LLMAuthorizationError, LLMAPIConnectionError, \ - ProviderTokenNotInitError, LLMAPIUnavailableError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.entities.application_entities import InvokeFrom +from core.errors.error import ProviderTokenNotInitError, QuotaExceededError, ModelCurrentlyNotSupportError +from core.model_runtime.errors.invoke import InvokeError from libs.helper import uuid_value, TimestampField from services.completion_service import CompletionService from services.errors.app import MoreLikeThisDisabledError @@ -117,7 +118,14 @@ def get(self, app_model, end_user, message_id): streaming = args['response_mode'] == 'streaming' try: - response = CompletionService.generate_more_like_this(app_model, end_user, message_id, streaming, 'web_app') + response = CompletionService.generate_more_like_this( + app_model=app_model, + user=end_user, + message_id=message_id, + invoke_from=InvokeFrom.WEB_APP, + streaming=streaming + ) + return compact_response(response) except MessageNotExistsError: raise NotFound("Message Not Exists.") @@ -129,8 +137,7 @@ def get(self, app_model, end_user, message_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except ValueError as e: raise e @@ -157,8 +164,7 @@ def generate() -> Generator: yield "data: " + json.dumps(api.handle_error(ProviderQuotaExceededError()).get_json()) + "\n\n" except ModelCurrentlyNotSupportError: yield "data: " + json.dumps(api.handle_error(ProviderModelCurrentlyNotSupportError()).get_json()) + "\n\n" - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: yield "data: " + json.dumps(api.handle_error(CompletionRequestError(str(e))).get_json()) + "\n\n" except ValueError as e: yield "data: " + json.dumps(api.handle_error(e).get_json()) + "\n\n" @@ -195,8 +201,7 @@ def get(self, app_model, end_user, message_id): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() - except (LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, - LLMRateLimitError, LLMAuthorizationError) as e: + except InvokeError as e: raise CompletionRequestError(str(e)) except Exception: logging.exception("internal server error.") diff --git a/api/core/agent/agent/agent_llm_callback.py b/api/core/agent/agent/agent_llm_callback.py new file mode 100644 index 00000000000000..04b9bab141aff6 --- /dev/null +++ b/api/core/agent/agent/agent_llm_callback.py @@ -0,0 +1,101 @@ +import logging +from typing import Optional, List + +from core.callback_handler.agent_loop_gather_callback_handler import AgentLoopGatherCallbackHandler +from core.model_runtime.callbacks.base_callback import Callback +from core.model_runtime.entities.llm_entities import LLMResultChunk, LLMResult +from core.model_runtime.entities.message_entities import PromptMessageTool, PromptMessage +from core.model_runtime.model_providers.__base.ai_model import AIModel + +logger = logging.getLogger(__name__) + + +class AgentLLMCallback(Callback): + + def __init__(self, agent_callback: AgentLoopGatherCallbackHandler) -> None: + self.agent_callback = agent_callback + + def on_before_invoke(self, llm_instance: AIModel, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + Before invoke callback + + :param llm_instance: LLM instance + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + self.agent_callback.on_llm_before_invoke( + prompt_messages=prompt_messages + ) + + def on_new_chunk(self, llm_instance: AIModel, chunk: LLMResultChunk, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None): + """ + On new chunk callback + + :param llm_instance: LLM instance + :param chunk: chunk + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + pass + + def on_after_invoke(self, llm_instance: AIModel, result: LLMResult, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + After invoke callback + + :param llm_instance: LLM instance + :param result: result + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + self.agent_callback.on_llm_after_invoke( + result=result + ) + + def on_invoke_error(self, llm_instance: AIModel, ex: Exception, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + Invoke error callback + + :param llm_instance: LLM instance + :param ex: exception + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + self.agent_callback.on_llm_error( + error=ex + ) diff --git a/api/core/agent/agent/calc_token_mixin.py b/api/core/agent/agent/calc_token_mixin.py index 97d2b7740f2ee9..d8cdf9fe2bbcf9 100644 --- a/api/core/agent/agent/calc_token_mixin.py +++ b/api/core/agent/agent/calc_token_mixin.py @@ -1,28 +1,49 @@ -from typing import List +from typing import List, cast from langchain.schema import BaseMessage -from core.model_providers.models.entity.message import to_prompt_messages -from core.model_providers.models.llm.base import BaseLLM +from core.entities.application_entities import ModelConfigEntity +from core.entities.message_entities import lc_messages_to_prompt_messages +from core.model_runtime.entities.message_entities import PromptMessage +from core.model_runtime.entities.model_entities import ModelPropertyKey +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel class CalcTokenMixin: - def get_num_tokens_from_messages(self, model_instance: BaseLLM, messages: List[BaseMessage], **kwargs) -> int: - return model_instance.get_num_tokens(to_prompt_messages(messages)) - - def get_message_rest_tokens(self, model_instance: BaseLLM, messages: List[BaseMessage], **kwargs) -> int: + def get_message_rest_tokens(self, model_config: ModelConfigEntity, messages: List[PromptMessage], **kwargs) -> int: """ Got the rest tokens available for the model after excluding messages tokens and completion max tokens - :param llm: + :param model_config: :param messages: :return: """ - llm_max_tokens = model_instance.model_rules.max_tokens.max - completion_max_tokens = model_instance.model_kwargs.max_tokens - used_tokens = self.get_num_tokens_from_messages(model_instance, messages, **kwargs) - rest_tokens = llm_max_tokens - completion_max_tokens - used_tokens + model_type_instance = model_config.provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + model_context_tokens = model_config.model_schema.model_properties.get(ModelPropertyKey.CONTEXT_SIZE) + + max_tokens = 0 + for parameter_rule in model_config.model_schema.parameter_rules: + if (parameter_rule.name == 'max_tokens' + or (parameter_rule.use_template and parameter_rule.use_template == 'max_tokens')): + max_tokens = (model_config.parameters.get(parameter_rule.name) + or model_config.parameters.get(parameter_rule.use_template)) or 0 + + if model_context_tokens is None: + return 0 + + if max_tokens is None: + max_tokens = 0 + + prompt_tokens = model_type_instance.get_num_tokens( + model_config.model, + model_config.credentials, + messages + ) + + rest_tokens = model_context_tokens - max_tokens - prompt_tokens return rest_tokens diff --git a/api/core/agent/agent/multi_dataset_router_agent.py b/api/core/agent/agent/multi_dataset_router_agent.py index 4fb71211270df1..9b622a8689cc3a 100644 --- a/api/core/agent/agent/multi_dataset_router_agent.py +++ b/api/core/agent/agent/multi_dataset_router_agent.py @@ -1,4 +1,3 @@ -import json from typing import Tuple, List, Any, Union, Sequence, Optional, cast from langchain.agents import OpenAIFunctionsAgent, BaseSingleActionAgent @@ -6,13 +5,14 @@ from langchain.callbacks.base import BaseCallbackManager from langchain.callbacks.manager import Callbacks from langchain.prompts.chat import BaseMessagePromptTemplate -from langchain.schema import AgentAction, AgentFinish, SystemMessage, Generation, LLMResult, AIMessage -from langchain.schema.language_model import BaseLanguageModel +from langchain.schema import AgentAction, AgentFinish, SystemMessage, AIMessage from langchain.tools import BaseTool from pydantic import root_validator -from core.model_providers.models.entity.message import to_prompt_messages -from core.model_providers.models.llm.base import BaseLLM +from core.entities.application_entities import ModelConfigEntity +from core.model_manager import ModelInstance +from core.entities.message_entities import lc_messages_to_prompt_messages +from core.model_runtime.entities.message_entities import PromptMessageTool from core.third_party.langchain.llms.fake import FakeLLM @@ -20,7 +20,7 @@ class MultiDatasetRouterAgent(OpenAIFunctionsAgent): """ An Multi Dataset Retrieve Agent driven by Router. """ - model_instance: BaseLLM + model_config: ModelConfigEntity class Config: """Configuration for this pydantic object.""" @@ -81,8 +81,7 @@ def plan( agent_decision.return_values['output'] = '' return agent_decision except Exception as e: - new_exception = self.model_instance.handle_exceptions(e) - raise new_exception + raise e def real_plan( self, @@ -106,16 +105,39 @@ def real_plan( full_inputs = dict(**selected_inputs, agent_scratchpad=agent_scratchpad) prompt = self.prompt.format_prompt(**full_inputs) messages = prompt.to_messages() - prompt_messages = to_prompt_messages(messages) - result = self.model_instance.run( - messages=prompt_messages, - functions=self.functions, + prompt_messages = lc_messages_to_prompt_messages(messages) + + model_instance = ModelInstance( + provider_model_bundle=self.model_config.provider_model_bundle, + model=self.model_config.model, + ) + + tools = [] + for function in self.functions: + tool = PromptMessageTool( + **function + ) + + tools.append(tool) + + result = model_instance.invoke_llm( + prompt_messages=prompt_messages, + tools=tools, + stream=False, + model_parameters={ + 'temperature': 0.2, + 'top_p': 0.3, + 'max_tokens': 1500 + } ) ai_message = AIMessage( - content=result.content, + content=result.message.content or "", additional_kwargs={ - 'function_call': result.function_call + 'function_call': { + 'id': result.message.tool_calls[0].id, + **result.message.tool_calls[0].function.dict() + } if result.message.tool_calls else None } ) @@ -133,7 +155,7 @@ async def aplan( @classmethod def from_llm_and_tools( cls, - model_instance: BaseLLM, + model_config: ModelConfigEntity, tools: Sequence[BaseTool], callback_manager: Optional[BaseCallbackManager] = None, extra_prompt_messages: Optional[List[BaseMessagePromptTemplate]] = None, @@ -147,7 +169,7 @@ def from_llm_and_tools( system_message=system_message, ) return cls( - model_instance=model_instance, + model_config=model_config, llm=FakeLLM(response=''), prompt=prompt, tools=tools, diff --git a/api/core/agent/agent/openai_function_call.py b/api/core/agent/agent/openai_function_call.py index 8931bdc216a6a0..181208eb6a457f 100644 --- a/api/core/agent/agent/openai_function_call.py +++ b/api/core/agent/agent/openai_function_call.py @@ -1,4 +1,4 @@ -from typing import List, Tuple, Any, Union, Sequence, Optional +from typing import List, Tuple, Any, Union, Sequence, Optional, cast from langchain.agents import OpenAIFunctionsAgent, BaseSingleActionAgent from langchain.agents.openai_functions_agent.base import _parse_ai_message, \ @@ -13,18 +13,23 @@ from langchain.tools import BaseTool from pydantic import root_validator +from core.agent.agent.agent_llm_callback import AgentLLMCallback from core.agent.agent.calc_token_mixin import ExceededLLMTokensLimitError, CalcTokenMixin from core.chain.llm_chain import LLMChain -from core.model_providers.models.entity.message import to_prompt_messages -from core.model_providers.models.llm.base import BaseLLM +from core.entities.application_entities import ModelConfigEntity +from core.model_manager import ModelInstance +from core.entities.message_entities import lc_messages_to_prompt_messages +from core.model_runtime.entities.message_entities import PromptMessageTool, PromptMessage +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel from core.third_party.langchain.llms.fake import FakeLLM class AutoSummarizingOpenAIFunctionCallAgent(OpenAIFunctionsAgent, CalcTokenMixin): moving_summary_buffer: str = "" moving_summary_index: int = 0 - summary_model_instance: BaseLLM = None - model_instance: BaseLLM + summary_model_config: ModelConfigEntity = None + model_config: ModelConfigEntity + agent_llm_callback: Optional[AgentLLMCallback] = None class Config: """Configuration for this pydantic object.""" @@ -38,13 +43,14 @@ def validate_llm(cls, values: dict) -> dict: @classmethod def from_llm_and_tools( cls, - model_instance: BaseLLM, + model_config: ModelConfigEntity, tools: Sequence[BaseTool], callback_manager: Optional[BaseCallbackManager] = None, extra_prompt_messages: Optional[List[BaseMessagePromptTemplate]] = None, system_message: Optional[SystemMessage] = SystemMessage( content="You are a helpful AI assistant." ), + agent_llm_callback: Optional[AgentLLMCallback] = None, **kwargs: Any, ) -> BaseSingleActionAgent: prompt = cls.create_prompt( @@ -52,11 +58,12 @@ def from_llm_and_tools( system_message=system_message, ) return cls( - model_instance=model_instance, + model_config=model_config, llm=FakeLLM(response=''), prompt=prompt, tools=tools, callback_manager=callback_manager, + agent_llm_callback=agent_llm_callback, **kwargs, ) @@ -67,28 +74,49 @@ def should_use_agent(self, query: str): :param query: :return: """ - original_max_tokens = self.model_instance.model_kwargs.max_tokens - self.model_instance.model_kwargs.max_tokens = 40 + original_max_tokens = 0 + for parameter_rule in self.model_config.model_schema.parameter_rules: + if (parameter_rule.name == 'max_tokens' + or (parameter_rule.use_template and parameter_rule.use_template == 'max_tokens')): + original_max_tokens = (self.model_config.parameters.get(parameter_rule.name) + or self.model_config.parameters.get(parameter_rule.use_template)) or 0 + + self.model_config.parameters['max_tokens'] = 40 prompt = self.prompt.format_prompt(input=query, agent_scratchpad=[]) messages = prompt.to_messages() try: - prompt_messages = to_prompt_messages(messages) - result = self.model_instance.run( - messages=prompt_messages, - functions=self.functions, - callbacks=None + prompt_messages = lc_messages_to_prompt_messages(messages) + model_instance = ModelInstance( + provider_model_bundle=self.model_config.provider_model_bundle, + model=self.model_config.model, ) - except Exception as e: - new_exception = self.model_instance.handle_exceptions(e) - raise new_exception - function_call = result.function_call + tools = [] + for function in self.functions: + tool = PromptMessageTool( + **function + ) + + tools.append(tool) + + result = model_instance.invoke_llm( + prompt_messages=prompt_messages, + tools=tools, + stream=False, + model_parameters={ + 'temperature': 0.2, + 'top_p': 0.3, + 'max_tokens': 1500 + } + ) + except Exception as e: + raise e - self.model_instance.model_kwargs.max_tokens = original_max_tokens + self.model_config.parameters['max_tokens'] = original_max_tokens - return True if function_call else False + return True if result.message.tool_calls else False def plan( self, @@ -113,22 +141,46 @@ def plan( prompt = self.prompt.format_prompt(**full_inputs) messages = prompt.to_messages() + prompt_messages = lc_messages_to_prompt_messages(messages) + # summarize messages if rest_tokens < 0 try: - messages = self.summarize_messages_if_needed(messages, functions=self.functions) + prompt_messages = self.summarize_messages_if_needed(prompt_messages, functions=self.functions) except ExceededLLMTokensLimitError as e: return AgentFinish(return_values={"output": str(e)}, log=str(e)) - prompt_messages = to_prompt_messages(messages) - result = self.model_instance.run( - messages=prompt_messages, - functions=self.functions, + model_instance = ModelInstance( + provider_model_bundle=self.model_config.provider_model_bundle, + model=self.model_config.model, + ) + + tools = [] + for function in self.functions: + tool = PromptMessageTool( + **function + ) + + tools.append(tool) + + result = model_instance.invoke_llm( + prompt_messages=prompt_messages, + tools=tools, + stream=False, + callbacks=[self.agent_llm_callback] if self.agent_llm_callback else [], + model_parameters={ + 'temperature': 0.2, + 'top_p': 0.3, + 'max_tokens': 1500 + } ) ai_message = AIMessage( - content=result.content, + content=result.message.content or "", additional_kwargs={ - 'function_call': result.function_call + 'function_call': { + 'id': result.message.tool_calls[0].id, + **result.message.tool_calls[0].function.dict() + } if result.message.tool_calls else None } ) agent_decision = _parse_ai_message(ai_message) @@ -158,9 +210,14 @@ def return_stopped_response( except ValueError: return AgentFinish({"output": "I'm sorry, I don't know how to respond to that."}, "") - def summarize_messages_if_needed(self, messages: List[BaseMessage], **kwargs) -> List[BaseMessage]: + def summarize_messages_if_needed(self, messages: List[PromptMessage], **kwargs) -> List[PromptMessage]: # calculate rest tokens and summarize previous function observation messages if rest_tokens < 0 - rest_tokens = self.get_message_rest_tokens(self.model_instance, messages, **kwargs) + rest_tokens = self.get_message_rest_tokens( + self.model_config, + messages, + **kwargs + ) + rest_tokens = rest_tokens - 20 # to deal with the inaccuracy of rest_tokens if rest_tokens >= 0: return messages @@ -210,19 +267,19 @@ def predict_new_summary( ai_prefix="AI", ) - chain = LLMChain(model_instance=self.summary_model_instance, prompt=SUMMARY_PROMPT) + chain = LLMChain(model_config=self.summary_model_config, prompt=SUMMARY_PROMPT) return chain.predict(summary=existing_summary, new_lines=new_lines) - def get_num_tokens_from_messages(self, model_instance: BaseLLM, messages: List[BaseMessage], **kwargs) -> int: + def get_num_tokens_from_messages(self, model_config: ModelConfigEntity, messages: List[BaseMessage], **kwargs) -> int: """Calculate num tokens for gpt-3.5-turbo and gpt-4 with tiktoken package. Official documentation: https://github.com/openai/openai-cookbook/blob/ main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb""" - if model_instance.model_provider.provider_name == 'azure_openai': - model = model_instance.base_model_name + if model_config.provider == 'azure_openai': + model = model_config.model model = model.replace("gpt-35", "gpt-3.5") else: - model = model_instance.base_model_name + model = model_config.credentials.get("base_model_name") tiktoken_ = _import_tiktoken() try: diff --git a/api/core/agent/agent/output_parser/retirver_dataset_agent.py b/api/core/agent/agent/output_parser/retirver_dataset_agent.py deleted file mode 100644 index 16b4a2ab248786..00000000000000 --- a/api/core/agent/agent/output_parser/retirver_dataset_agent.py +++ /dev/null @@ -1,158 +0,0 @@ -import json -from typing import Tuple, List, Any, Union, Sequence, Optional, cast - -from langchain.agents import OpenAIFunctionsAgent, BaseSingleActionAgent -from langchain.agents.openai_functions_agent.base import _format_intermediate_steps, _parse_ai_message -from langchain.callbacks.base import BaseCallbackManager -from langchain.callbacks.manager import Callbacks -from langchain.prompts.chat import BaseMessagePromptTemplate -from langchain.schema import AgentAction, AgentFinish, SystemMessage, Generation, LLMResult, AIMessage -from langchain.schema.language_model import BaseLanguageModel -from langchain.tools import BaseTool -from pydantic import root_validator - -from core.model_providers.models.entity.message import to_prompt_messages -from core.model_providers.models.llm.base import BaseLLM -from core.third_party.langchain.llms.fake import FakeLLM -from core.tool.dataset_retriever_tool import DatasetRetrieverTool - - -class MultiDatasetRouterAgent(OpenAIFunctionsAgent): - """ - An Multi Dataset Retrieve Agent driven by Router. - """ - model_instance: BaseLLM - - class Config: - """Configuration for this pydantic object.""" - - arbitrary_types_allowed = True - - @root_validator - def validate_llm(cls, values: dict) -> dict: - return values - - def should_use_agent(self, query: str): - """ - return should use agent - - :param query: - :return: - """ - return True - - def plan( - self, - intermediate_steps: List[Tuple[AgentAction, str]], - callbacks: Callbacks = None, - **kwargs: Any, - ) -> Union[AgentAction, AgentFinish]: - """Given input, decided what to do. - - Args: - intermediate_steps: Steps the LLM has taken to date, along with observations - **kwargs: User inputs. - - Returns: - Action specifying what tool to use. - """ - if len(self.tools) == 0: - return AgentFinish(return_values={"output": ''}, log='') - elif len(self.tools) == 1: - tool = next(iter(self.tools)) - tool = cast(DatasetRetrieverTool, tool) - rst = tool.run(tool_input={'query': kwargs['input']}) - # output = '' - # rst_json = json.loads(rst) - # for item in rst_json: - # output += f'{item["content"]}\n' - return AgentFinish(return_values={"output": rst}, log=rst) - - if intermediate_steps: - _, observation = intermediate_steps[-1] - return AgentFinish(return_values={"output": observation}, log=observation) - - try: - agent_decision = self.real_plan(intermediate_steps, callbacks, **kwargs) - if isinstance(agent_decision, AgentAction): - tool_inputs = agent_decision.tool_input - if isinstance(tool_inputs, dict) and 'query' in tool_inputs and 'chat_history' not in kwargs: - tool_inputs['query'] = kwargs['input'] - agent_decision.tool_input = tool_inputs - else: - agent_decision.return_values['output'] = '' - return agent_decision - except Exception as e: - new_exception = self.model_instance.handle_exceptions(e) - raise new_exception - - def real_plan( - self, - intermediate_steps: List[Tuple[AgentAction, str]], - callbacks: Callbacks = None, - **kwargs: Any, - ) -> Union[AgentAction, AgentFinish]: - """Given input, decided what to do. - - Args: - intermediate_steps: Steps the LLM has taken to date, along with observations - **kwargs: User inputs. - - Returns: - Action specifying what tool to use. - """ - agent_scratchpad = _format_intermediate_steps(intermediate_steps) - selected_inputs = { - k: kwargs[k] for k in self.prompt.input_variables if k != "agent_scratchpad" - } - full_inputs = dict(**selected_inputs, agent_scratchpad=agent_scratchpad) - prompt = self.prompt.format_prompt(**full_inputs) - messages = prompt.to_messages() - prompt_messages = to_prompt_messages(messages) - result = self.model_instance.run( - messages=prompt_messages, - functions=self.functions, - ) - - ai_message = AIMessage( - content=result.content, - additional_kwargs={ - 'function_call': result.function_call - } - ) - - agent_decision = _parse_ai_message(ai_message) - return agent_decision - - async def aplan( - self, - intermediate_steps: List[Tuple[AgentAction, str]], - callbacks: Callbacks = None, - **kwargs: Any, - ) -> Union[AgentAction, AgentFinish]: - raise NotImplementedError() - - @classmethod - def from_llm_and_tools( - cls, - model_instance: BaseLLM, - tools: Sequence[BaseTool], - callback_manager: Optional[BaseCallbackManager] = None, - extra_prompt_messages: Optional[List[BaseMessagePromptTemplate]] = None, - system_message: Optional[SystemMessage] = SystemMessage( - content="You are a helpful AI assistant." - ), - **kwargs: Any, - ) -> BaseSingleActionAgent: - prompt = cls.create_prompt( - extra_prompt_messages=extra_prompt_messages, - system_message=system_message, - ) - return cls( - model_instance=model_instance, - llm=FakeLLM(response=''), - prompt=prompt, - tools=tools, - callback_manager=callback_manager, - **kwargs, - ) diff --git a/api/core/agent/agent/structed_multi_dataset_router_agent.py b/api/core/agent/agent/structed_multi_dataset_router_agent.py index 115ed69d17879d..bc35ef0371e29b 100644 --- a/api/core/agent/agent/structed_multi_dataset_router_agent.py +++ b/api/core/agent/agent/structed_multi_dataset_router_agent.py @@ -12,9 +12,7 @@ from langchain.agents.structured_chat.prompt import PREFIX, SUFFIX from core.chain.llm_chain import LLMChain -from core.model_providers.models.entity.model_params import ModelMode -from core.model_providers.models.llm.base import BaseLLM -from core.tool.dataset_retriever_tool import DatasetRetrieverTool +from core.entities.application_entities import ModelConfigEntity FORMAT_INSTRUCTIONS = """Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). The nouns in the format of "Thought", "Action", "Action Input", "Final Answer" must be expressed in English. @@ -69,10 +67,10 @@ def should_use_agent(self, query: str): return True def plan( - self, - intermediate_steps: List[Tuple[AgentAction, str]], - callbacks: Callbacks = None, - **kwargs: Any, + self, + intermediate_steps: List[Tuple[AgentAction, str]], + callbacks: Callbacks = None, + **kwargs: Any, ) -> Union[AgentAction, AgentFinish]: """Given input, decided what to do. @@ -101,8 +99,7 @@ def plan( try: full_output = self.llm_chain.predict(callbacks=callbacks, **full_inputs) except Exception as e: - new_exception = self.llm_chain.model_instance.handle_exceptions(e) - raise new_exception + raise e try: agent_decision = self.output_parser.parse(full_output) @@ -119,6 +116,7 @@ def plan( except OutputParserException: return AgentFinish({"output": "I'm sorry, the answer of model is invalid, " "I don't know how to respond to that."}, "") + @classmethod def create_prompt( cls, @@ -182,7 +180,7 @@ def create_completion_prompt( return PromptTemplate(template=template, input_variables=input_variables) def _construct_scratchpad( - self, intermediate_steps: List[Tuple[AgentAction, str]] + self, intermediate_steps: List[Tuple[AgentAction, str]] ) -> str: agent_scratchpad = "" for action, observation in intermediate_steps: @@ -193,7 +191,7 @@ def _construct_scratchpad( raise ValueError("agent_scratchpad should be of type string.") if agent_scratchpad: llm_chain = cast(LLMChain, self.llm_chain) - if llm_chain.model_instance.model_mode == ModelMode.CHAT: + if llm_chain.model_config.mode == "chat": return ( f"This was your previous work " f"(but I haven't seen any of it! I only see what " @@ -207,7 +205,7 @@ def _construct_scratchpad( @classmethod def from_llm_and_tools( cls, - model_instance: BaseLLM, + model_config: ModelConfigEntity, tools: Sequence[BaseTool], callback_manager: Optional[BaseCallbackManager] = None, output_parser: Optional[AgentOutputParser] = None, @@ -221,7 +219,7 @@ def from_llm_and_tools( ) -> Agent: """Construct an agent from an LLM and tools.""" cls._validate_tools(tools) - if model_instance.model_mode == ModelMode.CHAT: + if model_config.mode == "chat": prompt = cls.create_prompt( tools, prefix=prefix, @@ -238,10 +236,16 @@ def from_llm_and_tools( format_instructions=format_instructions, input_variables=input_variables ) + llm_chain = LLMChain( - model_instance=model_instance, + model_config=model_config, prompt=prompt, callback_manager=callback_manager, + parameters={ + 'temperature': 0.2, + 'top_p': 0.3, + 'max_tokens': 1500 + } ) tool_names = [tool.name for tool in tools] _output_parser = output_parser diff --git a/api/core/agent/agent/structured_chat.py b/api/core/agent/agent/structured_chat.py index aca6de79b08106..bbce1ca4402cb6 100644 --- a/api/core/agent/agent/structured_chat.py +++ b/api/core/agent/agent/structured_chat.py @@ -13,10 +13,11 @@ from langchain.tools import BaseTool from langchain.agents.structured_chat.prompt import PREFIX, SUFFIX +from core.agent.agent.agent_llm_callback import AgentLLMCallback from core.agent.agent.calc_token_mixin import CalcTokenMixin, ExceededLLMTokensLimitError from core.chain.llm_chain import LLMChain -from core.model_providers.models.entity.model_params import ModelMode -from core.model_providers.models.llm.base import BaseLLM +from core.entities.application_entities import ModelConfigEntity +from core.entities.message_entities import lc_messages_to_prompt_messages FORMAT_INSTRUCTIONS = """Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). The nouns in the format of "Thought", "Action", "Action Input", "Final Answer" must be expressed in English. @@ -54,7 +55,7 @@ class AutoSummarizingStructuredChatAgent(StructuredChatAgent, CalcTokenMixin): moving_summary_buffer: str = "" moving_summary_index: int = 0 - summary_model_instance: BaseLLM = None + summary_model_config: ModelConfigEntity = None class Config: """Configuration for this pydantic object.""" @@ -82,7 +83,7 @@ def plan( Args: intermediate_steps: Steps the LLM has taken to date, - along with observations + along with observatons callbacks: Callbacks to run. **kwargs: User inputs. @@ -96,15 +97,16 @@ def plan( if prompts: messages = prompts[0].to_messages() - rest_tokens = self.get_message_rest_tokens(self.llm_chain.model_instance, messages) + prompt_messages = lc_messages_to_prompt_messages(messages) + + rest_tokens = self.get_message_rest_tokens(self.llm_chain.model_config, prompt_messages) if rest_tokens < 0: full_inputs = self.summarize_messages(intermediate_steps, **kwargs) try: full_output = self.llm_chain.predict(callbacks=callbacks, **full_inputs) except Exception as e: - new_exception = self.llm_chain.model_instance.handle_exceptions(e) - raise new_exception + raise e try: agent_decision = self.output_parser.parse(full_output) @@ -119,7 +121,7 @@ def plan( "I don't know how to respond to that."}, "") def summarize_messages(self, intermediate_steps: List[Tuple[AgentAction, str]], **kwargs): - if len(intermediate_steps) >= 2 and self.summary_model_instance: + if len(intermediate_steps) >= 2 and self.summary_model_config: should_summary_intermediate_steps = intermediate_steps[self.moving_summary_index:-1] should_summary_messages = [AIMessage(content=observation) for _, observation in should_summary_intermediate_steps] @@ -153,7 +155,7 @@ def predict_new_summary( ai_prefix="AI", ) - chain = LLMChain(model_instance=self.summary_model_instance, prompt=SUMMARY_PROMPT) + chain = LLMChain(model_config=self.summary_model_config, prompt=SUMMARY_PROMPT) return chain.predict(summary=existing_summary, new_lines=new_lines) @classmethod @@ -229,7 +231,7 @@ def _construct_scratchpad( raise ValueError("agent_scratchpad should be of type string.") if agent_scratchpad: llm_chain = cast(LLMChain, self.llm_chain) - if llm_chain.model_instance.model_mode == ModelMode.CHAT: + if llm_chain.model_config.mode == "chat": return ( f"This was your previous work " f"(but I haven't seen any of it! I only see what " @@ -243,7 +245,7 @@ def _construct_scratchpad( @classmethod def from_llm_and_tools( cls, - model_instance: BaseLLM, + model_config: ModelConfigEntity, tools: Sequence[BaseTool], callback_manager: Optional[BaseCallbackManager] = None, output_parser: Optional[AgentOutputParser] = None, @@ -253,11 +255,12 @@ def from_llm_and_tools( format_instructions: str = FORMAT_INSTRUCTIONS, input_variables: Optional[List[str]] = None, memory_prompts: Optional[List[BasePromptTemplate]] = None, + agent_llm_callback: Optional[AgentLLMCallback] = None, **kwargs: Any, ) -> Agent: """Construct an agent from an LLM and tools.""" cls._validate_tools(tools) - if model_instance.model_mode == ModelMode.CHAT: + if model_config.mode == "chat": prompt = cls.create_prompt( tools, prefix=prefix, @@ -275,9 +278,15 @@ def from_llm_and_tools( input_variables=input_variables, ) llm_chain = LLMChain( - model_instance=model_instance, + model_config=model_config, prompt=prompt, callback_manager=callback_manager, + agent_llm_callback=agent_llm_callback, + parameters={ + 'temperature': 0.2, + 'top_p': 0.3, + 'max_tokens': 1500 + } ) tool_names = [tool.name for tool in tools] _output_parser = output_parser diff --git a/api/core/agent/agent_executor.py b/api/core/agent/agent_executor.py index 40200c60e44dcc..52cc424ffbf471 100644 --- a/api/core/agent/agent_executor.py +++ b/api/core/agent/agent_executor.py @@ -4,10 +4,10 @@ from langchain.agents import BaseSingleActionAgent, BaseMultiActionAgent from langchain.callbacks.manager import Callbacks -from langchain.memory.chat_memory import BaseChatMemory from langchain.tools import BaseTool from pydantic import BaseModel, Extra +from core.agent.agent.agent_llm_callback import AgentLLMCallback from core.agent.agent.multi_dataset_router_agent import MultiDatasetRouterAgent from core.agent.agent.openai_function_call import AutoSummarizingOpenAIFunctionCallAgent from core.agent.agent.output_parser.structured_chat import StructuredChatOutputParser @@ -15,9 +15,11 @@ from core.agent.agent.structured_chat import AutoSummarizingStructuredChatAgent from langchain.agents import AgentExecutor as LCAgentExecutor +from core.entities.application_entities import ModelConfigEntity +from core.entities.message_entities import prompt_messages_to_lc_messages from core.helper import moderation -from core.model_providers.error import LLMError -from core.model_providers.models.llm.base import BaseLLM +from core.memory.token_buffer_memory import TokenBufferMemory +from core.model_runtime.errors.invoke import InvokeError from core.tool.dataset_multi_retriever_tool import DatasetMultiRetrieverTool from core.tool.dataset_retriever_tool import DatasetRetrieverTool @@ -31,14 +33,15 @@ class PlanningStrategy(str, enum.Enum): class AgentConfiguration(BaseModel): strategy: PlanningStrategy - model_instance: BaseLLM + model_config: ModelConfigEntity tools: list[BaseTool] - summary_model_instance: BaseLLM = None - memory: Optional[BaseChatMemory] = None + summary_model_config: Optional[ModelConfigEntity] = None + memory: Optional[TokenBufferMemory] = None callbacks: Callbacks = None max_iterations: int = 6 max_execution_time: Optional[float] = None early_stopping_method: str = "generate" + agent_llm_callback: Optional[AgentLLMCallback] = None # `generate` will continue to complete the last inference after reaching the iteration limit or request time limit class Config: @@ -62,34 +65,42 @@ def __init__(self, configuration: AgentConfiguration): def _init_agent(self) -> Union[BaseSingleActionAgent, BaseMultiActionAgent]: if self.configuration.strategy == PlanningStrategy.REACT: agent = AutoSummarizingStructuredChatAgent.from_llm_and_tools( - model_instance=self.configuration.model_instance, + model_config=self.configuration.model_config, tools=self.configuration.tools, output_parser=StructuredChatOutputParser(), - summary_model_instance=self.configuration.summary_model_instance - if self.configuration.summary_model_instance else None, + summary_model_config=self.configuration.summary_model_config + if self.configuration.summary_model_config else None, + agent_llm_callback=self.configuration.agent_llm_callback, verbose=True ) elif self.configuration.strategy == PlanningStrategy.FUNCTION_CALL: agent = AutoSummarizingOpenAIFunctionCallAgent.from_llm_and_tools( - model_instance=self.configuration.model_instance, + model_config=self.configuration.model_config, tools=self.configuration.tools, - extra_prompt_messages=self.configuration.memory.buffer if self.configuration.memory else None, # used for read chat histories memory - summary_model_instance=self.configuration.summary_model_instance - if self.configuration.summary_model_instance else None, + extra_prompt_messages=prompt_messages_to_lc_messages(self.configuration.memory.get_history_prompt_messages()) + if self.configuration.memory else None, # used for read chat histories memory + summary_model_config=self.configuration.summary_model_config + if self.configuration.summary_model_config else None, + agent_llm_callback=self.configuration.agent_llm_callback, verbose=True ) elif self.configuration.strategy == PlanningStrategy.ROUTER: - self.configuration.tools = [t for t in self.configuration.tools if isinstance(t, DatasetRetrieverTool) or isinstance(t, DatasetMultiRetrieverTool)] + self.configuration.tools = [t for t in self.configuration.tools + if isinstance(t, DatasetRetrieverTool) + or isinstance(t, DatasetMultiRetrieverTool)] agent = MultiDatasetRouterAgent.from_llm_and_tools( - model_instance=self.configuration.model_instance, + model_config=self.configuration.model_config, tools=self.configuration.tools, - extra_prompt_messages=self.configuration.memory.buffer if self.configuration.memory else None, + extra_prompt_messages=prompt_messages_to_lc_messages(self.configuration.memory.get_history_prompt_messages()) + if self.configuration.memory else None, verbose=True ) elif self.configuration.strategy == PlanningStrategy.REACT_ROUTER: - self.configuration.tools = [t for t in self.configuration.tools if isinstance(t, DatasetRetrieverTool) or isinstance(t, DatasetMultiRetrieverTool)] + self.configuration.tools = [t for t in self.configuration.tools + if isinstance(t, DatasetRetrieverTool) + or isinstance(t, DatasetMultiRetrieverTool)] agent = StructuredMultiDatasetRouterAgent.from_llm_and_tools( - model_instance=self.configuration.model_instance, + model_config=self.configuration.model_config, tools=self.configuration.tools, output_parser=StructuredChatOutputParser(), verbose=True @@ -104,11 +115,11 @@ def should_use_agent(self, query: str) -> bool: def run(self, query: str) -> AgentExecuteResult: moderation_result = moderation.check_moderation( - self.configuration.model_instance.model_provider, + self.configuration.model_config, query ) - if not moderation_result: + if moderation_result: return AgentExecuteResult( output="I apologize for any confusion, but I'm an AI assistant to be helpful, harmless, and honest.", strategy=self.configuration.strategy, @@ -118,7 +129,6 @@ def run(self, query: str) -> AgentExecuteResult: agent_executor = LCAgentExecutor.from_agent_and_tools( agent=self.agent, tools=self.configuration.tools, - memory=self.configuration.memory, max_iterations=self.configuration.max_iterations, max_execution_time=self.configuration.max_execution_time, early_stopping_method=self.configuration.early_stopping_method, @@ -126,8 +136,8 @@ def run(self, query: str) -> AgentExecuteResult: ) try: - output = agent_executor.run(query) - except LLMError as ex: + output = agent_executor.run(input=query) + except InvokeError as ex: raise ex except Exception as ex: logging.exception("agent_executor run failed") diff --git a/api/core/model_providers/models/__init__.py b/api/core/app_runner/__init__.py similarity index 100% rename from api/core/model_providers/models/__init__.py rename to api/core/app_runner/__init__.py diff --git a/api/core/app_runner/agent_app_runner.py b/api/core/app_runner/agent_app_runner.py new file mode 100644 index 00000000000000..02bdae900dedba --- /dev/null +++ b/api/core/app_runner/agent_app_runner.py @@ -0,0 +1,251 @@ +import json +import logging +from typing import cast + +from core.agent.agent.agent_llm_callback import AgentLLMCallback +from core.app_runner.app_runner import AppRunner +from core.callback_handler.agent_loop_gather_callback_handler import AgentLoopGatherCallbackHandler +from core.entities.application_entities import ApplicationGenerateEntity, PromptTemplateEntity, ModelConfigEntity +from core.application_queue_manager import ApplicationQueueManager +from core.features.agent_runner import AgentRunnerFeature +from core.memory.token_buffer_memory import TokenBufferMemory +from core.model_manager import ModelInstance +from core.model_runtime.entities.llm_entities import LLMUsage +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from extensions.ext_database import db +from models.model import Conversation, Message, App, MessageChain, MessageAgentThought + +logger = logging.getLogger(__name__) + + +class AgentApplicationRunner(AppRunner): + """ + Agent Application Runner + """ + + def run(self, application_generate_entity: ApplicationGenerateEntity, + queue_manager: ApplicationQueueManager, + conversation: Conversation, + message: Message) -> None: + """ + Run agent application + :param application_generate_entity: application generate entity + :param queue_manager: application queue manager + :param conversation: conversation + :param message: message + :return: + """ + app_record = db.session.query(App).filter(App.id == application_generate_entity.app_id).first() + if not app_record: + raise ValueError(f"App not found") + + app_orchestration_config = application_generate_entity.app_orchestration_config_entity + + inputs = application_generate_entity.inputs + query = application_generate_entity.query + files = application_generate_entity.files + + # Pre-calculate the number of tokens of the prompt messages, + # and return the rest number of tokens by model context token size limit and max token size limit. + # If the rest number of tokens is not enough, raise exception. + # Include: prompt template, inputs, query(optional), files(optional) + # Not Include: memory, external data, dataset context + self.get_pre_calculate_rest_tokens( + app_record=app_record, + model_config=app_orchestration_config.model_config, + prompt_template_entity=app_orchestration_config.prompt_template, + inputs=inputs, + files=files, + query=query + ) + + memory = None + if application_generate_entity.conversation_id: + # get memory of conversation (read-only) + model_instance = ModelInstance( + provider_model_bundle=app_orchestration_config.model_config.provider_model_bundle, + model=app_orchestration_config.model_config.model + ) + + memory = TokenBufferMemory( + conversation=conversation, + model_instance=model_instance + ) + + # reorganize all inputs and template to prompt messages + # Include: prompt template, inputs, query(optional), files(optional) + # memory(optional) + prompt_messages, stop = self.originze_prompt_messages( + app_record=app_record, + model_config=app_orchestration_config.model_config, + prompt_template_entity=app_orchestration_config.prompt_template, + inputs=inputs, + files=files, + query=query, + context=None, + memory=memory + ) + + # Create MessageChain + message_chain = self._init_message_chain( + message=message, + query=query + ) + + # add agent callback to record agent thoughts + agent_callback = AgentLoopGatherCallbackHandler( + model_config=app_orchestration_config.model_config, + message=message, + queue_manager=queue_manager, + message_chain=message_chain + ) + + # init LLM Callback + agent_llm_callback = AgentLLMCallback( + agent_callback=agent_callback + ) + + agent_runner = AgentRunnerFeature( + tenant_id=application_generate_entity.tenant_id, + app_orchestration_config=app_orchestration_config, + model_config=app_orchestration_config.model_config, + config=app_orchestration_config.agent, + queue_manager=queue_manager, + message=message, + user_id=application_generate_entity.user_id, + agent_llm_callback=agent_llm_callback, + callback=agent_callback, + memory=memory + ) + + # agent run + result = agent_runner.run( + query=query, + invoke_from=application_generate_entity.invoke_from + ) + + if result: + self._save_message_chain( + message_chain=message_chain, + output_text=result + ) + + if (result + and app_orchestration_config.prompt_template.prompt_type == PromptTemplateEntity.PromptType.SIMPLE + and app_orchestration_config.prompt_template.simple_prompt_template + ): + # Direct output if agent result exists and has pre prompt + self.direct_output( + queue_manager=queue_manager, + app_orchestration_config=app_orchestration_config, + prompt_messages=prompt_messages, + stream=application_generate_entity.stream, + text=result, + usage=self._get_usage_of_all_agent_thoughts( + model_config=app_orchestration_config.model_config, + message=message + ) + ) + else: + # As normal LLM run, agent result as context + context = result + + # reorganize all inputs and template to prompt messages + # Include: prompt template, inputs, query(optional), files(optional) + # memory(optional), external data, dataset context(optional) + prompt_messages, stop = self.originze_prompt_messages( + app_record=app_record, + model_config=app_orchestration_config.model_config, + prompt_template_entity=app_orchestration_config.prompt_template, + inputs=inputs, + files=files, + query=query, + context=context, + memory=memory + ) + + # Re-calculate the max tokens if sum(prompt_token + max_tokens) over model token limit + self.recale_llm_max_tokens( + model_config=app_orchestration_config.model_config, + prompt_messages=prompt_messages + ) + + # Invoke model + model_instance = ModelInstance( + provider_model_bundle=app_orchestration_config.model_config.provider_model_bundle, + model=app_orchestration_config.model_config.model + ) + + invoke_result = model_instance.invoke_llm( + prompt_messages=prompt_messages, + model_parameters=app_orchestration_config.model_config.parameters, + stop=stop, + stream=application_generate_entity.stream, + user=application_generate_entity.user_id, + ) + + # handle invoke result + self._handle_invoke_result( + invoke_result=invoke_result, + queue_manager=queue_manager, + stream=application_generate_entity.stream + ) + + def _init_message_chain(self, message: Message, query: str) -> MessageChain: + """ + Init MessageChain + :param message: message + :param query: query + :return: + """ + message_chain = MessageChain( + message_id=message.id, + type="AgentExecutor", + input=json.dumps({ + "input": query + }) + ) + + db.session.add(message_chain) + db.session.commit() + + return message_chain + + def _save_message_chain(self, message_chain: MessageChain, output_text: str) -> None: + """ + Save MessageChain + :param message_chain: message chain + :param output_text: output text + :return: + """ + message_chain.output = json.dumps({ + "output": output_text + }) + db.session.commit() + + def _get_usage_of_all_agent_thoughts(self, model_config: ModelConfigEntity, + message: Message) -> LLMUsage: + """ + Get usage of all agent thoughts + :param model_config: model config + :param message: message + :return: + """ + agent_thoughts = (db.session.query(MessageAgentThought) + .filter(MessageAgentThought.message_id == message.id).all()) + + all_message_tokens = 0 + all_answer_tokens = 0 + for agent_thought in agent_thoughts: + all_message_tokens += agent_thought.message_tokens + all_answer_tokens += agent_thought.answer_tokens + + model_type_instance = model_config.provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + return model_type_instance._calc_response_usage( + model_config.model, + model_config.credentials, + all_message_tokens, + all_answer_tokens + ) diff --git a/api/core/app_runner/app_runner.py b/api/core/app_runner/app_runner.py new file mode 100644 index 00000000000000..4f247aa8dab838 --- /dev/null +++ b/api/core/app_runner/app_runner.py @@ -0,0 +1,267 @@ +import time +from typing import cast, Optional, List, Tuple, Generator, Union + +from core.application_queue_manager import ApplicationQueueManager +from core.entities.application_entities import ModelConfigEntity, PromptTemplateEntity, AppOrchestrationConfigEntity +from core.file.file_obj import FileObj +from core.memory.token_buffer_memory import TokenBufferMemory +from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta, LLMUsage +from core.model_runtime.entities.message_entities import PromptMessage, AssistantPromptMessage +from core.model_runtime.entities.model_entities import ModelPropertyKey +from core.model_runtime.errors.invoke import InvokeBadRequestError +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from core.prompt.prompt_transform import PromptTransform +from models.model import App + + +class AppRunner: + def get_pre_calculate_rest_tokens(self, app_record: App, + model_config: ModelConfigEntity, + prompt_template_entity: PromptTemplateEntity, + inputs: dict[str, str], + files: list[FileObj], + query: Optional[str] = None) -> int: + """ + Get pre calculate rest tokens + :param app_record: app record + :param model_config: model config entity + :param prompt_template_entity: prompt template entity + :param inputs: inputs + :param files: files + :param query: query + :return: + """ + model_type_instance = model_config.provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + model_context_tokens = model_config.model_schema.model_properties.get(ModelPropertyKey.CONTEXT_SIZE) + + max_tokens = 0 + for parameter_rule in model_config.model_schema.parameter_rules: + if (parameter_rule.name == 'max_tokens' + or (parameter_rule.use_template and parameter_rule.use_template == 'max_tokens')): + max_tokens = (model_config.parameters.get(parameter_rule.name) + or model_config.parameters.get(parameter_rule.use_template)) or 0 + + if model_context_tokens is None: + return -1 + + if max_tokens is None: + max_tokens = 0 + + # get prompt messages without memory and context + prompt_messages, stop = self.originze_prompt_messages( + app_record=app_record, + model_config=model_config, + prompt_template_entity=prompt_template_entity, + inputs=inputs, + files=files, + query=query + ) + + prompt_tokens = model_type_instance.get_num_tokens( + model_config.model, + model_config.credentials, + prompt_messages + ) + + rest_tokens = model_context_tokens - max_tokens - prompt_tokens + if rest_tokens < 0: + raise InvokeBadRequestError("Query or prefix prompt is too long, you can reduce the prefix prompt, " + "or shrink the max token, or switch to a llm with a larger token limit size.") + + return rest_tokens + + def recale_llm_max_tokens(self, model_config: ModelConfigEntity, + prompt_messages: List[PromptMessage]): + # recalc max_tokens if sum(prompt_token + max_tokens) over model token limit + model_type_instance = model_config.provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + model_context_tokens = model_config.model_schema.model_properties.get(ModelPropertyKey.CONTEXT_SIZE) + + max_tokens = 0 + for parameter_rule in model_config.model_schema.parameter_rules: + if (parameter_rule.name == 'max_tokens' + or (parameter_rule.use_template and parameter_rule.use_template == 'max_tokens')): + max_tokens = (model_config.parameters.get(parameter_rule.name) + or model_config.parameters.get(parameter_rule.use_template)) or 0 + + if model_context_tokens is None: + return -1 + + if max_tokens is None: + max_tokens = 0 + + prompt_tokens = model_type_instance.get_num_tokens( + model_config.model, + model_config.credentials, + prompt_messages + ) + + if prompt_tokens + max_tokens > model_context_tokens: + max_tokens = max(model_context_tokens - prompt_tokens, 16) + + for parameter_rule in model_config.model_schema.parameter_rules: + if (parameter_rule.name == 'max_tokens' + or (parameter_rule.use_template and parameter_rule.use_template == 'max_tokens')): + model_config.parameters[parameter_rule.name] = max_tokens + + def originze_prompt_messages(self, app_record: App, + model_config: ModelConfigEntity, + prompt_template_entity: PromptTemplateEntity, + inputs: dict[str, str], + files: list[FileObj], + query: Optional[str] = None, + context: Optional[str] = None, + memory: Optional[TokenBufferMemory] = None) \ + -> Tuple[List[PromptMessage], Optional[List[str]]]: + """ + Organize prompt messages + :param context: + :param app_record: app record + :param model_config: model config entity + :param prompt_template_entity: prompt template entity + :param inputs: inputs + :param files: files + :param query: query + :param memory: memory + :return: + """ + prompt_transform = PromptTransform() + + # get prompt without memory and context + if prompt_template_entity.prompt_type == PromptTemplateEntity.PromptType.SIMPLE: + prompt_messages, stop = prompt_transform.get_prompt( + app_mode=app_record.mode, + prompt_template_entity=prompt_template_entity, + inputs=inputs, + query=query if query else '', + files=files, + context=context, + memory=memory, + model_config=model_config + ) + else: + prompt_messages = prompt_transform.get_advanced_prompt( + app_mode=app_record.mode, + prompt_template_entity=prompt_template_entity, + inputs=inputs, + query=query, + files=files, + context=context, + memory=memory, + model_config=model_config + ) + stop = model_config.stop + + return prompt_messages, stop + + def direct_output(self, queue_manager: ApplicationQueueManager, + app_orchestration_config: AppOrchestrationConfigEntity, + prompt_messages: list, + text: str, + stream: bool, + usage: Optional[LLMUsage] = None) -> None: + """ + Direct output + :param queue_manager: application queue manager + :param app_orchestration_config: app orchestration config + :param prompt_messages: prompt messages + :param text: text + :param stream: stream + :param usage: usage + :return: + """ + if stream: + index = 0 + for token in text: + queue_manager.publish_chunk_message(LLMResultChunk( + model=app_orchestration_config.model_config.model, + prompt_messages=prompt_messages, + delta=LLMResultChunkDelta( + index=index, + message=AssistantPromptMessage(content=token) + ) + )) + index += 1 + time.sleep(0.01) + + queue_manager.publish_message_end( + llm_result=LLMResult( + model=app_orchestration_config.model_config.model, + prompt_messages=prompt_messages, + message=AssistantPromptMessage(content=text), + usage=usage if usage else LLMUsage.empty_usage() + ) + ) + + def _handle_invoke_result(self, invoke_result: Union[LLMResult, Generator], + queue_manager: ApplicationQueueManager, + stream: bool) -> None: + """ + Handle invoke result + :param invoke_result: invoke result + :param queue_manager: application queue manager + :param stream: stream + :return: + """ + if not stream: + self._handle_invoke_result_direct( + invoke_result=invoke_result, + queue_manager=queue_manager + ) + else: + self._handle_invoke_result_stream( + invoke_result=invoke_result, + queue_manager=queue_manager + ) + + def _handle_invoke_result_direct(self, invoke_result: LLMResult, + queue_manager: ApplicationQueueManager) -> None: + """ + Handle invoke result direct + :param invoke_result: invoke result + :param queue_manager: application queue manager + :return: + """ + queue_manager.publish_message_end( + llm_result=invoke_result + ) + + def _handle_invoke_result_stream(self, invoke_result: Generator, + queue_manager: ApplicationQueueManager) -> None: + """ + Handle invoke result + :param invoke_result: invoke result + :param queue_manager: application queue manager + :return: + """ + model = None + prompt_messages = [] + text = '' + usage = None + for result in invoke_result: + queue_manager.publish_chunk_message(result) + + text += result.delta.message.content + + if not model: + model = result.model + + if not prompt_messages: + prompt_messages = result.prompt_messages + + if not usage and result.delta.usage: + usage = result.delta.usage + + llm_result = LLMResult( + model=model, + prompt_messages=prompt_messages, + message=AssistantPromptMessage(content=text), + usage=usage + ) + + queue_manager.publish_message_end( + llm_result=llm_result + ) diff --git a/api/core/app_runner/basic_app_runner.py b/api/core/app_runner/basic_app_runner.py new file mode 100644 index 00000000000000..517cd8302adb70 --- /dev/null +++ b/api/core/app_runner/basic_app_runner.py @@ -0,0 +1,363 @@ +import logging +from typing import Tuple, Optional + +from core.app_runner.app_runner import AppRunner +from core.callback_handler.index_tool_callback_handler import DatasetIndexToolCallbackHandler +from core.entities.application_entities import ApplicationGenerateEntity, ModelConfigEntity, \ + AppOrchestrationConfigEntity, InvokeFrom, ExternalDataVariableEntity, DatasetEntity +from core.application_queue_manager import ApplicationQueueManager +from core.features.annotation_reply import AnnotationReplyFeature +from core.features.dataset_retrieval import DatasetRetrievalFeature +from core.features.external_data_fetch import ExternalDataFetchFeature +from core.features.hosting_moderation import HostingModerationFeature +from core.features.moderation import ModerationFeature +from core.memory.token_buffer_memory import TokenBufferMemory +from core.model_manager import ModelInstance +from core.model_runtime.entities.message_entities import PromptMessage +from core.moderation.base import ModerationException +from core.prompt.prompt_transform import AppMode +from extensions.ext_database import db +from models.model import Conversation, Message, App, MessageAnnotation + +logger = logging.getLogger(__name__) + + +class BasicApplicationRunner(AppRunner): + """ + Basic Application Runner + """ + + def run(self, application_generate_entity: ApplicationGenerateEntity, + queue_manager: ApplicationQueueManager, + conversation: Conversation, + message: Message) -> None: + """ + Run application + :param application_generate_entity: application generate entity + :param queue_manager: application queue manager + :param conversation: conversation + :param message: message + :return: + """ + app_record = db.session.query(App).filter(App.id == application_generate_entity.app_id).first() + if not app_record: + raise ValueError(f"App not found") + + app_orchestration_config = application_generate_entity.app_orchestration_config_entity + + inputs = application_generate_entity.inputs + query = application_generate_entity.query + files = application_generate_entity.files + + # Pre-calculate the number of tokens of the prompt messages, + # and return the rest number of tokens by model context token size limit and max token size limit. + # If the rest number of tokens is not enough, raise exception. + # Include: prompt template, inputs, query(optional), files(optional) + # Not Include: memory, external data, dataset context + self.get_pre_calculate_rest_tokens( + app_record=app_record, + model_config=app_orchestration_config.model_config, + prompt_template_entity=app_orchestration_config.prompt_template, + inputs=inputs, + files=files, + query=query + ) + + memory = None + if application_generate_entity.conversation_id: + # get memory of conversation (read-only) + model_instance = ModelInstance( + provider_model_bundle=app_orchestration_config.model_config.provider_model_bundle, + model=app_orchestration_config.model_config.model + ) + + memory = TokenBufferMemory( + conversation=conversation, + model_instance=model_instance + ) + + # organize all inputs and template to prompt messages + # Include: prompt template, inputs, query(optional), files(optional) + # memory(optional) + prompt_messages, stop = self.originze_prompt_messages( + app_record=app_record, + model_config=app_orchestration_config.model_config, + prompt_template_entity=app_orchestration_config.prompt_template, + inputs=inputs, + files=files, + query=query, + memory=memory + ) + + # moderation + try: + # process sensitive_word_avoidance + _, inputs, query = self.moderation_for_inputs( + app_id=app_record.id, + tenant_id=application_generate_entity.tenant_id, + app_orchestration_config_entity=app_orchestration_config, + inputs=inputs, + query=query, + ) + except ModerationException as e: + self.direct_output( + queue_manager=queue_manager, + app_orchestration_config=app_orchestration_config, + prompt_messages=prompt_messages, + text=str(e), + stream=application_generate_entity.stream + ) + return + + if query: + # annotation reply + annotation_reply = self.query_app_annotations_to_reply( + app_record=app_record, + message=message, + query=query, + user_id=application_generate_entity.user_id, + invoke_from=application_generate_entity.invoke_from + ) + + if annotation_reply: + queue_manager.publish_annotation_reply( + message_annotation_id=annotation_reply.id + ) + self.direct_output( + queue_manager=queue_manager, + app_orchestration_config=app_orchestration_config, + prompt_messages=prompt_messages, + text=annotation_reply.content, + stream=application_generate_entity.stream + ) + return + + # fill in variable inputs from external data tools if exists + external_data_tools = app_orchestration_config.external_data_variables + if external_data_tools: + inputs = self.fill_in_inputs_from_external_data_tools( + tenant_id=app_record.tenant_id, + app_id=app_record.id, + external_data_tools=external_data_tools, + inputs=inputs, + query=query + ) + + # get context from datasets + context = None + if app_orchestration_config.dataset: + context = self.retrieve_dataset_context( + tenant_id=app_record.tenant_id, + app_record=app_record, + queue_manager=queue_manager, + model_config=app_orchestration_config.model_config, + show_retrieve_source=app_orchestration_config.show_retrieve_source, + dataset_config=app_orchestration_config.dataset, + message=message, + inputs=inputs, + query=query, + user_id=application_generate_entity.user_id, + invoke_from=application_generate_entity.invoke_from, + memory=memory + ) + + # reorganize all inputs and template to prompt messages + # Include: prompt template, inputs, query(optional), files(optional) + # memory(optional), external data, dataset context(optional) + prompt_messages, stop = self.originze_prompt_messages( + app_record=app_record, + model_config=app_orchestration_config.model_config, + prompt_template_entity=app_orchestration_config.prompt_template, + inputs=inputs, + files=files, + query=query, + context=context, + memory=memory + ) + + # check hosting moderation + hosting_moderation_result = self.check_hosting_moderation( + application_generate_entity=application_generate_entity, + queue_manager=queue_manager, + prompt_messages=prompt_messages + ) + + if hosting_moderation_result: + return + + # Re-calculate the max tokens if sum(prompt_token + max_tokens) over model token limit + self.recale_llm_max_tokens( + model_config=app_orchestration_config.model_config, + prompt_messages=prompt_messages + ) + + # Invoke model + model_instance = ModelInstance( + provider_model_bundle=app_orchestration_config.model_config.provider_model_bundle, + model=app_orchestration_config.model_config.model + ) + + invoke_result = model_instance.invoke_llm( + prompt_messages=prompt_messages, + model_parameters=app_orchestration_config.model_config.parameters, + stop=stop, + stream=application_generate_entity.stream, + user=application_generate_entity.user_id, + ) + + # handle invoke result + self._handle_invoke_result( + invoke_result=invoke_result, + queue_manager=queue_manager, + stream=application_generate_entity.stream + ) + + def moderation_for_inputs(self, app_id: str, + tenant_id: str, + app_orchestration_config_entity: AppOrchestrationConfigEntity, + inputs: dict, + query: str) -> Tuple[bool, dict, str]: + """ + Process sensitive_word_avoidance. + :param app_id: app id + :param tenant_id: tenant id + :param app_orchestration_config_entity: app orchestration config entity + :param inputs: inputs + :param query: query + :return: + """ + moderation_feature = ModerationFeature() + return moderation_feature.check( + app_id=app_id, + tenant_id=tenant_id, + app_orchestration_config_entity=app_orchestration_config_entity, + inputs=inputs, + query=query, + ) + + def query_app_annotations_to_reply(self, app_record: App, + message: Message, + query: str, + user_id: str, + invoke_from: InvokeFrom) -> Optional[MessageAnnotation]: + """ + Query app annotations to reply + :param app_record: app record + :param message: message + :param query: query + :param user_id: user id + :param invoke_from: invoke from + :return: + """ + annotation_reply_feature = AnnotationReplyFeature() + return annotation_reply_feature.query( + app_record=app_record, + message=message, + query=query, + user_id=user_id, + invoke_from=invoke_from + ) + + def fill_in_inputs_from_external_data_tools(self, tenant_id: str, + app_id: str, + external_data_tools: list[ExternalDataVariableEntity], + inputs: dict, + query: str) -> dict: + """ + Fill in variable inputs from external data tools if exists. + + :param tenant_id: workspace id + :param app_id: app id + :param external_data_tools: external data tools configs + :param inputs: the inputs + :param query: the query + :return: the filled inputs + """ + external_data_fetch_feature = ExternalDataFetchFeature() + return external_data_fetch_feature.fetch( + tenant_id=tenant_id, + app_id=app_id, + external_data_tools=external_data_tools, + inputs=inputs, + query=query + ) + + def retrieve_dataset_context(self, tenant_id: str, + app_record: App, + queue_manager: ApplicationQueueManager, + model_config: ModelConfigEntity, + dataset_config: DatasetEntity, + show_retrieve_source: bool, + message: Message, + inputs: dict, + query: str, + user_id: str, + invoke_from: InvokeFrom, + memory: Optional[TokenBufferMemory] = None) -> Optional[str]: + """ + Retrieve dataset context + :param tenant_id: tenant id + :param app_record: app record + :param queue_manager: queue manager + :param model_config: model config + :param dataset_config: dataset config + :param show_retrieve_source: show retrieve source + :param message: message + :param inputs: inputs + :param query: query + :param user_id: user id + :param invoke_from: invoke from + :param memory: memory + :return: + """ + hit_callback = DatasetIndexToolCallbackHandler( + queue_manager, + app_record.id, + message.id, + user_id, + invoke_from + ) + + if (app_record.mode == AppMode.COMPLETION.value and dataset_config + and dataset_config.retrieve_config.query_variable): + query = inputs.get(dataset_config.retrieve_config.query_variable, "") + + dataset_retrieval = DatasetRetrievalFeature() + return dataset_retrieval.retrieve( + tenant_id=tenant_id, + model_config=model_config, + config=dataset_config, + query=query, + invoke_from=invoke_from, + show_retrieve_source=show_retrieve_source, + hit_callback=hit_callback, + memory=memory + ) + + def check_hosting_moderation(self, application_generate_entity: ApplicationGenerateEntity, + queue_manager: ApplicationQueueManager, + prompt_messages: list[PromptMessage]) -> bool: + """ + Check hosting moderation + :param application_generate_entity: application generate entity + :param queue_manager: queue manager + :param prompt_messages: prompt messages + :return: + """ + hosting_moderation_feature = HostingModerationFeature() + moderation_result = hosting_moderation_feature.check( + application_generate_entity=application_generate_entity, + prompt_messages=prompt_messages + ) + + if moderation_result: + self.direct_output( + queue_manager=queue_manager, + app_orchestration_config=application_generate_entity.app_orchestration_config_entity, + prompt_messages=prompt_messages, + text="I apologize for any confusion, " \ + "but I'm an AI assistant to be helpful, harmless, and honest.", + stream=application_generate_entity.stream + ) + + return moderation_result diff --git a/api/core/app_runner/generate_task_pipeline.py b/api/core/app_runner/generate_task_pipeline.py new file mode 100644 index 00000000000000..0281259453c39a --- /dev/null +++ b/api/core/app_runner/generate_task_pipeline.py @@ -0,0 +1,483 @@ +import json +import logging +import time +from typing import Union, Generator, cast, Optional + +from pydantic import BaseModel + +from core.app_runner.moderation_handler import OutputModerationHandler, ModerationRule +from core.entities.application_entities import ApplicationGenerateEntity +from core.application_queue_manager import ApplicationQueueManager +from core.entities.queue_entities import QueueErrorEvent, QueueStopEvent, QueueMessageEndEvent, \ + QueueRetrieverResourcesEvent, QueueAgentThoughtEvent, QueuePingEvent, QueueMessageEvent, QueueMessageReplaceEvent, \ + AnnotationReplyEvent +from core.model_runtime.entities.llm_entities import LLMResult, LLMUsage, LLMResultChunk, LLMResultChunkDelta +from core.model_runtime.entities.message_entities import AssistantPromptMessage, PromptMessageRole, \ + TextPromptMessageContent, PromptMessageContentType, ImagePromptMessageContent, PromptMessage +from core.model_runtime.errors.invoke import InvokeError, InvokeAuthorizationError +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from core.prompt.prompt_template import PromptTemplateParser +from events.message_event import message_was_created +from extensions.ext_database import db +from models.model import Message, Conversation, MessageAgentThought +from services.annotation_service import AppAnnotationService + +logger = logging.getLogger(__name__) + + +class TaskState(BaseModel): + """ + TaskState entity + """ + llm_result: LLMResult + metadata: dict = {} + + +class GenerateTaskPipeline: + """ + GenerateTaskPipeline is a class that generate stream output and state management for Application. + """ + + def __init__(self, application_generate_entity: ApplicationGenerateEntity, + queue_manager: ApplicationQueueManager, + conversation: Conversation, + message: Message) -> None: + """ + Initialize GenerateTaskPipeline. + :param application_generate_entity: application generate entity + :param queue_manager: queue manager + :param conversation: conversation + :param message: message + """ + self._application_generate_entity = application_generate_entity + self._queue_manager = queue_manager + self._conversation = conversation + self._message = message + self._task_state = TaskState( + llm_result=LLMResult( + model=self._application_generate_entity.app_orchestration_config_entity.model_config.model, + prompt_messages=[], + message=AssistantPromptMessage(content=""), + usage=LLMUsage.empty_usage() + ) + ) + self._start_at = time.perf_counter() + self._output_moderation_handler = self._init_output_moderation() + + def process(self, stream: bool) -> Union[dict, Generator]: + """ + Process generate task pipeline. + :return: + """ + if stream: + return self._process_stream_response() + else: + return self._process_blocking_response() + + def _process_blocking_response(self) -> dict: + """ + Process blocking response. + :return: + """ + for queue_message in self._queue_manager.listen(): + event = queue_message.event + + if isinstance(event, QueueErrorEvent): + raise self._handle_error(event) + elif isinstance(event, QueueRetrieverResourcesEvent): + self._task_state.metadata['retriever_resources'] = event.retriever_resources + elif isinstance(event, AnnotationReplyEvent): + annotation = AppAnnotationService.get_annotation_by_id(event.message_annotation_id) + if annotation: + account = annotation.account + self._task_state.metadata['annotation_reply'] = { + 'id': annotation.id, + 'account': { + 'id': annotation.account_id, + 'name': account.name if account else 'Dify user' + } + } + + self._task_state.llm_result.message.content = annotation.content + elif isinstance(event, (QueueStopEvent, QueueMessageEndEvent)): + if isinstance(event, QueueMessageEndEvent): + self._task_state.llm_result = event.llm_result + else: + model_config = self._application_generate_entity.app_orchestration_config_entity.model_config + model = model_config.model + model_type_instance = model_config.provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + # calculate num tokens + prompt_tokens = 0 + if event.stopped_by != QueueStopEvent.StopBy.ANNOTATION_REPLY: + prompt_tokens = model_type_instance.get_num_tokens( + model, + model_config.credentials, + self._task_state.llm_result.prompt_messages + ) + + completion_tokens = 0 + if event.stopped_by == QueueStopEvent.StopBy.USER_MANUAL: + completion_tokens = model_type_instance.get_num_tokens( + model, + model_config.credentials, + [self._task_state.llm_result.message] + ) + + credentials = model_config.credentials + + # transform usage + self._task_state.llm_result.usage = model_type_instance._calc_response_usage( + model, + credentials, + prompt_tokens, + completion_tokens + ) + + # response moderation + if self._output_moderation_handler: + self._output_moderation_handler.stop_thread() + + self._task_state.llm_result.message.content = self._output_moderation_handler.moderation_completion( + completion=self._task_state.llm_result.message.content, + public_event=False + ) + + # Save message + self._save_message(event.llm_result) + + response = { + 'event': 'message', + 'task_id': self._application_generate_entity.task_id, + 'id': self._message.id, + 'mode': self._conversation.mode, + 'answer': event.llm_result.message.content, + 'metadata': {}, + 'created_at': int(self._message.created_at.timestamp()) + } + + if self._conversation.mode == 'chat': + response['conversation_id'] = self._conversation.id + + if self._task_state.metadata: + response['metadata'] = self._task_state.metadata + + return response + else: + continue + + def _process_stream_response(self) -> Generator: + """ + Process stream response. + :return: + """ + for message in self._queue_manager.listen(): + event = message.event + + if isinstance(event, QueueErrorEvent): + raise self._handle_error(event) + elif isinstance(event, (QueueStopEvent, QueueMessageEndEvent)): + if isinstance(event, QueueMessageEndEvent): + self._task_state.llm_result = event.llm_result + else: + model_config = self._application_generate_entity.app_orchestration_config_entity.model_config + model = model_config.model + model_type_instance = model_config.provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + # calculate num tokens + prompt_tokens = 0 + if event.stopped_by != QueueStopEvent.StopBy.ANNOTATION_REPLY: + prompt_tokens = model_type_instance.get_num_tokens( + model, + model_config.credentials, + self._task_state.llm_result.prompt_messages + ) + + completion_tokens = 0 + if event.stopped_by == QueueStopEvent.StopBy.USER_MANUAL: + completion_tokens = model_type_instance.get_num_tokens( + model, + model_config.credentials, + [self._task_state.llm_result.message] + ) + + credentials = model_config.credentials + + # transform usage + self._task_state.llm_result.usage = model_type_instance._calc_response_usage( + model, + credentials, + prompt_tokens, + completion_tokens + ) + + # response moderation + if self._output_moderation_handler: + self._output_moderation_handler.stop_thread() + + self._task_state.llm_result.message.content = self._output_moderation_handler.moderation_completion( + completion=self._task_state.llm_result.message.content, + public_event=False + ) + + self._output_moderation_handler = None + + replace_response = { + 'event': 'message_replace', + 'task_id': self._application_generate_entity.task_id, + 'message_id': self._message.id, + 'answer': self._task_state.llm_result.message.content, + 'created_at': int(self._message.created_at.timestamp()) + } + + if self._conversation.mode == 'chat': + replace_response['conversation_id'] = self._conversation.id + + yield self._yield_response(replace_response) + + # Save message + self._save_message(self._task_state.llm_result) + + response = { + 'event': 'message_end', + 'task_id': self._application_generate_entity.task_id, + 'id': self._message.id, + } + + if self._conversation.mode == 'chat': + response['conversation_id'] = self._conversation.id + + if self._task_state.metadata: + response['metadata'] = self._task_state.metadata + + yield self._yield_response(response) + elif isinstance(event, QueueRetrieverResourcesEvent): + self._task_state.metadata['retriever_resources'] = event.retriever_resources + elif isinstance(event, AnnotationReplyEvent): + annotation = AppAnnotationService.get_annotation_by_id(event.message_annotation_id) + if annotation: + account = annotation.account + self._task_state.metadata['annotation_reply'] = { + 'id': annotation.id, + 'account': { + 'id': annotation.account_id, + 'name': account.name if account else 'Dify user' + } + } + + self._task_state.llm_result.message.content = annotation.content + elif isinstance(event, QueueAgentThoughtEvent): + agent_thought = ( + db.session.query(MessageAgentThought) + .filter(MessageAgentThought.id == event.agent_thought_id) + .first() + ) + + if agent_thought: + response = { + 'event': 'agent_thought', + 'id': agent_thought.id, + 'task_id': self._application_generate_entity.task_id, + 'message_id': self._message.id, + 'position': agent_thought.position, + 'thought': agent_thought.thought, + 'tool': agent_thought.tool, + 'tool_input': agent_thought.tool_input, + 'created_at': int(self._message.created_at.timestamp()) + } + + if self._conversation.mode == 'chat': + response['conversation_id'] = self._conversation.id + + yield self._yield_response(response) + elif isinstance(event, QueueMessageEvent): + chunk = event.chunk + delta_text = chunk.delta.message.content + if delta_text is None: + continue + + if not self._task_state.llm_result.prompt_messages: + self._task_state.llm_result.prompt_messages = chunk.prompt_messages + + if self._output_moderation_handler: + if self._output_moderation_handler.should_direct_output(): + # stop subscribe new token when output moderation should direct output + self._task_state.llm_result.message.content = self._output_moderation_handler.get_final_output() + self._queue_manager.publish_chunk_message(LLMResultChunk( + model=self._task_state.llm_result.model, + prompt_messages=self._task_state.llm_result.prompt_messages, + delta=LLMResultChunkDelta( + index=0, + message=AssistantPromptMessage(content=self._task_state.llm_result.message.content) + ) + )) + self._queue_manager.publish(QueueStopEvent(stopped_by=QueueStopEvent.StopBy.OUTPUT_MODERATION)) + continue + else: + self._output_moderation_handler.append_new_token(delta_text) + + self._task_state.llm_result.message.content += delta_text + response = self._handle_chunk(delta_text) + yield self._yield_response(response) + elif isinstance(event, QueueMessageReplaceEvent): + response = { + 'event': 'message_replace', + 'task_id': self._application_generate_entity.task_id, + 'message_id': self._message.id, + 'answer': event.text, + 'created_at': int(self._message.created_at.timestamp()) + } + + if self._conversation.mode == 'chat': + response['conversation_id'] = self._conversation.id + + yield self._yield_response(response) + elif isinstance(event, QueuePingEvent): + yield "event: ping\n\n" + else: + continue + + def _save_message(self, llm_result: LLMResult) -> None: + """ + Save message. + :param llm_result: llm result + :return: + """ + usage = llm_result.usage + + self._message = db.session.query(Message).filter(Message.id == self._message.id).first() + + self._message.message = self._prompt_messages_to_prompt_for_saving(self._task_state.llm_result.prompt_messages) + self._message.message_tokens = usage.prompt_tokens + self._message.message_unit_price = usage.prompt_unit_price + self._message.message_price_unit = usage.prompt_price_unit + self._message.answer = PromptTemplateParser.remove_template_variables(llm_result.message.content.strip()) \ + if llm_result.message.content else '' + self._message.answer_tokens = usage.completion_tokens + self._message.answer_unit_price = usage.completion_unit_price + self._message.answer_price_unit = usage.completion_price_unit + self._message.provider_response_latency = time.perf_counter() - self._start_at + self._message.total_price = usage.total_price + + db.session.commit() + + message_was_created.send( + self._message, + application_generate_entity=self._application_generate_entity, + conversation=self._conversation, + is_first_message=self._application_generate_entity.conversation_id is None, + extras=self._application_generate_entity.extras + ) + + def _handle_chunk(self, text: str) -> dict: + """ + Handle completed event. + :param text: text + :return: + """ + response = { + 'event': 'message', + 'id': self._message.id, + 'task_id': self._application_generate_entity.task_id, + 'message_id': self._message.id, + 'answer': text, + 'created_at': int(self._message.created_at.timestamp()) + } + + if self._conversation.mode == 'chat': + response['conversation_id'] = self._conversation.id + + return response + + def _handle_error(self, event: QueueErrorEvent) -> Exception: + """ + Handle error event. + :param event: event + :return: + """ + logger.debug("error: %s", event.error) + e = event.error + + if isinstance(e, InvokeAuthorizationError): + return InvokeAuthorizationError('Incorrect API key provided') + elif isinstance(e, InvokeError) or isinstance(e, ValueError): + return e + else: + return Exception(e.description if getattr(e, 'description', None) is not None else str(e)) + + def _yield_response(self, response: dict) -> str: + """ + Yield response. + :param response: response + :return: + """ + return "data: " + json.dumps(response) + "\n\n" + + def _prompt_messages_to_prompt_for_saving(self, prompt_messages: list[PromptMessage]) -> list[dict]: + """ + Prompt messages to prompt for saving. + :param prompt_messages: prompt messages + :return: + """ + prompts = [] + if self._application_generate_entity.app_orchestration_config_entity.model_config.mode == 'chat': + for prompt_message in prompt_messages: + if prompt_message.role == PromptMessageRole.USER: + role = 'user' + elif prompt_message.role == PromptMessageRole.ASSISTANT: + role = 'assistant' + elif prompt_message.role == PromptMessageRole.SYSTEM: + role = 'system' + else: + continue + + text = '' + files = [] + if isinstance(prompt_message.content, list): + for content in prompt_message.content: + if content.type == PromptMessageContentType.TEXT: + content = cast(TextPromptMessageContent, content) + text += content.data + else: + content = cast(ImagePromptMessageContent, content) + files.append({ + "type": 'image', + "data": content.data[:10] + '...[TRUNCATED]...' + content.data[-10:], + "detail": content.detail.value + }) + else: + text = prompt_message.content + + prompts.append({ + "role": role, + "text": text, + "files": files + }) + else: + prompts.append({ + "role": 'user', + "text": prompt_messages[0].content + }) + + return prompts + + def _init_output_moderation(self) -> Optional[OutputModerationHandler]: + """ + Init output moderation. + :return: + """ + app_orchestration_config_entity = self._application_generate_entity.app_orchestration_config_entity + sensitive_word_avoidance = app_orchestration_config_entity.sensitive_word_avoidance + + if sensitive_word_avoidance: + return OutputModerationHandler( + tenant_id=self._application_generate_entity.tenant_id, + app_id=self._application_generate_entity.app_id, + rule=ModerationRule( + type=sensitive_word_avoidance.type, + config=sensitive_word_avoidance.config + ), + on_message_replace_func=self._queue_manager.publish_message_replace + ) diff --git a/api/core/app_runner/moderation_handler.py b/api/core/app_runner/moderation_handler.py new file mode 100644 index 00000000000000..c4f2403e7f59bf --- /dev/null +++ b/api/core/app_runner/moderation_handler.py @@ -0,0 +1,138 @@ +import logging +import threading +import time +from typing import Any, Optional, Dict + +from flask import current_app, Flask +from pydantic import BaseModel + +from core.moderation.base import ModerationAction, ModerationOutputsResult +from core.moderation.factory import ModerationFactory + +logger = logging.getLogger(__name__) + + +class ModerationRule(BaseModel): + type: str + config: Dict[str, Any] + + +class OutputModerationHandler(BaseModel): + DEFAULT_BUFFER_SIZE: int = 300 + + tenant_id: str + app_id: str + + rule: ModerationRule + on_message_replace_func: Any + + thread: Optional[threading.Thread] = None + thread_running: bool = True + buffer: str = '' + is_final_chunk: bool = False + final_output: Optional[str] = None + + class Config: + arbitrary_types_allowed = True + + def should_direct_output(self): + return self.final_output is not None + + def get_final_output(self): + return self.final_output + + def append_new_token(self, token: str): + self.buffer += token + + if not self.thread: + self.thread = self.start_thread() + + def moderation_completion(self, completion: str, public_event: bool = False) -> str: + self.buffer = completion + self.is_final_chunk = True + + result = self.moderation( + tenant_id=self.tenant_id, + app_id=self.app_id, + moderation_buffer=completion + ) + + if not result or not result.flagged: + return completion + + if result.action == ModerationAction.DIRECT_OUTPUT: + final_output = result.preset_response + else: + final_output = result.text + + if public_event: + self.on_message_replace_func(final_output) + + return final_output + + def start_thread(self) -> threading.Thread: + buffer_size = int(current_app.config.get('MODERATION_BUFFER_SIZE', self.DEFAULT_BUFFER_SIZE)) + thread = threading.Thread(target=self.worker, kwargs={ + 'flask_app': current_app._get_current_object(), + 'buffer_size': buffer_size if buffer_size > 0 else self.DEFAULT_BUFFER_SIZE + }) + + thread.start() + + return thread + + def stop_thread(self): + if self.thread and self.thread.is_alive(): + self.thread_running = False + + def worker(self, flask_app: Flask, buffer_size: int): + with flask_app.app_context(): + current_length = 0 + while self.thread_running: + moderation_buffer = self.buffer + buffer_length = len(moderation_buffer) + if not self.is_final_chunk: + chunk_length = buffer_length - current_length + if 0 <= chunk_length < buffer_size: + time.sleep(1) + continue + + current_length = buffer_length + + result = self.moderation( + tenant_id=self.tenant_id, + app_id=self.app_id, + moderation_buffer=moderation_buffer + ) + + if not result or not result.flagged: + continue + + if result.action == ModerationAction.DIRECT_OUTPUT: + final_output = result.preset_response + self.final_output = final_output + else: + final_output = result.text + self.buffer[len(moderation_buffer):] + + # trigger replace event + if self.thread_running: + self.on_message_replace_func(final_output) + + if result.action == ModerationAction.DIRECT_OUTPUT: + break + + def moderation(self, tenant_id: str, app_id: str, moderation_buffer: str) -> Optional[ModerationOutputsResult]: + try: + moderation_factory = ModerationFactory( + name=self.rule.type, + app_id=app_id, + tenant_id=tenant_id, + config=self.rule.config + ) + + result: ModerationOutputsResult = moderation_factory.moderation_for_outputs(moderation_buffer) + return result + except Exception as e: + logger.error("Moderation Output error: %s", e) + + return None diff --git a/api/core/application_manager.py b/api/core/application_manager.py new file mode 100644 index 00000000000000..cad03c710d099d --- /dev/null +++ b/api/core/application_manager.py @@ -0,0 +1,655 @@ +import json +import logging +import threading +import uuid +from typing import cast, Optional, Any, Union, Generator, Tuple + +from flask import Flask, current_app +from pydantic import ValidationError + +from core.app_runner.agent_app_runner import AgentApplicationRunner +from core.app_runner.basic_app_runner import BasicApplicationRunner +from core.app_runner.generate_task_pipeline import GenerateTaskPipeline +from core.entities.application_entities import ApplicationGenerateEntity, AppOrchestrationConfigEntity, \ + ModelConfigEntity, PromptTemplateEntity, AdvancedChatPromptTemplateEntity, \ + AdvancedCompletionPromptTemplateEntity, ExternalDataVariableEntity, DatasetEntity, DatasetRetrieveConfigEntity, \ + AgentEntity, AgentToolEntity, FileUploadEntity, SensitiveWordAvoidanceEntity, InvokeFrom +from core.entities.model_entities import ModelStatus +from core.file.file_obj import FileObj +from core.errors.error import QuotaExceededError, ProviderTokenNotInitError, ModelCurrentlyNotSupportError +from core.model_runtime.entities.message_entities import PromptMessageRole +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.errors.invoke import InvokeAuthorizationError, InvokeError +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from core.prompt.prompt_template import PromptTemplateParser +from core.provider_manager import ProviderManager +from core.application_queue_manager import ApplicationQueueManager, ConversationTaskStoppedException +from extensions.ext_database import db +from models.account import Account +from models.model import EndUser, Conversation, Message, MessageFile, App + +logger = logging.getLogger(__name__) + + +class ApplicationManager: + """ + This class is responsible for managing application + """ + + def generate(self, tenant_id: str, + app_id: str, + app_model_config_id: str, + app_model_config_dict: dict, + app_model_config_override: bool, + user: Union[Account, EndUser], + invoke_from: InvokeFrom, + inputs: dict[str, str], + query: Optional[str] = None, + files: Optional[list[FileObj]] = None, + conversation: Optional[Conversation] = None, + stream: bool = False, + extras: Optional[dict[str, Any]] = None) \ + -> Union[dict, Generator]: + """ + Generate App response. + + :param tenant_id: workspace ID + :param app_id: app ID + :param app_model_config_id: app model config id + :param app_model_config_dict: app model config dict + :param app_model_config_override: app model config override + :param user: account or end user + :param invoke_from: invoke from source + :param inputs: inputs + :param query: query + :param files: file obj list + :param conversation: conversation + :param stream: is stream + :param extras: extras + """ + # init task id + task_id = str(uuid.uuid4()) + + # init application generate entity + application_generate_entity = ApplicationGenerateEntity( + task_id=task_id, + tenant_id=tenant_id, + app_id=app_id, + app_model_config_id=app_model_config_id, + app_model_config_dict=app_model_config_dict, + app_orchestration_config_entity=self._convert_from_app_model_config_dict( + tenant_id=tenant_id, + app_model_config_dict=app_model_config_dict + ), + app_model_config_override=app_model_config_override, + conversation_id=conversation.id if conversation else None, + inputs=conversation.inputs if conversation else inputs, + query=query.replace('\x00', '') if query else None, + files=files if files else [], + user_id=user.id, + stream=stream, + invoke_from=invoke_from, + extras=extras + ) + + # init generate records + ( + conversation, + message + ) = self._init_generate_records(application_generate_entity) + + # init queue manager + queue_manager = ApplicationQueueManager( + task_id=application_generate_entity.task_id, + user_id=application_generate_entity.user_id, + invoke_from=application_generate_entity.invoke_from, + conversation_id=conversation.id, + app_mode=conversation.mode, + message_id=message.id + ) + + # new thread + worker_thread = threading.Thread(target=self._generate_worker, kwargs={ + 'flask_app': current_app._get_current_object(), + 'application_generate_entity': application_generate_entity, + 'queue_manager': queue_manager, + 'conversation_id': conversation.id, + 'message_id': message.id, + }) + + worker_thread.start() + + # return response or stream generator + return self._handle_response( + application_generate_entity=application_generate_entity, + queue_manager=queue_manager, + conversation=conversation, + message=message, + stream=stream + ) + + def _generate_worker(self, flask_app: Flask, + application_generate_entity: ApplicationGenerateEntity, + queue_manager: ApplicationQueueManager, + conversation_id: str, + message_id: str) -> None: + """ + Generate worker in a new thread. + :param flask_app: Flask app + :param application_generate_entity: application generate entity + :param queue_manager: queue manager + :param conversation_id: conversation ID + :param message_id: message ID + :return: + """ + with flask_app.app_context(): + try: + # get conversation and message + conversation = self._get_conversation(conversation_id) + message = self._get_message(message_id) + + if application_generate_entity.app_orchestration_config_entity.agent: + # agent app + runner = AgentApplicationRunner() + runner.run( + application_generate_entity=application_generate_entity, + queue_manager=queue_manager, + conversation=conversation, + message=message + ) + else: + # basic app + runner = BasicApplicationRunner() + runner.run( + application_generate_entity=application_generate_entity, + queue_manager=queue_manager, + conversation=conversation, + message=message + ) + except ConversationTaskStoppedException: + pass + except InvokeAuthorizationError: + queue_manager.publish_error(InvokeAuthorizationError('Incorrect API key provided')) + except ValidationError as e: + logger.exception("Validation Error when generating") + queue_manager.publish_error(e) + except (ValueError, InvokeError) as e: + queue_manager.publish_error(e) + except Exception as e: + logger.exception("Unknown Error when generating") + queue_manager.publish_error(e) + finally: + db.session.remove() + + def _handle_response(self, application_generate_entity: ApplicationGenerateEntity, + queue_manager: ApplicationQueueManager, + conversation: Conversation, + message: Message, + stream: bool = False) -> Union[dict, Generator]: + """ + Handle response. + :param application_generate_entity: application generate entity + :param queue_manager: queue manager + :param conversation: conversation + :param message: message + :param stream: is stream + :return: + """ + # init generate task pipeline + generate_task_pipeline = GenerateTaskPipeline( + application_generate_entity=application_generate_entity, + queue_manager=queue_manager, + conversation=conversation, + message=message + ) + + try: + return generate_task_pipeline.process(stream=stream) + except ValueError as e: + if e.args[0] == "I/O operation on closed file.": # ignore this error + raise ConversationTaskStoppedException() + else: + logger.exception(e) + raise e + finally: + db.session.remove() + + def _convert_from_app_model_config_dict(self, tenant_id: str, app_model_config_dict: dict) \ + -> AppOrchestrationConfigEntity: + """ + Convert app model config dict to entity. + :param tenant_id: tenant ID + :param app_model_config_dict: app model config dict + :raises ProviderTokenNotInitError: provider token not init error + :return: app orchestration config entity + """ + properties = {} + + copy_app_model_config_dict = app_model_config_dict.copy() + + provider_manager = ProviderManager() + provider_model_bundle = provider_manager.get_provider_model_bundle( + tenant_id=tenant_id, + provider=copy_app_model_config_dict['model']['provider'], + model_type=ModelType.LLM + ) + + provider_name = provider_model_bundle.configuration.provider.provider + model_name = copy_app_model_config_dict['model']['name'] + + model_type_instance = provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + # check model credentials + model_credentials = provider_model_bundle.configuration.get_current_credentials( + model_type=ModelType.LLM, + model=copy_app_model_config_dict['model']['name'] + ) + + if model_credentials is None: + raise ProviderTokenNotInitError(f"Model {model_name} credentials is not initialized.") + + # check model + provider_model = provider_model_bundle.configuration.get_provider_model( + model=copy_app_model_config_dict['model']['name'], + model_type=ModelType.LLM + ) + + if provider_model is None: + model_name = copy_app_model_config_dict['model']['name'] + raise ValueError(f"Model {model_name} not exist.") + + if provider_model.status == ModelStatus.NO_CONFIGURE: + raise ProviderTokenNotInitError(f"Model {model_name} credentials is not initialized.") + elif provider_model.status == ModelStatus.NO_PERMISSION: + raise ModelCurrentlyNotSupportError(f"Dify Hosted OpenAI {model_name} currently not support.") + elif provider_model.status == ModelStatus.QUOTA_EXCEEDED: + raise QuotaExceededError(f"Model provider {provider_name} quota exceeded.") + + # model config + completion_params = copy_app_model_config_dict['model'].get('completion_params') + stop = [] + if 'stop' in completion_params: + stop = completion_params['stop'] + del completion_params['stop'] + + # get model mode + model_mode = copy_app_model_config_dict['model'].get('mode') + if not model_mode: + mode_enum = model_type_instance.get_model_mode( + model=copy_app_model_config_dict['model']['name'], + credentials=model_credentials + ) + + model_mode = mode_enum.value + + model_schema = model_type_instance.get_model_schema( + copy_app_model_config_dict['model']['name'], + model_credentials + ) + + if not model_schema: + raise ValueError(f"Model {model_name} not exist.") + + properties['model_config'] = ModelConfigEntity( + provider=copy_app_model_config_dict['model']['provider'], + model=copy_app_model_config_dict['model']['name'], + model_schema=model_schema, + mode=model_mode, + provider_model_bundle=provider_model_bundle, + credentials=model_credentials, + parameters=completion_params, + stop=stop, + ) + + # prompt template + prompt_type = PromptTemplateEntity.PromptType.value_of(copy_app_model_config_dict['prompt_type']) + if prompt_type == PromptTemplateEntity.PromptType.SIMPLE: + simple_prompt_template = copy_app_model_config_dict.get("pre_prompt", "") + properties['prompt_template'] = PromptTemplateEntity( + prompt_type=prompt_type, + simple_prompt_template=simple_prompt_template + ) + else: + advanced_chat_prompt_template = None + chat_prompt_config = copy_app_model_config_dict.get("chat_prompt_config", {}) + if chat_prompt_config: + chat_prompt_messages = [] + for message in chat_prompt_config.get("prompt", []): + chat_prompt_messages.append({ + "text": message["text"], + "role": PromptMessageRole.value_of(message["role"]) + }) + + advanced_chat_prompt_template = AdvancedChatPromptTemplateEntity( + messages=chat_prompt_messages + ) + + advanced_completion_prompt_template = None + completion_prompt_config = copy_app_model_config_dict.get("completion_prompt_config", {}) + if completion_prompt_config: + completion_prompt_template_params = { + 'prompt': completion_prompt_config['prompt']['text'], + } + + if 'conversation_histories_role' in completion_prompt_config: + completion_prompt_template_params['role_prefix'] = { + 'user': completion_prompt_config['conversation_histories_role']['user_prefix'], + 'assistant': completion_prompt_config['conversation_histories_role']['assistant_prefix'] + } + + advanced_completion_prompt_template = AdvancedCompletionPromptTemplateEntity( + **completion_prompt_template_params + ) + + properties['prompt_template'] = PromptTemplateEntity( + prompt_type=prompt_type, + advanced_chat_prompt_template=advanced_chat_prompt_template, + advanced_completion_prompt_template=advanced_completion_prompt_template + ) + + # external data variables + properties['external_data_variables'] = [] + external_data_tools = copy_app_model_config_dict.get('external_data_tools', []) + for external_data_tool in external_data_tools: + if 'enabled' not in external_data_tool or not external_data_tool['enabled']: + continue + + properties['external_data_variables'].append( + ExternalDataVariableEntity( + variable=external_data_tool['variable'], + type=external_data_tool['type'], + config=external_data_tool['config'] + ) + ) + + # show retrieve source + show_retrieve_source = False + retriever_resource_dict = copy_app_model_config_dict.get('retriever_resource') + if retriever_resource_dict: + if 'enabled' in retriever_resource_dict and retriever_resource_dict['enabled']: + show_retrieve_source = True + + properties['show_retrieve_source'] = show_retrieve_source + + if 'agent_mode' in copy_app_model_config_dict and copy_app_model_config_dict['agent_mode'] \ + and 'enabled' in copy_app_model_config_dict['agent_mode'] and copy_app_model_config_dict['agent_mode'][ + 'enabled']: + agent_dict = copy_app_model_config_dict.get('agent_mode') + if agent_dict['strategy'] in ['router', 'react_router']: + dataset_ids = [] + for tool in agent_dict.get('tools', []): + key = list(tool.keys())[0] + + if key != 'dataset': + continue + + tool_item = tool[key] + + if "enabled" not in tool_item or not tool_item["enabled"]: + continue + + dataset_id = tool_item['id'] + dataset_ids.append(dataset_id) + + dataset_configs = copy_app_model_config_dict.get('dataset_configs', {'retrieval_model': 'single'}) + query_variable = copy_app_model_config_dict.get('dataset_query_variable') + if dataset_configs['retrieval_model'] == 'single': + properties['dataset'] = DatasetEntity( + dataset_ids=dataset_ids, + retrieve_config=DatasetRetrieveConfigEntity( + query_variable=query_variable, + retrieve_strategy=DatasetRetrieveConfigEntity.RetrieveStrategy.value_of( + dataset_configs['retrieval_model'] + ), + single_strategy=agent_dict['strategy'] + ) + ) + else: + properties['dataset'] = DatasetEntity( + dataset_ids=dataset_ids, + retrieve_config=DatasetRetrieveConfigEntity( + query_variable=query_variable, + retrieve_strategy=DatasetRetrieveConfigEntity.RetrieveStrategy.value_of( + dataset_configs['retrieval_model'] + ), + top_k=dataset_configs.get('top_k'), + score_threshold=dataset_configs.get('score_threshold'), + reranking_model=dataset_configs.get('reranking_model') + ) + ) + else: + if agent_dict['strategy'] == 'react': + strategy = AgentEntity.Strategy.CHAIN_OF_THOUGHT + else: + strategy = AgentEntity.Strategy.FUNCTION_CALLING + + agent_tools = [] + for tool in agent_dict.get('tools', []): + key = list(tool.keys())[0] + tool_item = tool[key] + + agent_tool_properties = { + "tool_id": key + } + + if "enabled" not in tool_item or not tool_item["enabled"]: + continue + + agent_tool_properties["config"] = tool_item + agent_tools.append(AgentToolEntity(**agent_tool_properties)) + + properties['agent'] = AgentEntity( + provider=properties['model_config'].provider, + model=properties['model_config'].model, + strategy=strategy, + tools=agent_tools + ) + + # file upload + file_upload_dict = copy_app_model_config_dict.get('file_upload') + if file_upload_dict: + if 'image' in file_upload_dict and file_upload_dict['image']: + if 'enabled' in file_upload_dict['image'] and file_upload_dict['image']['enabled']: + properties['file_upload'] = FileUploadEntity( + image_config={ + 'number_limits': file_upload_dict['image']['number_limits'], + 'detail': file_upload_dict['image']['detail'], + 'transfer_methods': file_upload_dict['image']['transfer_methods'] + } + ) + + # opening statement + properties['opening_statement'] = copy_app_model_config_dict.get('opening_statement') + + # suggested questions after answer + suggested_questions_after_answer_dict = copy_app_model_config_dict.get('suggested_questions_after_answer') + if suggested_questions_after_answer_dict: + if 'enabled' in suggested_questions_after_answer_dict and suggested_questions_after_answer_dict['enabled']: + properties['suggested_questions_after_answer'] = True + + # more like this + more_like_this_dict = copy_app_model_config_dict.get('more_like_this') + if more_like_this_dict: + if 'enabled' in more_like_this_dict and more_like_this_dict['enabled']: + properties['more_like_this'] = copy_app_model_config_dict.get('opening_statement') + + # speech to text + speech_to_text_dict = copy_app_model_config_dict.get('speech_to_text') + if speech_to_text_dict: + if 'enabled' in speech_to_text_dict and speech_to_text_dict['enabled']: + properties['speech_to_text'] = True + + # sensitive word avoidance + sensitive_word_avoidance_dict = copy_app_model_config_dict.get('sensitive_word_avoidance') + if sensitive_word_avoidance_dict: + if 'enabled' in sensitive_word_avoidance_dict and sensitive_word_avoidance_dict['enabled']: + properties['sensitive_word_avoidance'] = SensitiveWordAvoidanceEntity( + type=sensitive_word_avoidance_dict.get('type'), + config=sensitive_word_avoidance_dict.get('config'), + ) + + return AppOrchestrationConfigEntity(**properties) + + def _init_generate_records(self, application_generate_entity: ApplicationGenerateEntity) \ + -> Tuple[Conversation, Message]: + """ + Initialize generate records + :param application_generate_entity: application generate entity + :return: + """ + app_orchestration_config_entity = application_generate_entity.app_orchestration_config_entity + + model_type_instance = app_orchestration_config_entity.model_config.provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + model_schema = model_type_instance.get_model_schema( + model=app_orchestration_config_entity.model_config.model, + credentials=app_orchestration_config_entity.model_config.credentials + ) + + app_record = (db.session.query(App) + .filter(App.id == application_generate_entity.app_id).first()) + + app_mode = app_record.mode + + # get from source + end_user_id = None + account_id = None + if application_generate_entity.invoke_from in [InvokeFrom.WEB_APP, InvokeFrom.SERVICE_API]: + from_source = 'api' + end_user_id = application_generate_entity.user_id + else: + from_source = 'console' + account_id = application_generate_entity.user_id + + override_model_configs = None + if application_generate_entity.app_model_config_override: + override_model_configs = application_generate_entity.app_model_config_dict + + introduction = '' + if app_mode == 'chat': + # get conversation introduction + introduction = self._get_conversation_introduction(application_generate_entity) + + if not application_generate_entity.conversation_id: + conversation = Conversation( + app_id=app_record.id, + app_model_config_id=application_generate_entity.app_model_config_id, + model_provider=app_orchestration_config_entity.model_config.provider, + model_id=app_orchestration_config_entity.model_config.model, + override_model_configs=json.dumps(override_model_configs) if override_model_configs else None, + mode=app_mode, + name='New conversation', + inputs=application_generate_entity.inputs, + introduction=introduction, + system_instruction="", + system_instruction_tokens=0, + status='normal', + from_source=from_source, + from_end_user_id=end_user_id, + from_account_id=account_id, + ) + + db.session.add(conversation) + db.session.commit() + else: + conversation = ( + db.session.query(Conversation) + .filter( + Conversation.id == application_generate_entity.conversation_id, + Conversation.app_id == app_record.id + ).first() + ) + + currency = model_schema.pricing.currency if model_schema.pricing else 'USD' + + message = Message( + app_id=app_record.id, + model_provider=app_orchestration_config_entity.model_config.provider, + model_id=app_orchestration_config_entity.model_config.model, + override_model_configs=json.dumps(override_model_configs) if override_model_configs else None, + conversation_id=conversation.id, + inputs=application_generate_entity.inputs, + query=application_generate_entity.query or "", + message="", + message_tokens=0, + message_unit_price=0, + message_price_unit=0, + answer="", + answer_tokens=0, + answer_unit_price=0, + answer_price_unit=0, + provider_response_latency=0, + total_price=0, + currency=currency, + from_source=from_source, + from_end_user_id=end_user_id, + from_account_id=account_id, + agent_based=app_orchestration_config_entity.agent is not None + ) + + db.session.add(message) + db.session.commit() + + for file in application_generate_entity.files: + message_file = MessageFile( + message_id=message.id, + type=file.type.value, + transfer_method=file.transfer_method.value, + url=file.url, + upload_file_id=file.upload_file_id, + created_by_role=('account' if account_id else 'end_user'), + created_by=account_id or end_user_id, + ) + db.session.add(message_file) + db.session.commit() + + return conversation, message + + def _get_conversation_introduction(self, application_generate_entity: ApplicationGenerateEntity) -> str: + """ + Get conversation introduction + :param application_generate_entity: application generate entity + :return: conversation introduction + """ + app_orchestration_config_entity = application_generate_entity.app_orchestration_config_entity + introduction = app_orchestration_config_entity.opening_statement + + if introduction: + try: + inputs = application_generate_entity.inputs + prompt_template = PromptTemplateParser(template=introduction) + prompt_inputs = {k: inputs[k] for k in prompt_template.variable_keys if k in inputs} + introduction = prompt_template.format(prompt_inputs) + except KeyError: + pass + + return introduction + + def _get_conversation(self, conversation_id: str) -> Conversation: + """ + Get conversation by conversation id + :param conversation_id: conversation id + :return: conversation + """ + conversation = ( + db.session.query(Conversation) + .filter(Conversation.id == conversation_id) + .first() + ) + + return conversation + + def _get_message(self, message_id: str) -> Message: + """ + Get message by message id + :param message_id: message id + :return: message + """ + message = ( + db.session.query(Message) + .filter(Message.id == message_id) + .first() + ) + + return message diff --git a/api/core/application_queue_manager.py b/api/core/application_queue_manager.py new file mode 100644 index 00000000000000..fd549ff39f1424 --- /dev/null +++ b/api/core/application_queue_manager.py @@ -0,0 +1,228 @@ +import queue +import time +from typing import Generator, Any + +from sqlalchemy.orm import DeclarativeMeta + +from core.entities.application_entities import InvokeFrom +from core.entities.queue_entities import QueueStopEvent, AppQueueEvent, QueuePingEvent, QueueErrorEvent, \ + QueueAgentThoughtEvent, QueueMessageEndEvent, QueueRetrieverResourcesEvent, QueueMessageReplaceEvent, \ + QueueMessageEvent, QueueMessage, AnnotationReplyEvent +from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk +from extensions.ext_redis import redis_client +from models.model import MessageAgentThought + + +class ApplicationQueueManager: + def __init__(self, task_id: str, + user_id: str, + invoke_from: InvokeFrom, + conversation_id: str, + app_mode: str, + message_id: str) -> None: + if not user_id: + raise ValueError("user is required") + + self._task_id = task_id + self._user_id = user_id + self._invoke_from = invoke_from + self._conversation_id = str(conversation_id) + self._app_mode = app_mode + self._message_id = str(message_id) + + user_prefix = 'account' if self._invoke_from in [InvokeFrom.EXPLORE, InvokeFrom.DEBUGGER] else 'end-user' + redis_client.setex(ApplicationQueueManager._generate_task_belong_cache_key(self._task_id), 1800, f"{user_prefix}-{self._user_id}") + + q = queue.Queue() + + self._q = q + + def listen(self) -> Generator: + """ + Listen to queue + :return: + """ + # wait for 10 minutes to stop listen + listen_timeout = 600 + start_time = time.time() + last_ping_time = 0 + + while True: + try: + message = self._q.get(timeout=1) + if message is None: + break + + yield message + except queue.Empty: + continue + finally: + elapsed_time = time.time() - start_time + if elapsed_time >= listen_timeout or self._is_stopped(): + # publish two messages to make sure the client can receive the stop signal + # and stop listening after the stop signal processed + self.publish(QueueStopEvent(stopped_by=QueueStopEvent.StopBy.USER_MANUAL)) + self.stop_listen() + + if elapsed_time // 10 > last_ping_time: + self.publish(QueuePingEvent()) + last_ping_time = elapsed_time // 10 + + def stop_listen(self) -> None: + """ + Stop listen to queue + :return: + """ + self._q.put(None) + + def publish_chunk_message(self, chunk: LLMResultChunk) -> None: + """ + Publish chunk message to channel + + :param chunk: chunk + :return: + """ + self.publish(QueueMessageEvent( + chunk=chunk + )) + + def publish_message_replace(self, text: str) -> None: + """ + Publish message replace + :param text: text + :return: + """ + self.publish(QueueMessageReplaceEvent( + text=text + )) + + def publish_retriever_resources(self, retriever_resources: list[dict]) -> None: + """ + Publish retriever resources + :return: + """ + self.publish(QueueRetrieverResourcesEvent(retriever_resources=retriever_resources)) + + def publish_annotation_reply(self, message_annotation_id: str) -> None: + """ + Publish annotation reply + :param message_annotation_id: message annotation id + :return: + """ + self.publish(AnnotationReplyEvent(message_annotation_id=message_annotation_id)) + + def publish_message_end(self, llm_result: LLMResult) -> None: + """ + Publish message end + :param llm_result: llm result + :return: + """ + self.publish(QueueMessageEndEvent(llm_result=llm_result)) + self.stop_listen() + + def publish_agent_thought(self, message_agent_thought: MessageAgentThought) -> None: + """ + Publish agent thought + :param message_agent_thought: message agent thought + :return: + """ + self.publish(QueueAgentThoughtEvent( + agent_thought_id=message_agent_thought.id + )) + + def publish_error(self, e) -> None: + """ + Publish error + :param e: error + :return: + """ + self.publish(QueueErrorEvent( + error=e + )) + self.stop_listen() + + def publish(self, event: AppQueueEvent) -> None: + """ + Publish event to queue + :param event: + :return: + """ + self._check_for_sqlalchemy_models(event.dict()) + + message = QueueMessage( + task_id=self._task_id, + message_id=self._message_id, + conversation_id=self._conversation_id, + app_mode=self._app_mode, + event=event + ) + + self._q.put(message) + + if isinstance(event, QueueStopEvent): + self.stop_listen() + + @classmethod + def set_stop_flag(cls, task_id: str, invoke_from: InvokeFrom, user_id: str) -> None: + """ + Set task stop flag + :return: + """ + result = redis_client.get(cls._generate_task_belong_cache_key(task_id)) + if result is None: + return + + user_prefix = 'account' if invoke_from in [InvokeFrom.EXPLORE, InvokeFrom.DEBUGGER] else 'end-user' + if result != f"{user_prefix}-{user_id}": + return + + stopped_cache_key = cls._generate_stopped_cache_key(task_id) + redis_client.setex(stopped_cache_key, 600, 1) + + def _is_stopped(self) -> bool: + """ + Check if task is stopped + :return: + """ + stopped_cache_key = ApplicationQueueManager._generate_stopped_cache_key(self._task_id) + result = redis_client.get(stopped_cache_key) + if result is not None: + redis_client.delete(stopped_cache_key) + return True + + return False + + @classmethod + def _generate_task_belong_cache_key(cls, task_id: str) -> str: + """ + Generate task belong cache key + :param task_id: task id + :return: + """ + return f"generate_task_belong:{task_id}" + + @classmethod + def _generate_stopped_cache_key(cls, task_id: str) -> str: + """ + Generate stopped cache key + :param task_id: task id + :return: + """ + return f"generate_task_stopped:{task_id}" + + def _check_for_sqlalchemy_models(self, data: Any): + # from entity to dict or list + if isinstance(data, dict): + for key, value in data.items(): + self._check_for_sqlalchemy_models(value) + elif isinstance(data, list): + for item in data: + self._check_for_sqlalchemy_models(item) + else: + if isinstance(data, DeclarativeMeta) or hasattr(data, '_sa_instance_state'): + raise TypeError("Critical Error: Passing SQLAlchemy Model instances " + "that cause thread safety issues is not allowed.") + + +class ConversationTaskStoppedException(Exception): + pass diff --git a/api/core/callback_handler/agent_loop_gather_callback_handler.py b/api/core/callback_handler/agent_loop_gather_callback_handler.py index 218a9e4e07f495..ec2964f2afdc6d 100644 --- a/api/core/callback_handler/agent_loop_gather_callback_handler.py +++ b/api/core/callback_handler/agent_loop_gather_callback_handler.py @@ -2,30 +2,40 @@ import logging import time -from typing import Any, Dict, List, Union, Optional +from typing import Any, Dict, List, Union, Optional, cast from langchain.agents import openai_functions_agent, openai_functions_multi_agent from langchain.callbacks.base import BaseCallbackHandler from langchain.schema import AgentAction, AgentFinish, LLMResult, ChatGeneration, BaseMessage +from core.application_queue_manager import ApplicationQueueManager from core.callback_handler.entity.agent_loop import AgentLoop -from core.conversation_message_task import ConversationMessageTask -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.llm.base import BaseLLM +from core.entities.application_entities import ModelConfigEntity +from core.model_runtime.entities.llm_entities import LLMResult as RuntimeLLMResult +from core.model_runtime.entities.message_entities import UserPromptMessage, AssistantPromptMessage, PromptMessage +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from extensions.ext_database import db +from models.model import MessageChain, MessageAgentThought, Message class AgentLoopGatherCallbackHandler(BaseCallbackHandler): """Callback Handler that prints to std out.""" raise_error: bool = True - def __init__(self, model_instance: BaseLLM, conversation_message_task: ConversationMessageTask) -> None: + def __init__(self, model_config: ModelConfigEntity, + queue_manager: ApplicationQueueManager, + message: Message, + message_chain: MessageChain) -> None: """Initialize callback handler.""" - self.model_instance = model_instance - self.conversation_message_task = conversation_message_task + self.model_config = model_config + self.queue_manager = queue_manager + self.message = message + self.message_chain = message_chain + model_type_instance = self.model_config.provider_model_bundle.model_type_instance + self.model_type_instance = cast(LargeLanguageModel, model_type_instance) self._agent_loops = [] self._current_loop = None self._message_agent_thought = None - self.current_chain = None @property def agent_loops(self) -> List[AgentLoop]: @@ -46,66 +56,61 @@ def ignore_chain(self) -> bool: """Whether to ignore chain callbacks.""" return True - def on_chat_model_start( - self, - serialized: Dict[str, Any], - messages: List[List[BaseMessage]], - **kwargs: Any - ) -> Any: - if not self._current_loop: - # Agent start with a LLM query - self._current_loop = AgentLoop( - position=len(self._agent_loops) + 1, - prompt="\n".join([message.content for message in messages[0]]), - status='llm_started', - started_at=time.perf_counter() - ) - - def on_llm_start( - self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any - ) -> None: - """Print out the prompts.""" - # serialized={'name': 'OpenAI'} - # prompts=['Answer the following questions...\nThought:'] - # kwargs={} + def on_llm_before_invoke(self, prompt_messages: list[PromptMessage]) -> None: if not self._current_loop: # Agent start with a LLM query self._current_loop = AgentLoop( position=len(self._agent_loops) + 1, - prompt=prompts[0], + prompt="\n".join([prompt_message.content for prompt_message in prompt_messages]), status='llm_started', started_at=time.perf_counter() ) - def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None: - """Do nothing.""" - # kwargs={} + def on_llm_after_invoke(self, result: RuntimeLLMResult) -> None: if self._current_loop and self._current_loop.status == 'llm_started': self._current_loop.status = 'llm_end' - if response.llm_output: - self._current_loop.prompt_tokens = response.llm_output['token_usage']['prompt_tokens'] + if result.usage: + self._current_loop.prompt_tokens = result.usage.prompt_tokens else: - self._current_loop.prompt_tokens = self.model_instance.get_num_tokens( - [PromptMessage(content=self._current_loop.prompt)] + self._current_loop.prompt_tokens = self.model_type_instance.get_num_tokens( + model=self.model_config.model, + credentials=self.model_config.credentials, + prompt_messages=[UserPromptMessage(content=self._current_loop.prompt)] ) - completion_generation = response.generations[0][0] - if isinstance(completion_generation, ChatGeneration): - completion_message = completion_generation.message - if 'function_call' in completion_message.additional_kwargs: - self._current_loop.completion \ - = json.dumps({'function_call': completion_message.additional_kwargs['function_call']}) - else: - self._current_loop.completion = response.generations[0][0].text + + completion_message = result.message + if completion_message.tool_calls: + self._current_loop.completion \ + = json.dumps({'function_call': completion_message.tool_calls}) else: - self._current_loop.completion = completion_generation.text + self._current_loop.completion = completion_message.content - if response.llm_output: - self._current_loop.completion_tokens = response.llm_output['token_usage']['completion_tokens'] + if result.usage: + self._current_loop.completion_tokens = result.usage.completion_tokens else: - self._current_loop.completion_tokens = self.model_instance.get_num_tokens( - [PromptMessage(content=self._current_loop.completion)] + self._current_loop.completion_tokens = self.model_type_instance.get_num_tokens( + model=self.model_config.model, + credentials=self.model_config.credentials, + prompt_messages=[AssistantPromptMessage(content=self._current_loop.completion)] ) + def on_chat_model_start( + self, + serialized: Dict[str, Any], + messages: List[List[BaseMessage]], + **kwargs: Any + ) -> Any: + pass + + def on_llm_start( + self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any + ) -> None: + pass + + def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None: + """Do nothing.""" + pass + def on_llm_error( self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any ) -> None: @@ -150,10 +155,7 @@ def on_agent_action( if completion is not None: self._current_loop.completion = completion - self._message_agent_thought = self.conversation_message_task.on_agent_start( - self.current_chain, - self._current_loop - ) + self._message_agent_thought = self._init_agent_thought() def on_tool_end( self, @@ -176,9 +178,7 @@ def on_tool_end( self._current_loop.completed_at = time.perf_counter() self._current_loop.latency = self._current_loop.completed_at - self._current_loop.started_at - self.conversation_message_task.on_agent_end( - self._message_agent_thought, self.model_instance, self._current_loop - ) + self._complete_agent_thought(self._message_agent_thought) self._agent_loops.append(self._current_loop) self._current_loop = None @@ -202,17 +202,62 @@ def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> Any: self._current_loop.completed_at = time.perf_counter() self._current_loop.latency = self._current_loop.completed_at - self._current_loop.started_at self._current_loop.thought = '[DONE]' - self._message_agent_thought = self.conversation_message_task.on_agent_start( - self.current_chain, - self._current_loop - ) + self._message_agent_thought = self._init_agent_thought() - self.conversation_message_task.on_agent_end( - self._message_agent_thought, self.model_instance, self._current_loop - ) + self._complete_agent_thought(self._message_agent_thought) self._agent_loops.append(self._current_loop) self._current_loop = None self._message_agent_thought = None elif not self._current_loop and self._agent_loops: self._agent_loops[-1].status = 'agent_finish' + + def _init_agent_thought(self) -> MessageAgentThought: + message_agent_thought = MessageAgentThought( + message_id=self.message.id, + message_chain_id=self.message_chain.id, + position=self._current_loop.position, + thought=self._current_loop.thought, + tool=self._current_loop.tool_name, + tool_input=self._current_loop.tool_input, + message=self._current_loop.prompt, + message_price_unit=0, + answer=self._current_loop.completion, + answer_price_unit=0, + created_by_role=('account' if self.message.from_source == 'console' else 'end_user'), + created_by=(self.message.from_account_id + if self.message.from_source == 'console' else self.message.from_end_user_id) + ) + + db.session.add(message_agent_thought) + db.session.commit() + + self.queue_manager.publish_agent_thought(message_agent_thought) + + return message_agent_thought + + def _complete_agent_thought(self, message_agent_thought: MessageAgentThought) -> None: + loop_message_tokens = self._current_loop.prompt_tokens + loop_answer_tokens = self._current_loop.completion_tokens + + # transform usage + llm_usage = self.model_type_instance._calc_response_usage( + self.model_config.model, + self.model_config.credentials, + loop_message_tokens, + loop_answer_tokens + ) + + message_agent_thought.observation = self._current_loop.tool_output + message_agent_thought.tool_process_data = '' # currently not support + message_agent_thought.message_token = loop_message_tokens + message_agent_thought.message_unit_price = llm_usage.prompt_unit_price + message_agent_thought.message_price_unit = llm_usage.prompt_price_unit + message_agent_thought.answer_token = loop_answer_tokens + message_agent_thought.answer_unit_price = llm_usage.completion_unit_price + message_agent_thought.answer_price_unit = llm_usage.completion_price_unit + message_agent_thought.latency = self._current_loop.latency + message_agent_thought.tokens = self._current_loop.prompt_tokens + self._current_loop.completion_tokens + message_agent_thought.total_price = llm_usage.total_price + message_agent_thought.currency = llm_usage.currency + db.session.commit() diff --git a/api/core/callback_handler/dataset_tool_callback_handler.py b/api/core/callback_handler/dataset_tool_callback_handler.py deleted file mode 100644 index b1f9b8c6023752..00000000000000 --- a/api/core/callback_handler/dataset_tool_callback_handler.py +++ /dev/null @@ -1,74 +0,0 @@ -import json -import logging -from json import JSONDecodeError - -from typing import Any, Dict, List, Union, Optional - -from langchain.callbacks.base import BaseCallbackHandler - -from core.callback_handler.entity.dataset_query import DatasetQueryObj -from core.conversation_message_task import ConversationMessageTask - - -class DatasetToolCallbackHandler(BaseCallbackHandler): - """Callback Handler that prints to std out.""" - raise_error: bool = True - - def __init__(self, conversation_message_task: ConversationMessageTask) -> None: - """Initialize callback handler.""" - self.queries = [] - self.conversation_message_task = conversation_message_task - - @property - def always_verbose(self) -> bool: - """Whether to call verbose callbacks even if verbose is False.""" - return True - - @property - def ignore_llm(self) -> bool: - """Whether to ignore LLM callbacks.""" - return True - - @property - def ignore_chain(self) -> bool: - """Whether to ignore chain callbacks.""" - return True - - @property - def ignore_agent(self) -> bool: - """Whether to ignore agent callbacks.""" - return False - - def on_tool_start( - self, - serialized: Dict[str, Any], - input_str: str, - **kwargs: Any, - ) -> None: - tool_name: str = serialized.get('name') - dataset_id = tool_name.removeprefix('dataset-') - - try: - input_dict = json.loads(input_str.replace("'", "\"")) - query = input_dict.get('query') - except JSONDecodeError: - query = input_str - - self.conversation_message_task.on_dataset_query_end(DatasetQueryObj(dataset_id=dataset_id, query=query)) - - def on_tool_end( - self, - output: str, - color: Optional[str] = None, - observation_prefix: Optional[str] = None, - llm_prefix: Optional[str] = None, - **kwargs: Any, - ) -> None: - pass - - - def on_tool_error( - self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any - ) -> None: - """Do nothing.""" - logging.debug("Dataset tool on_llm_error: %s", error) diff --git a/api/core/callback_handler/entity/chain_result.py b/api/core/callback_handler/entity/chain_result.py deleted file mode 100644 index 596486cdb07644..00000000000000 --- a/api/core/callback_handler/entity/chain_result.py +++ /dev/null @@ -1,16 +0,0 @@ -from pydantic import BaseModel - - -class ChainResult(BaseModel): - type: str = None - prompt: dict = None - completion: dict = None - - status: str = 'chain_started' - completed: bool = False - - started_at: float = None - completed_at: float = None - - agent_result: dict = None - """only when type is 'AgentExecutor'""" diff --git a/api/core/callback_handler/entity/dataset_query.py b/api/core/callback_handler/entity/dataset_query.py deleted file mode 100644 index 23705e55ac2c4a..00000000000000 --- a/api/core/callback_handler/entity/dataset_query.py +++ /dev/null @@ -1,6 +0,0 @@ -from pydantic import BaseModel - - -class DatasetQueryObj(BaseModel): - dataset_id: str = None - query: str = None diff --git a/api/core/callback_handler/entity/llm_message.py b/api/core/callback_handler/entity/llm_message.py deleted file mode 100644 index 61967340c7379a..00000000000000 --- a/api/core/callback_handler/entity/llm_message.py +++ /dev/null @@ -1,8 +0,0 @@ -from pydantic import BaseModel - - -class LLMMessage(BaseModel): - prompt: str = '' - prompt_tokens: int = 0 - completion: str = '' - completion_tokens: int = 0 diff --git a/api/core/callback_handler/index_tool_callback_handler.py b/api/core/callback_handler/index_tool_callback_handler.py index ec91d67290d6a1..bfd305e2f727d2 100644 --- a/api/core/callback_handler/index_tool_callback_handler.py +++ b/api/core/callback_handler/index_tool_callback_handler.py @@ -1,17 +1,44 @@ -from typing import List +from typing import List, Union from langchain.schema import Document -from core.conversation_message_task import ConversationMessageTask +from core.application_queue_manager import ApplicationQueueManager +from core.entities.application_entities import InvokeFrom from extensions.ext_database import db -from models.dataset import DocumentSegment +from models.dataset import DocumentSegment, DatasetQuery +from models.model import DatasetRetrieverResource class DatasetIndexToolCallbackHandler: """Callback handler for dataset tool.""" - def __init__(self, conversation_message_task: ConversationMessageTask) -> None: - self.conversation_message_task = conversation_message_task + def __init__(self, queue_manager: ApplicationQueueManager, + app_id: str, + message_id: str, + user_id: str, + invoke_from: InvokeFrom) -> None: + self._queue_manager = queue_manager + self._app_id = app_id + self._message_id = message_id + self._user_id = user_id + self._invoke_from = invoke_from + + def on_query(self, query: str, dataset_id: str) -> None: + """ + Handle query. + """ + dataset_query = DatasetQuery( + dataset_id=dataset_id, + content=query, + source='app', + source_app_id=self._app_id, + created_by_role=('account' + if self._invoke_from in [InvokeFrom.EXPLORE, InvokeFrom.DEBUGGER] else 'end_user'), + created_by=self._user_id + ) + + db.session.add(dataset_query) + db.session.commit() def on_tool_end(self, documents: List[Document]) -> None: """Handle tool end.""" @@ -30,4 +57,27 @@ def on_tool_end(self, documents: List[Document]) -> None: def return_retriever_resource_info(self, resource: List): """Handle return_retriever_resource_info.""" - self.conversation_message_task.on_dataset_query_finish(resource) + if resource and len(resource) > 0: + for item in resource: + dataset_retriever_resource = DatasetRetrieverResource( + message_id=self._message_id, + position=item.get('position'), + dataset_id=item.get('dataset_id'), + dataset_name=item.get('dataset_name'), + document_id=item.get('document_id'), + document_name=item.get('document_name'), + data_source_type=item.get('data_source_type'), + segment_id=item.get('segment_id'), + score=item.get('score') if 'score' in item else None, + hit_count=item.get('hit_count') if 'hit_count' else None, + word_count=item.get('word_count') if 'word_count' in item else None, + segment_position=item.get('segment_position') if 'segment_position' in item else None, + index_node_hash=item.get('index_node_hash') if 'index_node_hash' in item else None, + content=item.get('content'), + retriever_from=item.get('retriever_from'), + created_by=self._user_id + ) + db.session.add(dataset_retriever_resource) + db.session.commit() + + self._queue_manager.publish_retriever_resources(resource) diff --git a/api/core/callback_handler/llm_callback_handler.py b/api/core/callback_handler/llm_callback_handler.py deleted file mode 100644 index 8cd8c693d036ce..00000000000000 --- a/api/core/callback_handler/llm_callback_handler.py +++ /dev/null @@ -1,284 +0,0 @@ -import logging -import threading -import time -from typing import Any, Dict, List, Union, Optional - -from flask import Flask, current_app -from langchain.callbacks.base import BaseCallbackHandler -from langchain.schema import LLMResult, BaseMessage -from pydantic import BaseModel - -from core.callback_handler.entity.llm_message import LLMMessage -from core.conversation_message_task import ConversationMessageTask, ConversationTaskStoppedException, \ - ConversationTaskInterruptException -from core.model_providers.models.entity.message import to_prompt_messages, PromptMessage, LCHumanMessageWithFiles, \ - ImagePromptMessageFile -from core.model_providers.models.llm.base import BaseLLM -from core.moderation.base import ModerationOutputsResult, ModerationAction -from core.moderation.factory import ModerationFactory - - -class ModerationRule(BaseModel): - type: str - config: Dict[str, Any] - - -class LLMCallbackHandler(BaseCallbackHandler): - raise_error: bool = True - - def __init__(self, model_instance: BaseLLM, - conversation_message_task: ConversationMessageTask): - self.model_instance = model_instance - self.llm_message = LLMMessage() - self.start_at = None - self.conversation_message_task = conversation_message_task - - self.output_moderation_handler = None - self.init_output_moderation() - - def init_output_moderation(self): - app_model_config = self.conversation_message_task.app_model_config - sensitive_word_avoidance_dict = app_model_config.sensitive_word_avoidance_dict - - if sensitive_word_avoidance_dict and sensitive_word_avoidance_dict.get("enabled"): - self.output_moderation_handler = OutputModerationHandler( - tenant_id=self.conversation_message_task.tenant_id, - app_id=self.conversation_message_task.app.id, - rule=ModerationRule( - type=sensitive_word_avoidance_dict.get("type"), - config=sensitive_word_avoidance_dict.get("config") - ), - on_message_replace_func=self.conversation_message_task.on_message_replace - ) - - @property - def always_verbose(self) -> bool: - """Whether to call verbose callbacks even if verbose is False.""" - return True - - def on_chat_model_start( - self, - serialized: Dict[str, Any], - messages: List[List[BaseMessage]], - **kwargs: Any - ) -> Any: - real_prompts = [] - for message in messages[0]: - if message.type == 'human': - role = 'user' - elif message.type == 'ai': - role = 'assistant' - else: - role = 'system' - - real_prompts.append({ - "role": role, - "text": message.content, - "files": [{ - "type": file.type.value, - "data": file.data[:10] + '...[TRUNCATED]...' + file.data[-10:], - "detail": file.detail.value if isinstance(file, ImagePromptMessageFile) else None, - } for file in (message.files if isinstance(message, LCHumanMessageWithFiles) else [])] - }) - - self.llm_message.prompt = real_prompts - self.llm_message.prompt_tokens = self.model_instance.get_num_tokens(to_prompt_messages(messages[0])) - - def on_llm_start( - self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any - ) -> None: - self.llm_message.prompt = [{ - "role": 'user', - "text": prompts[0] - }] - - self.llm_message.prompt_tokens = self.model_instance.get_num_tokens([PromptMessage(content=prompts[0])]) - - def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None: - if self.output_moderation_handler: - self.output_moderation_handler.stop_thread() - - self.llm_message.completion = self.output_moderation_handler.moderation_completion( - completion=response.generations[0][0].text, - public_event=True if self.conversation_message_task.streaming else False - ) - else: - self.llm_message.completion = response.generations[0][0].text - - if not self.conversation_message_task.streaming: - self.conversation_message_task.append_message_text(self.llm_message.completion) - - if response.llm_output and 'token_usage' in response.llm_output: - if 'prompt_tokens' in response.llm_output['token_usage']: - self.llm_message.prompt_tokens = response.llm_output['token_usage']['prompt_tokens'] - - if 'completion_tokens' in response.llm_output['token_usage']: - self.llm_message.completion_tokens = response.llm_output['token_usage']['completion_tokens'] - else: - self.llm_message.completion_tokens = self.model_instance.get_num_tokens( - [PromptMessage(content=self.llm_message.completion)]) - else: - self.llm_message.completion_tokens = self.model_instance.get_num_tokens( - [PromptMessage(content=self.llm_message.completion)]) - - self.conversation_message_task.save_message(self.llm_message) - - def on_llm_new_token(self, token: str, **kwargs: Any) -> None: - if self.output_moderation_handler and self.output_moderation_handler.should_direct_output(): - # stop subscribe new token when output moderation should direct output - ex = ConversationTaskInterruptException() - self.on_llm_error(error=ex) - raise ex - - try: - self.conversation_message_task.append_message_text(token) - self.llm_message.completion += token - - if self.output_moderation_handler: - self.output_moderation_handler.append_new_token(token) - except ConversationTaskStoppedException as ex: - self.on_llm_error(error=ex) - raise ex - - def on_llm_error( - self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any - ) -> None: - """Do nothing.""" - if self.output_moderation_handler: - self.output_moderation_handler.stop_thread() - - if isinstance(error, ConversationTaskStoppedException): - if self.conversation_message_task.streaming: - self.llm_message.completion_tokens = self.model_instance.get_num_tokens( - [PromptMessage(content=self.llm_message.completion)] - ) - self.conversation_message_task.save_message(llm_message=self.llm_message, by_stopped=True) - if isinstance(error, ConversationTaskInterruptException): - self.llm_message.completion = self.output_moderation_handler.get_final_output() - self.llm_message.completion_tokens = self.model_instance.get_num_tokens( - [PromptMessage(content=self.llm_message.completion)] - ) - self.conversation_message_task.save_message(llm_message=self.llm_message) - else: - logging.debug("on_llm_error: %s", error) - - -class OutputModerationHandler(BaseModel): - DEFAULT_BUFFER_SIZE: int = 300 - - tenant_id: str - app_id: str - - rule: ModerationRule - on_message_replace_func: Any - - thread: Optional[threading.Thread] = None - thread_running: bool = True - buffer: str = '' - is_final_chunk: bool = False - final_output: Optional[str] = None - - class Config: - arbitrary_types_allowed = True - - def should_direct_output(self): - return self.final_output is not None - - def get_final_output(self): - return self.final_output - - def append_new_token(self, token: str): - self.buffer += token - - if not self.thread: - self.thread = self.start_thread() - - def moderation_completion(self, completion: str, public_event: bool = False) -> str: - self.buffer = completion - self.is_final_chunk = True - - result = self.moderation( - tenant_id=self.tenant_id, - app_id=self.app_id, - moderation_buffer=completion - ) - - if not result or not result.flagged: - return completion - - if result.action == ModerationAction.DIRECT_OUTPUT: - final_output = result.preset_response - else: - final_output = result.text - - if public_event: - self.on_message_replace_func(final_output) - - return final_output - - def start_thread(self) -> threading.Thread: - buffer_size = int(current_app.config.get('MODERATION_BUFFER_SIZE', self.DEFAULT_BUFFER_SIZE)) - thread = threading.Thread(target=self.worker, kwargs={ - 'flask_app': current_app._get_current_object(), - 'buffer_size': buffer_size if buffer_size > 0 else self.DEFAULT_BUFFER_SIZE - }) - - thread.start() - - return thread - - def stop_thread(self): - if self.thread and self.thread.is_alive(): - self.thread_running = False - - def worker(self, flask_app: Flask, buffer_size: int): - with flask_app.app_context(): - current_length = 0 - while self.thread_running: - moderation_buffer = self.buffer - buffer_length = len(moderation_buffer) - if not self.is_final_chunk: - chunk_length = buffer_length - current_length - if 0 <= chunk_length < buffer_size: - time.sleep(1) - continue - - current_length = buffer_length - - result = self.moderation( - tenant_id=self.tenant_id, - app_id=self.app_id, - moderation_buffer=moderation_buffer - ) - - if not result or not result.flagged: - continue - - if result.action == ModerationAction.DIRECT_OUTPUT: - final_output = result.preset_response - self.final_output = final_output - else: - final_output = result.text + self.buffer[len(moderation_buffer):] - - # trigger replace event - if self.thread_running: - self.on_message_replace_func(final_output) - - if result.action == ModerationAction.DIRECT_OUTPUT: - break - - def moderation(self, tenant_id: str, app_id: str, moderation_buffer: str) -> Optional[ModerationOutputsResult]: - try: - moderation_factory = ModerationFactory( - name=self.rule.type, - app_id=app_id, - tenant_id=tenant_id, - config=self.rule.config - ) - - result: ModerationOutputsResult = moderation_factory.moderation_for_outputs(moderation_buffer) - return result - except Exception as e: - logging.error("Moderation Output error: %s", e) - - return None diff --git a/api/core/callback_handler/main_chain_gather_callback_handler.py b/api/core/callback_handler/main_chain_gather_callback_handler.py deleted file mode 100644 index aef7fb36a48207..00000000000000 --- a/api/core/callback_handler/main_chain_gather_callback_handler.py +++ /dev/null @@ -1,76 +0,0 @@ -import logging -import time - -from typing import Any, Dict, Union - -from langchain.callbacks.base import BaseCallbackHandler - -from core.callback_handler.entity.chain_result import ChainResult -from core.conversation_message_task import ConversationMessageTask - - -class MainChainGatherCallbackHandler(BaseCallbackHandler): - """Callback Handler that prints to std out.""" - raise_error: bool = True - - def __init__(self, conversation_message_task: ConversationMessageTask) -> None: - """Initialize callback handler.""" - self._current_chain_result = None - self._current_chain_message = None - self.conversation_message_task = conversation_message_task - self.agent_callback = None - - def clear_chain_results(self) -> None: - self._current_chain_result = None - self._current_chain_message = None - if self.agent_callback: - self.agent_callback.current_chain = None - - @property - def always_verbose(self) -> bool: - """Whether to call verbose callbacks even if verbose is False.""" - return True - - @property - def ignore_llm(self) -> bool: - """Whether to ignore LLM callbacks.""" - return True - - @property - def ignore_agent(self) -> bool: - """Whether to ignore agent callbacks.""" - return True - - def on_chain_start( - self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any - ) -> None: - """Print out that we are entering a chain.""" - if not self._current_chain_result: - chain_type = serialized['id'][-1] - if chain_type: - self._current_chain_result = ChainResult( - type=chain_type, - prompt=inputs, - started_at=time.perf_counter() - ) - self._current_chain_message = self.conversation_message_task.init_chain(self._current_chain_result) - if self.agent_callback: - self.agent_callback.current_chain = self._current_chain_message - - def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> None: - """Print out that we finished a chain.""" - if self._current_chain_result and self._current_chain_result.status == 'chain_started': - self._current_chain_result.status = 'chain_ended' - self._current_chain_result.completion = outputs - self._current_chain_result.completed = True - self._current_chain_result.completed_at = time.perf_counter() - - self.conversation_message_task.on_chain_end(self._current_chain_message, self._current_chain_result) - - self.clear_chain_results() - - def on_chain_error( - self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any - ) -> None: - logging.debug("Dataset tool on_chain_error: %s", error) - self.clear_chain_results() diff --git a/api/core/callback_handler/std_out_callback_handler.py b/api/core/callback_handler/std_out_callback_handler.py index e0ff7950e54296..750d9d7399d613 100644 --- a/api/core/callback_handler/std_out_callback_handler.py +++ b/api/core/callback_handler/std_out_callback_handler.py @@ -79,8 +79,11 @@ def on_agent_action( """Run on agent action.""" tool = action.tool tool_input = action.tool_input - action_name_position = action.log.index("\nAction:") + 1 if action.log else -1 - thought = action.log[:action_name_position].strip() if action.log else '' + try: + action_name_position = action.log.index("\nAction:") + 1 if action.log else -1 + thought = action.log[:action_name_position].strip() if action.log else '' + except ValueError: + thought = '' log = f"Thought: {thought}\nTool: {tool}\nTool Input: {tool_input}" print_text("\n[on_agent_action]\n" + log + "\n", color='green') diff --git a/api/core/chain/llm_chain.py b/api/core/chain/llm_chain.py index 2a5b4b61a948e2..4939ad9b138695 100644 --- a/api/core/chain/llm_chain.py +++ b/api/core/chain/llm_chain.py @@ -5,15 +5,19 @@ from langchain.schema import LLMResult, Generation from langchain.schema.language_model import BaseLanguageModel -from core.model_providers.models.entity.message import to_prompt_messages -from core.model_providers.models.llm.base import BaseLLM +from core.agent.agent.agent_llm_callback import AgentLLMCallback +from core.entities.application_entities import ModelConfigEntity +from core.model_manager import ModelInstance +from core.entities.message_entities import lc_messages_to_prompt_messages from core.third_party.langchain.llms.fake import FakeLLM class LLMChain(LCLLMChain): - model_instance: BaseLLM + model_config: ModelConfigEntity """The language model instance to use.""" llm: BaseLanguageModel = FakeLLM(response="") + parameters: Dict[str, Any] = {} + agent_llm_callback: Optional[AgentLLMCallback] = None def generate( self, @@ -23,14 +27,23 @@ def generate( """Generate LLM result from inputs.""" prompts, stop = self.prep_prompts(input_list, run_manager=run_manager) messages = prompts[0].to_messages() - prompt_messages = to_prompt_messages(messages) - result = self.model_instance.run( - messages=prompt_messages, - stop=stop + prompt_messages = lc_messages_to_prompt_messages(messages) + + model_instance = ModelInstance( + provider_model_bundle=self.model_config.provider_model_bundle, + model=self.model_config.model, + ) + + result = model_instance.invoke_llm( + prompt_messages=prompt_messages, + stream=False, + stop=stop, + callbacks=[self.agent_llm_callback] if self.agent_llm_callback else None, + model_parameters=self.parameters ) generations = [ - [Generation(text=result.content)] + [Generation(text=result.message.content)] ] return LLMResult(generations=generations) diff --git a/api/core/completion.py b/api/core/completion.py deleted file mode 100644 index d219814db6118a..00000000000000 --- a/api/core/completion.py +++ /dev/null @@ -1,501 +0,0 @@ -import concurrent -import json -import logging -from concurrent.futures import ThreadPoolExecutor -from typing import Optional, List, Union, Tuple - -from flask import current_app, Flask -from requests.exceptions import ChunkedEncodingError - -from core.agent.agent_executor import AgentExecuteResult, PlanningStrategy -from core.callback_handler.main_chain_gather_callback_handler import MainChainGatherCallbackHandler -from core.callback_handler.llm_callback_handler import LLMCallbackHandler -from core.conversation_message_task import ConversationMessageTask, ConversationTaskStoppedException, \ - ConversationTaskInterruptException -from core.embedding.cached_embedding import CacheEmbedding -from core.external_data_tool.factory import ExternalDataToolFactory -from core.file.file_obj import FileObj -from core.index.vector_index.vector_index import VectorIndex -from core.model_providers.error import LLMBadRequestError -from core.memory.read_only_conversation_token_db_buffer_shared_memory import \ - ReadOnlyConversationTokenDBBufferSharedMemory -from core.model_providers.model_factory import ModelFactory -from core.model_providers.models.entity.message import PromptMessage, PromptMessageFile -from core.model_providers.models.llm.base import BaseLLM -from core.orchestrator_rule_parser import OrchestratorRuleParser -from core.prompt.prompt_template import PromptTemplateParser -from core.prompt.prompt_transform import PromptTransform -from models.dataset import Dataset -from models.model import App, AppModelConfig, Account, Conversation, EndUser -from core.moderation.base import ModerationException, ModerationAction -from core.moderation.factory import ModerationFactory -from services.annotation_service import AppAnnotationService -from services.dataset_service import DatasetCollectionBindingService - - -class Completion: - @classmethod - def generate(cls, task_id: str, app: App, app_model_config: AppModelConfig, query: str, inputs: dict, - files: List[FileObj], user: Union[Account, EndUser], conversation: Optional[Conversation], - streaming: bool, is_override: bool = False, retriever_from: str = 'dev', - auto_generate_name: bool = True, from_source: str = 'console'): - """ - errors: ProviderTokenNotInitError - """ - query = PromptTemplateParser.remove_template_variables(query) - - memory = None - if conversation: - # get memory of conversation (read-only) - memory = cls.get_memory_from_conversation( - tenant_id=app.tenant_id, - app_model_config=app_model_config, - conversation=conversation, - return_messages=False - ) - - inputs = conversation.inputs - - final_model_instance = ModelFactory.get_text_generation_model_from_model_config( - tenant_id=app.tenant_id, - model_config=app_model_config.model_dict, - streaming=streaming - ) - - conversation_message_task = ConversationMessageTask( - task_id=task_id, - app=app, - app_model_config=app_model_config, - user=user, - conversation=conversation, - is_override=is_override, - inputs=inputs, - query=query, - files=files, - streaming=streaming, - model_instance=final_model_instance, - auto_generate_name=auto_generate_name - ) - - prompt_message_files = [file.prompt_message_file for file in files] - - rest_tokens_for_context_and_memory = cls.get_validate_rest_tokens( - mode=app.mode, - model_instance=final_model_instance, - app_model_config=app_model_config, - query=query, - inputs=inputs, - files=prompt_message_files - ) - - # init orchestrator rule parser - orchestrator_rule_parser = OrchestratorRuleParser( - tenant_id=app.tenant_id, - app_model_config=app_model_config - ) - - try: - chain_callback = MainChainGatherCallbackHandler(conversation_message_task) - - try: - # process sensitive_word_avoidance - inputs, query = cls.moderation_for_inputs(app.id, app.tenant_id, app_model_config, inputs, query) - except ModerationException as e: - cls.run_final_llm( - model_instance=final_model_instance, - mode=app.mode, - app_model_config=app_model_config, - query=query, - inputs=inputs, - files=prompt_message_files, - agent_execute_result=None, - conversation_message_task=conversation_message_task, - memory=memory, - fake_response=str(e) - ) - return - # check annotation reply - annotation_reply = cls.query_app_annotations_to_reply(conversation_message_task, from_source) - if annotation_reply: - return - # fill in variable inputs from external data tools if exists - external_data_tools = app_model_config.external_data_tools_list - if external_data_tools: - inputs = cls.fill_in_inputs_from_external_data_tools( - tenant_id=app.tenant_id, - app_id=app.id, - external_data_tools=external_data_tools, - inputs=inputs, - query=query - ) - - # get agent executor - agent_executor = orchestrator_rule_parser.to_agent_executor( - conversation_message_task=conversation_message_task, - memory=memory, - rest_tokens=rest_tokens_for_context_and_memory, - chain_callback=chain_callback, - tenant_id=app.tenant_id, - retriever_from=retriever_from - ) - - query_for_agent = cls.get_query_for_agent(app, app_model_config, query, inputs) - - # run agent executor - agent_execute_result = None - if query_for_agent and agent_executor: - should_use_agent = agent_executor.should_use_agent(query_for_agent) - if should_use_agent: - agent_execute_result = agent_executor.run(query_for_agent) - - # When no extra pre prompt is specified, - # the output of the agent can be used directly as the main output content without calling LLM again - fake_response = None - if not app_model_config.pre_prompt and agent_execute_result and agent_execute_result.output \ - and agent_execute_result.strategy not in [PlanningStrategy.ROUTER, - PlanningStrategy.REACT_ROUTER]: - fake_response = agent_execute_result.output - - # run the final llm - cls.run_final_llm( - model_instance=final_model_instance, - mode=app.mode, - app_model_config=app_model_config, - query=query, - inputs=inputs, - files=prompt_message_files, - agent_execute_result=agent_execute_result, - conversation_message_task=conversation_message_task, - memory=memory, - fake_response=fake_response - ) - except (ConversationTaskInterruptException, ConversationTaskStoppedException): - return - except ChunkedEncodingError as e: - # Interrupt by LLM (like OpenAI), handle it. - logging.warning(f'ChunkedEncodingError: {e}') - return - - @classmethod - def moderation_for_inputs(cls, app_id: str, tenant_id: str, app_model_config: AppModelConfig, inputs: dict, - query: str): - if not app_model_config.sensitive_word_avoidance_dict['enabled']: - return inputs, query - - type = app_model_config.sensitive_word_avoidance_dict['type'] - - moderation = ModerationFactory(type, app_id, tenant_id, - app_model_config.sensitive_word_avoidance_dict['config']) - moderation_result = moderation.moderation_for_inputs(inputs, query) - - if not moderation_result.flagged: - return inputs, query - - if moderation_result.action == ModerationAction.DIRECT_OUTPUT: - raise ModerationException(moderation_result.preset_response) - elif moderation_result.action == ModerationAction.OVERRIDED: - inputs = moderation_result.inputs - query = moderation_result.query - - return inputs, query - - @classmethod - def fill_in_inputs_from_external_data_tools(cls, tenant_id: str, app_id: str, external_data_tools: list[dict], - inputs: dict, query: str) -> dict: - """ - Fill in variable inputs from external data tools if exists. - - :param tenant_id: workspace id - :param app_id: app id - :param external_data_tools: external data tools configs - :param inputs: the inputs - :param query: the query - :return: the filled inputs - """ - # Group tools by type and config - grouped_tools = {} - for tool in external_data_tools: - if not tool.get("enabled"): - continue - - tool_key = (tool.get("type"), json.dumps(tool.get("config"), sort_keys=True)) - grouped_tools.setdefault(tool_key, []).append(tool) - - results = {} - with ThreadPoolExecutor() as executor: - futures = {} - for tool in external_data_tools: - if not tool.get("enabled"): - continue - - future = executor.submit( - cls.query_external_data_tool, current_app._get_current_object(), tenant_id, app_id, tool, - inputs, query - ) - - futures[future] = tool - - for future in concurrent.futures.as_completed(futures): - tool_variable, result = future.result() - results[tool_variable] = result - - inputs.update(results) - return inputs - - @classmethod - def query_external_data_tool(cls, flask_app: Flask, tenant_id: str, app_id: str, external_data_tool: dict, - inputs: dict, query: str) -> Tuple[Optional[str], Optional[str]]: - with flask_app.app_context(): - tool_variable = external_data_tool.get("variable") - tool_type = external_data_tool.get("type") - tool_config = external_data_tool.get("config") - - external_data_tool_factory = ExternalDataToolFactory( - name=tool_type, - tenant_id=tenant_id, - app_id=app_id, - variable=tool_variable, - config=tool_config - ) - - # query external data tool - result = external_data_tool_factory.query( - inputs=inputs, - query=query - ) - - return tool_variable, result - - @classmethod - def get_query_for_agent(cls, app: App, app_model_config: AppModelConfig, query: str, inputs: dict) -> str: - if app.mode != 'completion': - return query - - return inputs.get(app_model_config.dataset_query_variable, "") - - @classmethod - def run_final_llm(cls, model_instance: BaseLLM, mode: str, app_model_config: AppModelConfig, query: str, - inputs: dict, - files: List[PromptMessageFile], - agent_execute_result: Optional[AgentExecuteResult], - conversation_message_task: ConversationMessageTask, - memory: Optional[ReadOnlyConversationTokenDBBufferSharedMemory], - fake_response: Optional[str]): - prompt_transform = PromptTransform() - - # get llm prompt - if app_model_config.prompt_type == 'simple': - prompt_messages, stop_words = prompt_transform.get_prompt( - app_mode=mode, - pre_prompt=app_model_config.pre_prompt, - inputs=inputs, - query=query, - files=files, - context=agent_execute_result.output if agent_execute_result else None, - memory=memory, - model_instance=model_instance - ) - else: - prompt_messages = prompt_transform.get_advanced_prompt( - app_mode=mode, - app_model_config=app_model_config, - inputs=inputs, - query=query, - files=files, - context=agent_execute_result.output if agent_execute_result else None, - memory=memory, - model_instance=model_instance - ) - - model_config = app_model_config.model_dict - completion_params = model_config.get("completion_params", {}) - stop_words = completion_params.get("stop", []) - - cls.recale_llm_max_tokens( - model_instance=model_instance, - prompt_messages=prompt_messages, - ) - - response = model_instance.run( - messages=prompt_messages, - stop=stop_words if stop_words else None, - callbacks=[LLMCallbackHandler(model_instance, conversation_message_task)], - fake_response=fake_response - ) - return response - - @classmethod - def get_history_messages_from_memory(cls, memory: ReadOnlyConversationTokenDBBufferSharedMemory, - max_token_limit: int) -> str: - """Get memory messages.""" - memory.max_token_limit = max_token_limit - memory_key = memory.memory_variables[0] - external_context = memory.load_memory_variables({}) - return external_context[memory_key] - - @classmethod - def query_app_annotations_to_reply(cls, conversation_message_task: ConversationMessageTask, - from_source: str) -> bool: - """Get memory messages.""" - app_model_config = conversation_message_task.app_model_config - app = conversation_message_task.app - annotation_reply = app_model_config.annotation_reply_dict - if annotation_reply['enabled']: - try: - score_threshold = annotation_reply.get('score_threshold', 1) - embedding_provider_name = annotation_reply['embedding_model']['embedding_provider_name'] - embedding_model_name = annotation_reply['embedding_model']['embedding_model_name'] - # get embedding model - embedding_model = ModelFactory.get_embedding_model( - tenant_id=app.tenant_id, - model_provider_name=embedding_provider_name, - model_name=embedding_model_name - ) - embeddings = CacheEmbedding(embedding_model) - - dataset_collection_binding = DatasetCollectionBindingService.get_dataset_collection_binding( - embedding_provider_name, - embedding_model_name, - 'annotation' - ) - - dataset = Dataset( - id=app.id, - tenant_id=app.tenant_id, - indexing_technique='high_quality', - embedding_model_provider=embedding_provider_name, - embedding_model=embedding_model_name, - collection_binding_id=dataset_collection_binding.id - ) - - vector_index = VectorIndex( - dataset=dataset, - config=current_app.config, - embeddings=embeddings, - attributes=['doc_id', 'annotation_id', 'app_id'] - ) - - documents = vector_index.search( - conversation_message_task.query, - search_type='similarity_score_threshold', - search_kwargs={ - 'k': 1, - 'score_threshold': score_threshold, - 'filter': { - 'group_id': [dataset.id] - } - } - ) - if documents: - annotation_id = documents[0].metadata['annotation_id'] - score = documents[0].metadata['score'] - annotation = AppAnnotationService.get_annotation_by_id(annotation_id) - if annotation: - conversation_message_task.annotation_end(annotation.content, annotation.id, annotation.account.name) - # insert annotation history - AppAnnotationService.add_annotation_history(annotation.id, - app.id, - annotation.question, - annotation.content, - conversation_message_task.query, - conversation_message_task.user.id, - conversation_message_task.message.id, - from_source, - score) - return True - except Exception as e: - logging.warning(f'Query annotation failed, exception: {str(e)}.') - return False - return False - - @classmethod - def get_memory_from_conversation(cls, tenant_id: str, app_model_config: AppModelConfig, - conversation: Conversation, - **kwargs) -> ReadOnlyConversationTokenDBBufferSharedMemory: - # only for calc token in memory - memory_model_instance = ModelFactory.get_text_generation_model_from_model_config( - tenant_id=tenant_id, - model_config=app_model_config.model_dict - ) - - # use llm config from conversation - memory = ReadOnlyConversationTokenDBBufferSharedMemory( - conversation=conversation, - model_instance=memory_model_instance, - max_token_limit=kwargs.get("max_token_limit", 2048), - memory_key=kwargs.get("memory_key", "chat_history"), - return_messages=kwargs.get("return_messages", True), - input_key=kwargs.get("input_key", "input"), - output_key=kwargs.get("output_key", "output"), - message_limit=kwargs.get("message_limit", 10), - ) - - return memory - - @classmethod - def get_validate_rest_tokens(cls, mode: str, model_instance: BaseLLM, app_model_config: AppModelConfig, - query: str, inputs: dict, files: List[PromptMessageFile]) -> int: - model_limited_tokens = model_instance.model_rules.max_tokens.max - max_tokens = model_instance.get_model_kwargs().max_tokens - - if model_limited_tokens is None: - return -1 - - if max_tokens is None: - max_tokens = 0 - - prompt_transform = PromptTransform() - - # get prompt without memory and context - if app_model_config.prompt_type == 'simple': - prompt_messages, _ = prompt_transform.get_prompt( - app_mode=mode, - pre_prompt=app_model_config.pre_prompt, - inputs=inputs, - query=query, - files=files, - context=None, - memory=None, - model_instance=model_instance - ) - else: - prompt_messages = prompt_transform.get_advanced_prompt( - app_mode=mode, - app_model_config=app_model_config, - inputs=inputs, - query=query, - files=files, - context=None, - memory=None, - model_instance=model_instance - ) - - prompt_tokens = model_instance.get_num_tokens(prompt_messages) - rest_tokens = model_limited_tokens - max_tokens - prompt_tokens - if rest_tokens < 0: - raise LLMBadRequestError("Query or prefix prompt is too long, you can reduce the prefix prompt, " - "or shrink the max token, or switch to a llm with a larger token limit size.") - - return rest_tokens - - @classmethod - def recale_llm_max_tokens(cls, model_instance: BaseLLM, prompt_messages: List[PromptMessage]): - # recalc max_tokens if sum(prompt_token + max_tokens) over model token limit - model_limited_tokens = model_instance.model_rules.max_tokens.max - max_tokens = model_instance.get_model_kwargs().max_tokens - - if model_limited_tokens is None: - return - - if max_tokens is None: - max_tokens = 0 - - prompt_tokens = model_instance.get_num_tokens(prompt_messages) - - if prompt_tokens + max_tokens > model_limited_tokens: - max_tokens = max(model_limited_tokens - prompt_tokens, 16) - - # update model instance max tokens - model_kwargs = model_instance.get_model_kwargs() - model_kwargs.max_tokens = max_tokens - model_instance.set_model_kwargs(model_kwargs) diff --git a/api/core/conversation_message_task.py b/api/core/conversation_message_task.py deleted file mode 100644 index bf700b3bec5a7f..00000000000000 --- a/api/core/conversation_message_task.py +++ /dev/null @@ -1,517 +0,0 @@ -import json -import time -from typing import Optional, Union, List - -from core.callback_handler.entity.agent_loop import AgentLoop -from core.callback_handler.entity.dataset_query import DatasetQueryObj -from core.callback_handler.entity.llm_message import LLMMessage -from core.callback_handler.entity.chain_result import ChainResult -from core.file.file_obj import FileObj -from core.model_providers.model_factory import ModelFactory -from core.model_providers.models.entity.message import to_prompt_messages, MessageType, PromptMessageFile -from core.model_providers.models.llm.base import BaseLLM -from core.prompt.prompt_builder import PromptBuilder -from core.prompt.prompt_template import PromptTemplateParser -from events.message_event import message_was_created -from extensions.ext_database import db -from extensions.ext_redis import redis_client -from models.dataset import DatasetQuery -from models.model import AppModelConfig, Conversation, Account, Message, EndUser, App, MessageAgentThought, \ - MessageChain, DatasetRetrieverResource, MessageFile - - -class ConversationMessageTask: - def __init__(self, task_id: str, app: App, app_model_config: AppModelConfig, user: Account, - inputs: dict, query: str, files: List[FileObj], streaming: bool, - model_instance: BaseLLM, conversation: Optional[Conversation] = None, is_override: bool = False, - auto_generate_name: bool = True): - self.start_at = time.perf_counter() - - self.task_id = task_id - - self.app = app - self.tenant_id = app.tenant_id - self.app_model_config = app_model_config - self.is_override = is_override - - self.user = user - self.inputs = inputs - self.query = query - self.files = files - self.streaming = streaming - - self.conversation = conversation - self.is_new_conversation = False - - self.model_instance = model_instance - - self.message = None - - self.retriever_resource = None - self.auto_generate_name = auto_generate_name - - self.model_dict = self.app_model_config.model_dict - self.provider_name = self.model_dict.get('provider') - self.model_name = self.model_dict.get('name') - self.mode = app.mode - - self.init() - - self._pub_handler = PubHandler( - user=self.user, - task_id=self.task_id, - message=self.message, - conversation=self.conversation, - chain_pub=False, # disabled currently - agent_thought_pub=True - ) - - def init(self): - - override_model_configs = None - if self.is_override: - override_model_configs = self.app_model_config.to_dict() - - introduction = '' - system_instruction = '' - system_instruction_tokens = 0 - if self.mode == 'chat': - introduction = self.app_model_config.opening_statement - if introduction: - prompt_template = PromptTemplateParser(template=introduction) - prompt_inputs = {k: self.inputs[k] for k in prompt_template.variable_keys if k in self.inputs} - try: - introduction = prompt_template.format(prompt_inputs) - except KeyError: - pass - - if self.app_model_config.pre_prompt: - system_message = PromptBuilder.to_system_message(self.app_model_config.pre_prompt, self.inputs) - system_instruction = system_message.content - model_instance = ModelFactory.get_text_generation_model( - tenant_id=self.tenant_id, - model_provider_name=self.provider_name, - model_name=self.model_name - ) - system_instruction_tokens = model_instance.get_num_tokens(to_prompt_messages([system_message])) - - if not self.conversation: - self.is_new_conversation = True - self.conversation = Conversation( - app_id=self.app.id, - app_model_config_id=self.app_model_config.id, - model_provider=self.provider_name, - model_id=self.model_name, - override_model_configs=json.dumps(override_model_configs) if override_model_configs else None, - mode=self.mode, - name='New conversation', - inputs=self.inputs, - introduction=introduction, - system_instruction=system_instruction, - system_instruction_tokens=system_instruction_tokens, - status='normal', - from_source=('console' if isinstance(self.user, Account) else 'api'), - from_end_user_id=(self.user.id if isinstance(self.user, EndUser) else None), - from_account_id=(self.user.id if isinstance(self.user, Account) else None), - ) - - db.session.add(self.conversation) - db.session.commit() - - self.message = Message( - app_id=self.app.id, - model_provider=self.provider_name, - model_id=self.model_name, - override_model_configs=json.dumps(override_model_configs) if override_model_configs else None, - conversation_id=self.conversation.id, - inputs=self.inputs, - query=self.query, - message="", - message_tokens=0, - message_unit_price=0, - message_price_unit=0, - answer="", - answer_tokens=0, - answer_unit_price=0, - answer_price_unit=0, - provider_response_latency=0, - total_price=0, - currency=self.model_instance.get_currency(), - from_source=('console' if isinstance(self.user, Account) else 'api'), - from_end_user_id=(self.user.id if isinstance(self.user, EndUser) else None), - from_account_id=(self.user.id if isinstance(self.user, Account) else None), - agent_based=self.app_model_config.agent_mode_dict.get('enabled'), - ) - - db.session.add(self.message) - db.session.commit() - - for file in self.files: - message_file = MessageFile( - message_id=self.message.id, - type=file.type.value, - transfer_method=file.transfer_method.value, - url=file.url, - upload_file_id=file.upload_file_id, - created_by_role=('account' if isinstance(self.user, Account) else 'end_user'), - created_by=self.user.id - ) - db.session.add(message_file) - db.session.commit() - - def append_message_text(self, text: str): - if text is not None: - self._pub_handler.pub_text(text) - - def save_message(self, llm_message: LLMMessage, by_stopped: bool = False): - message_tokens = llm_message.prompt_tokens - answer_tokens = llm_message.completion_tokens - - message_unit_price = self.model_instance.get_tokens_unit_price(MessageType.USER) - message_price_unit = self.model_instance.get_price_unit(MessageType.USER) - answer_unit_price = self.model_instance.get_tokens_unit_price(MessageType.ASSISTANT) - answer_price_unit = self.model_instance.get_price_unit(MessageType.ASSISTANT) - - message_total_price = self.model_instance.calc_tokens_price(message_tokens, MessageType.USER) - answer_total_price = self.model_instance.calc_tokens_price(answer_tokens, MessageType.ASSISTANT) - total_price = message_total_price + answer_total_price - - self.message.message = llm_message.prompt - self.message.message_tokens = message_tokens - self.message.message_unit_price = message_unit_price - self.message.message_price_unit = message_price_unit - self.message.answer = PromptTemplateParser.remove_template_variables( - llm_message.completion.strip()) if llm_message.completion else '' - self.message.answer_tokens = answer_tokens - self.message.answer_unit_price = answer_unit_price - self.message.answer_price_unit = answer_price_unit - self.message.provider_response_latency = time.perf_counter() - self.start_at - self.message.total_price = total_price - - db.session.commit() - - message_was_created.send( - self.message, - conversation=self.conversation, - is_first_message=self.is_new_conversation, - auto_generate_name=self.auto_generate_name - ) - - if not by_stopped: - self.end() - - def init_chain(self, chain_result: ChainResult): - message_chain = MessageChain( - message_id=self.message.id, - type=chain_result.type, - input=json.dumps(chain_result.prompt), - output='' - ) - - db.session.add(message_chain) - db.session.commit() - - return message_chain - - def on_chain_end(self, message_chain: MessageChain, chain_result: ChainResult): - message_chain.output = json.dumps(chain_result.completion) - db.session.commit() - - self._pub_handler.pub_chain(message_chain) - - def on_agent_start(self, message_chain: MessageChain, agent_loop: AgentLoop) -> MessageAgentThought: - message_agent_thought = MessageAgentThought( - message_id=self.message.id, - message_chain_id=message_chain.id, - position=agent_loop.position, - thought=agent_loop.thought, - tool=agent_loop.tool_name, - tool_input=agent_loop.tool_input, - message=agent_loop.prompt, - message_price_unit=0, - answer=agent_loop.completion, - answer_price_unit=0, - created_by_role=('account' if isinstance(self.user, Account) else 'end_user'), - created_by=self.user.id - ) - - db.session.add(message_agent_thought) - db.session.commit() - - self._pub_handler.pub_agent_thought(message_agent_thought) - - return message_agent_thought - - def on_agent_end(self, message_agent_thought: MessageAgentThought, agent_model_instance: BaseLLM, - agent_loop: AgentLoop): - agent_message_unit_price = agent_model_instance.get_tokens_unit_price(MessageType.USER) - agent_message_price_unit = agent_model_instance.get_price_unit(MessageType.USER) - agent_answer_unit_price = agent_model_instance.get_tokens_unit_price(MessageType.ASSISTANT) - agent_answer_price_unit = agent_model_instance.get_price_unit(MessageType.ASSISTANT) - - loop_message_tokens = agent_loop.prompt_tokens - loop_answer_tokens = agent_loop.completion_tokens - - loop_message_total_price = agent_model_instance.calc_tokens_price(loop_message_tokens, MessageType.USER) - loop_answer_total_price = agent_model_instance.calc_tokens_price(loop_answer_tokens, MessageType.ASSISTANT) - loop_total_price = loop_message_total_price + loop_answer_total_price - - message_agent_thought.observation = agent_loop.tool_output - message_agent_thought.tool_process_data = '' # currently not support - message_agent_thought.message_token = loop_message_tokens - message_agent_thought.message_unit_price = agent_message_unit_price - message_agent_thought.message_price_unit = agent_message_price_unit - message_agent_thought.answer_token = loop_answer_tokens - message_agent_thought.answer_unit_price = agent_answer_unit_price - message_agent_thought.answer_price_unit = agent_answer_price_unit - message_agent_thought.latency = agent_loop.latency - message_agent_thought.tokens = agent_loop.prompt_tokens + agent_loop.completion_tokens - message_agent_thought.total_price = loop_total_price - message_agent_thought.currency = agent_model_instance.get_currency() - db.session.commit() - - def on_dataset_query_end(self, dataset_query_obj: DatasetQueryObj): - dataset_query = DatasetQuery( - dataset_id=dataset_query_obj.dataset_id, - content=dataset_query_obj.query, - source='app', - source_app_id=self.app.id, - created_by_role=('account' if isinstance(self.user, Account) else 'end_user'), - created_by=self.user.id - ) - - db.session.add(dataset_query) - db.session.commit() - - def on_dataset_query_finish(self, resource: List): - if resource and len(resource) > 0: - for item in resource: - dataset_retriever_resource = DatasetRetrieverResource( - message_id=self.message.id, - position=item.get('position'), - dataset_id=item.get('dataset_id'), - dataset_name=item.get('dataset_name'), - document_id=item.get('document_id'), - document_name=item.get('document_name'), - data_source_type=item.get('data_source_type'), - segment_id=item.get('segment_id'), - score=item.get('score') if 'score' in item else None, - hit_count=item.get('hit_count') if 'hit_count' else None, - word_count=item.get('word_count') if 'word_count' in item else None, - segment_position=item.get('segment_position') if 'segment_position' in item else None, - index_node_hash=item.get('index_node_hash') if 'index_node_hash' in item else None, - content=item.get('content'), - retriever_from=item.get('retriever_from'), - created_by=self.user.id - ) - db.session.add(dataset_retriever_resource) - db.session.commit() - self.retriever_resource = resource - - def on_message_replace(self, text: str): - if text is not None: - self._pub_handler.pub_message_replace(text) - - def message_end(self): - self._pub_handler.pub_message_end(self.retriever_resource) - - def end(self): - self._pub_handler.pub_message_end(self.retriever_resource) - self._pub_handler.pub_end() - - def annotation_end(self, text: str, annotation_id: str, annotation_author_name: str): - self._pub_handler.pub_annotation(text, annotation_id, annotation_author_name, self.start_at) - self._pub_handler.pub_end() - - -class PubHandler: - def __init__(self, user: Union[Account, EndUser], task_id: str, - message: Message, conversation: Conversation, - chain_pub: bool = False, agent_thought_pub: bool = False): - self._channel = PubHandler.generate_channel_name(user, task_id) - self._stopped_cache_key = PubHandler.generate_stopped_cache_key(user, task_id) - - self._task_id = task_id - self._message = message - self._conversation = conversation - self._chain_pub = chain_pub - self._agent_thought_pub = agent_thought_pub - - @classmethod - def generate_channel_name(cls, user: Union[Account, EndUser], task_id: str): - if not user: - raise ValueError("user is required") - - user_str = 'account-' + str(user.id) if isinstance(user, Account) else 'end-user-' + str(user.id) - return "generate_result:{}-{}".format(user_str, task_id) - - @classmethod - def generate_stopped_cache_key(cls, user: Union[Account, EndUser], task_id: str): - user_str = 'account-' + str(user.id) if isinstance(user, Account) else 'end-user-' + str(user.id) - return "generate_result_stopped:{}-{}".format(user_str, task_id) - - def pub_text(self, text: str): - content = { - 'event': 'message', - 'data': { - 'task_id': self._task_id, - 'message_id': str(self._message.id), - 'text': text, - 'mode': self._conversation.mode, - 'conversation_id': str(self._conversation.id) - } - } - - redis_client.publish(self._channel, json.dumps(content)) - - if self._is_stopped(): - self.pub_end() - raise ConversationTaskStoppedException() - - def pub_message_replace(self, text: str): - content = { - 'event': 'message_replace', - 'data': { - 'task_id': self._task_id, - 'message_id': str(self._message.id), - 'text': text, - 'mode': self._conversation.mode, - 'conversation_id': str(self._conversation.id) - } - } - - redis_client.publish(self._channel, json.dumps(content)) - - if self._is_stopped(): - self.pub_end() - raise ConversationTaskStoppedException() - - def pub_chain(self, message_chain: MessageChain): - if self._chain_pub: - content = { - 'event': 'chain', - 'data': { - 'task_id': self._task_id, - 'message_id': self._message.id, - 'chain_id': message_chain.id, - 'type': message_chain.type, - 'input': json.loads(message_chain.input), - 'output': json.loads(message_chain.output), - 'mode': self._conversation.mode, - 'conversation_id': self._conversation.id - } - } - - redis_client.publish(self._channel, json.dumps(content)) - - if self._is_stopped(): - self.pub_end() - raise ConversationTaskStoppedException() - - def pub_agent_thought(self, message_agent_thought: MessageAgentThought): - if self._agent_thought_pub: - content = { - 'event': 'agent_thought', - 'data': { - 'id': message_agent_thought.id, - 'task_id': self._task_id, - 'message_id': self._message.id, - 'chain_id': message_agent_thought.message_chain_id, - 'position': message_agent_thought.position, - 'thought': message_agent_thought.thought, - 'tool': message_agent_thought.tool, - 'tool_input': message_agent_thought.tool_input, - 'mode': self._conversation.mode, - 'conversation_id': self._conversation.id - } - } - - redis_client.publish(self._channel, json.dumps(content)) - - if self._is_stopped(): - self.pub_end() - raise ConversationTaskStoppedException() - - def pub_message_end(self, retriever_resource: List): - content = { - 'event': 'message_end', - 'data': { - 'task_id': self._task_id, - 'message_id': self._message.id, - 'mode': self._conversation.mode, - 'conversation_id': self._conversation.id, - } - } - if retriever_resource: - content['data']['retriever_resources'] = retriever_resource - redis_client.publish(self._channel, json.dumps(content)) - - if self._is_stopped(): - self.pub_end() - raise ConversationTaskStoppedException() - - def pub_annotation(self, text: str, annotation_id: str, annotation_author_name: str, start_at: float): - content = { - 'event': 'annotation', - 'data': { - 'task_id': self._task_id, - 'message_id': self._message.id, - 'mode': self._conversation.mode, - 'conversation_id': self._conversation.id, - 'text': text, - 'annotation_id': annotation_id, - 'annotation_author_name': annotation_author_name - } - } - self._message.answer = text - self._message.provider_response_latency = time.perf_counter() - start_at - - db.session.commit() - - redis_client.publish(self._channel, json.dumps(content)) - - if self._is_stopped(): - self.pub_end() - raise ConversationTaskStoppedException() - - def pub_end(self): - content = { - 'event': 'end', - } - - redis_client.publish(self._channel, json.dumps(content)) - - @classmethod - def pub_error(cls, user: Union[Account, EndUser], task_id: str, e): - content = { - 'error': type(e).__name__, - 'description': e.description if getattr(e, 'description', None) is not None else str(e) - } - - channel = cls.generate_channel_name(user, task_id) - redis_client.publish(channel, json.dumps(content)) - - def _is_stopped(self): - return redis_client.get(self._stopped_cache_key) is not None - - @classmethod - def ping(cls, user: Union[Account, EndUser], task_id: str): - content = { - 'event': 'ping' - } - - channel = cls.generate_channel_name(user, task_id) - redis_client.publish(channel, json.dumps(content)) - - @classmethod - def stop(cls, user: Union[Account, EndUser], task_id: str): - stopped_cache_key = cls.generate_stopped_cache_key(user, task_id) - redis_client.setex(stopped_cache_key, 600, 1) - - -class ConversationTaskStoppedException(Exception): - pass - - -class ConversationTaskInterruptException(Exception): - pass diff --git a/api/core/docstore/dataset_docstore.py b/api/core/docstore/dataset_docstore.py index 63435174073c9d..77a5dde9ed3a68 100644 --- a/api/core/docstore/dataset_docstore.py +++ b/api/core/docstore/dataset_docstore.py @@ -1,9 +1,11 @@ -from typing import Any, Dict, Optional, Sequence +from typing import Any, Dict, Optional, Sequence, cast from langchain.schema import Document from sqlalchemy import func -from core.model_providers.model_factory import ModelFactory +from core.model_manager import ModelManager +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.model_providers.__base.text_embedding_model import TextEmbeddingModel from extensions.ext_database import db from models.dataset import Dataset, DocumentSegment @@ -69,10 +71,12 @@ def add_documents( max_position = 0 embedding_model = None if self._dataset.indexing_technique == 'high_quality': - embedding_model = ModelFactory.get_embedding_model( + model_manager = ModelManager() + embedding_model = model_manager.get_model_instance( tenant_id=self._dataset.tenant_id, - model_provider_name=self._dataset.embedding_model_provider, - model_name=self._dataset.embedding_model + provider=self._dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=self._dataset.embedding_model ) for doc in docs: @@ -89,7 +93,16 @@ def add_documents( ) # calc embedding use tokens - tokens = embedding_model.get_num_tokens(doc.page_content) if embedding_model else 0 + if embedding_model: + model_type_instance = embedding_model.model_type_instance + model_type_instance = cast(TextEmbeddingModel, model_type_instance) + tokens = model_type_instance.get_num_tokens( + model=embedding_model.model, + credentials=embedding_model.credentials, + texts=[doc.page_content] + ) + else: + tokens = 0 if not segment_document: max_position += 1 diff --git a/api/core/embedding/cached_embedding.py b/api/core/embedding/cached_embedding.py index dbdfe026d90de9..0022c8b141670b 100644 --- a/api/core/embedding/cached_embedding.py +++ b/api/core/embedding/cached_embedding.py @@ -1,19 +1,22 @@ import logging -from typing import List +from typing import List, Optional import numpy as np from langchain.embeddings.base import Embeddings from sqlalchemy.exc import IntegrityError -from core.model_providers.models.embedding.base import BaseEmbedding +from core.model_manager import ModelInstance from extensions.ext_database import db from libs import helper from models.dataset import Embedding +logger = logging.getLogger(__name__) + class CacheEmbedding(Embeddings): - def __init__(self, embeddings: BaseEmbedding): - self._embeddings = embeddings + def __init__(self, model_instance: ModelInstance, user: Optional[str] = None) -> None: + self._model_instance = model_instance + self._user = user def embed_documents(self, texts: List[str]) -> List[List[float]]: """Embed search docs.""" @@ -22,7 +25,7 @@ def embed_documents(self, texts: List[str]) -> List[List[float]]: embedding_queue_indices = [] for i, text in enumerate(texts): hash = helper.generate_text_hash(text) - embedding = db.session.query(Embedding).filter_by(model_name=self._embeddings.name, hash=hash).first() + embedding = db.session.query(Embedding).filter_by(model_name=self._model_instance.model, hash=hash).first() if embedding: text_embeddings[i] = embedding.get_embedding() else: @@ -30,15 +33,21 @@ def embed_documents(self, texts: List[str]) -> List[List[float]]: if embedding_queue_indices: try: - embedding_results = self._embeddings.client.embed_documents([texts[i] for i in embedding_queue_indices]) + embedding_result = self._model_instance.invoke_text_embedding( + texts=[texts[i] for i in embedding_queue_indices], + user=self._user + ) + + embedding_results = embedding_result.embeddings except Exception as ex: - raise self._embeddings.handle_exceptions(ex) + logger.error('Failed to embed documents: ', ex) + raise ex for i, indice in enumerate(embedding_queue_indices): hash = helper.generate_text_hash(texts[indice]) try: - embedding = Embedding(model_name=self._embeddings.name, hash=hash) + embedding = Embedding(model_name=self._model_instance.model, hash=hash) vector = embedding_results[i] normalized_embedding = (vector / np.linalg.norm(vector)).tolist() text_embeddings[indice] = normalized_embedding @@ -58,18 +67,23 @@ def embed_query(self, text: str) -> List[float]: """Embed query text.""" # use doc embedding cache or store if not exists hash = helper.generate_text_hash(text) - embedding = db.session.query(Embedding).filter_by(model_name=self._embeddings.name, hash=hash).first() + embedding = db.session.query(Embedding).filter_by(model_name=self._model_instance.model, hash=hash).first() if embedding: return embedding.get_embedding() try: - embedding_results = self._embeddings.client.embed_query(text) + embedding_result = self._model_instance.invoke_text_embedding( + texts=[text], + user=self._user + ) + + embedding_results = embedding_result.embeddings[0] embedding_results = (embedding_results / np.linalg.norm(embedding_results)).tolist() except Exception as ex: - raise self._embeddings.handle_exceptions(ex) + raise ex try: - embedding = Embedding(model_name=self._embeddings.name, hash=hash) + embedding = Embedding(model_name=self._model_instance.model, hash=hash) embedding.set_embedding(embedding_results) db.session.add(embedding) db.session.commit() @@ -79,4 +93,3 @@ def embed_query(self, text: str) -> List[float]: logging.exception('Failed to add embedding to db') return embedding_results - diff --git a/api/core/model_providers/models/embedding/__init__.py b/api/core/entities/__init__.py similarity index 100% rename from api/core/model_providers/models/embedding/__init__.py rename to api/core/entities/__init__.py diff --git a/api/core/entities/application_entities.py b/api/core/entities/application_entities.py new file mode 100644 index 00000000000000..7e34eed51ee24d --- /dev/null +++ b/api/core/entities/application_entities.py @@ -0,0 +1,265 @@ +from enum import Enum +from typing import Optional, Any, cast + +from pydantic import BaseModel + +from core.entities.provider_configuration import ProviderModelBundle +from core.file.file_obj import FileObj +from core.model_runtime.entities.message_entities import PromptMessageRole +from core.model_runtime.entities.model_entities import AIModelEntity + + +class ModelConfigEntity(BaseModel): + """ + Model Config Entity. + """ + provider: str + model: str + model_schema: AIModelEntity + mode: str + provider_model_bundle: ProviderModelBundle + credentials: dict[str, Any] = {} + parameters: dict[str, Any] = {} + stop: list[str] = [] + + +class AdvancedChatMessageEntity(BaseModel): + """ + Advanced Chat Message Entity. + """ + text: str + role: PromptMessageRole + + +class AdvancedChatPromptTemplateEntity(BaseModel): + """ + Advanced Chat Prompt Template Entity. + """ + messages: list[AdvancedChatMessageEntity] + + +class AdvancedCompletionPromptTemplateEntity(BaseModel): + """ + Advanced Completion Prompt Template Entity. + """ + class RolePrefixEntity(BaseModel): + """ + Role Prefix Entity. + """ + user: str + assistant: str + + prompt: str + role_prefix: Optional[RolePrefixEntity] = None + + +class PromptTemplateEntity(BaseModel): + """ + Prompt Template Entity. + """ + class PromptType(Enum): + """ + Prompt Type. + 'simple', 'advanced' + """ + SIMPLE = 'simple' + ADVANCED = 'advanced' + + @classmethod + def value_of(cls, value: str) -> 'PromptType': + """ + Get value of given mode. + + :param value: mode value + :return: mode + """ + for mode in cls: + if mode.value == value: + return mode + raise ValueError(f'invalid prompt type value {value}') + + prompt_type: PromptType + simple_prompt_template: Optional[str] = None + advanced_chat_prompt_template: Optional[AdvancedChatPromptTemplateEntity] = None + advanced_completion_prompt_template: Optional[AdvancedCompletionPromptTemplateEntity] = None + + +class ExternalDataVariableEntity(BaseModel): + """ + External Data Variable Entity. + """ + variable: str + type: str + config: dict[str, Any] = {} + + +class DatasetRetrieveConfigEntity(BaseModel): + """ + Dataset Retrieve Config Entity. + """ + class RetrieveStrategy(Enum): + """ + Dataset Retrieve Strategy. + 'single' or 'multiple' + """ + SINGLE = 'single' + MULTIPLE = 'multiple' + + @classmethod + def value_of(cls, value: str) -> 'RetrieveStrategy': + """ + Get value of given mode. + + :param value: mode value + :return: mode + """ + for mode in cls: + if mode.value == value: + return mode + raise ValueError(f'invalid retrieve strategy value {value}') + + query_variable: Optional[str] = None # Only when app mode is completion + + retrieve_strategy: RetrieveStrategy + single_strategy: Optional[str] = None # for temp + top_k: Optional[int] = None + score_threshold: Optional[float] = None + reranking_model: Optional[dict] = None + + +class DatasetEntity(BaseModel): + """ + Dataset Config Entity. + """ + dataset_ids: list[str] + retrieve_config: DatasetRetrieveConfigEntity + + +class SensitiveWordAvoidanceEntity(BaseModel): + """ + Sensitive Word Avoidance Entity. + """ + type: str + config: dict[str, Any] = {} + + +class FileUploadEntity(BaseModel): + """ + File Upload Entity. + """ + image_config: Optional[dict[str, Any]] = None + + +class AgentToolEntity(BaseModel): + """ + Agent Tool Entity. + """ + tool_id: str + config: dict[str, Any] = {} + + +class AgentEntity(BaseModel): + """ + Agent Entity. + """ + class Strategy(Enum): + """ + Agent Strategy. + """ + CHAIN_OF_THOUGHT = 'chain-of-thought' + FUNCTION_CALLING = 'function-calling' + + provider: str + model: str + strategy: Strategy + tools: list[AgentToolEntity] = [] + + +class AppOrchestrationConfigEntity(BaseModel): + """ + App Orchestration Config Entity. + """ + model_config: ModelConfigEntity + prompt_template: PromptTemplateEntity + external_data_variables: list[ExternalDataVariableEntity] = [] + agent: Optional[AgentEntity] = None + + # features + dataset: Optional[DatasetEntity] = None + file_upload: Optional[FileUploadEntity] = None + opening_statement: Optional[str] = None + suggested_questions_after_answer: bool = False + show_retrieve_source: bool = False + more_like_this: bool = False + speech_to_text: bool = False + sensitive_word_avoidance: Optional[SensitiveWordAvoidanceEntity] = None + + +class InvokeFrom(Enum): + """ + Invoke From. + """ + SERVICE_API = 'service-api' + WEB_APP = 'web-app' + EXPLORE = 'explore' + DEBUGGER = 'debugger' + + @classmethod + def value_of(cls, value: str) -> 'InvokeFrom': + """ + Get value of given mode. + + :param value: mode value + :return: mode + """ + for mode in cls: + if mode.value == value: + return mode + raise ValueError(f'invalid invoke from value {value}') + + def to_source(self) -> str: + """ + Get source of invoke from. + + :return: source + """ + if self == InvokeFrom.WEB_APP: + return 'web_app' + elif self == InvokeFrom.DEBUGGER: + return 'dev' + elif self == InvokeFrom.EXPLORE: + return 'explore_app' + elif self == InvokeFrom.SERVICE_API: + return 'api' + + return 'dev' + + +class ApplicationGenerateEntity(BaseModel): + """ + Application Generate Entity. + """ + task_id: str + tenant_id: str + + app_id: str + app_model_config_id: str + # for save + app_model_config_dict: dict + app_model_config_override: bool + + # Converted from app_model_config to Entity object, or directly covered by external input + app_orchestration_config_entity: AppOrchestrationConfigEntity + + conversation_id: Optional[str] = None + inputs: dict[str, str] + query: Optional[str] = None + files: list[FileObj] = [] + user_id: str + + # extras + stream: bool + invoke_from: InvokeFrom + + # extra parameters, like: auto_generate_conversation_name + extras: dict[str, Any] = {} diff --git a/api/core/entities/message_entities.py b/api/core/entities/message_entities.py new file mode 100644 index 00000000000000..d72f436aad8926 --- /dev/null +++ b/api/core/entities/message_entities.py @@ -0,0 +1,128 @@ +import enum +from typing import Any, cast + +from langchain.schema import HumanMessage, AIMessage, SystemMessage, BaseMessage, FunctionMessage +from pydantic import BaseModel + +from core.model_runtime.entities.message_entities import PromptMessage, UserPromptMessage, TextPromptMessageContent, \ + ImagePromptMessageContent, AssistantPromptMessage, SystemPromptMessage, ToolPromptMessage + + +class PromptMessageFileType(enum.Enum): + IMAGE = 'image' + + @staticmethod + def value_of(value): + for member in PromptMessageFileType: + if member.value == value: + return member + raise ValueError(f"No matching enum found for value '{value}'") + + +class PromptMessageFile(BaseModel): + type: PromptMessageFileType + data: Any + + +class ImagePromptMessageFile(PromptMessageFile): + class DETAIL(enum.Enum): + LOW = 'low' + HIGH = 'high' + + type: PromptMessageFileType = PromptMessageFileType.IMAGE + detail: DETAIL = DETAIL.LOW + + +class LCHumanMessageWithFiles(HumanMessage): + # content: Union[str, List[Union[str, Dict]]] + content: str + files: list[PromptMessageFile] + + +def lc_messages_to_prompt_messages(messages: list[BaseMessage]) -> list[PromptMessage]: + prompt_messages = [] + for message in messages: + if isinstance(message, HumanMessage): + if isinstance(message, LCHumanMessageWithFiles): + file_prompt_message_contents = [] + for file in message.files: + if file.type == PromptMessageFileType.IMAGE: + file = cast(ImagePromptMessageFile, file) + file_prompt_message_contents.append(ImagePromptMessageContent( + data=file.data, + detail=ImagePromptMessageContent.DETAIL.HIGH + if file.detail.value == "high" else ImagePromptMessageContent.DETAIL.LOW + )) + + prompt_message_contents = [TextPromptMessageContent(data=message.content)] + prompt_message_contents.extend(file_prompt_message_contents) + + prompt_messages.append(UserPromptMessage(content=prompt_message_contents)) + else: + prompt_messages.append(UserPromptMessage(content=message.content)) + elif isinstance(message, AIMessage): + message_kwargs = { + 'content': message.content + } + + if 'function_call' in message.additional_kwargs: + message_kwargs['tool_calls'] = [ + AssistantPromptMessage.ToolCall( + id=message.additional_kwargs['function_call']['id'], + type='function', + function=AssistantPromptMessage.ToolCall.ToolCallFunction( + name=message.additional_kwargs['function_call']['name'], + arguments=message.additional_kwargs['function_call']['arguments'] + ) + ) + ] + + prompt_messages.append(AssistantPromptMessage(**message_kwargs)) + elif isinstance(message, SystemMessage): + prompt_messages.append(SystemPromptMessage(content=message.content)) + elif isinstance(message, FunctionMessage): + prompt_messages.append(ToolPromptMessage(content=message.content, tool_call_id=message.name)) + + return prompt_messages + + +def prompt_messages_to_lc_messages(prompt_messages: list[PromptMessage]) -> list[BaseMessage]: + messages = [] + for prompt_message in prompt_messages: + if isinstance(prompt_message, UserPromptMessage): + if isinstance(prompt_message.content, str): + messages.append(HumanMessage(content=prompt_message.content)) + else: + message_contents = [] + for content in prompt_message.content: + if isinstance(content, TextPromptMessageContent): + message_contents.append(content.data) + elif isinstance(content, ImagePromptMessageContent): + message_contents.append({ + 'type': 'image', + 'data': content.data, + 'detail': content.detail.value + }) + + messages.append(HumanMessage(content=message_contents)) + elif isinstance(prompt_message, AssistantPromptMessage): + message_kwargs = { + 'content': prompt_message.content + } + + if prompt_message.tool_calls: + message_kwargs['additional_kwargs'] = { + 'function_call': { + 'id': prompt_message.tool_calls[0].id, + 'name': prompt_message.tool_calls[0].function.name, + 'arguments': prompt_message.tool_calls[0].function.arguments + } + } + + messages.append(AIMessage(**message_kwargs)) + elif isinstance(prompt_message, SystemPromptMessage): + messages.append(SystemMessage(content=prompt_message.content)) + elif isinstance(prompt_message, ToolPromptMessage): + messages.append(FunctionMessage(name=prompt_message.tool_call_id, content=prompt_message.content)) + + return messages diff --git a/api/core/entities/model_entities.py b/api/core/entities/model_entities.py new file mode 100644 index 00000000000000..6b49ec92484578 --- /dev/null +++ b/api/core/entities/model_entities.py @@ -0,0 +1,71 @@ +from enum import Enum +from typing import Optional + +from pydantic import BaseModel + +from core.model_runtime.entities.common_entities import I18nObject +from core.model_runtime.entities.model_entities import ProviderModel, ModelType +from core.model_runtime.entities.provider_entities import SimpleProviderEntity, ProviderEntity + + +class ModelStatus(Enum): + """ + Enum class for model status. + """ + ACTIVE = "active" + NO_CONFIGURE = "no-configure" + QUOTA_EXCEEDED = "quota-exceeded" + NO_PERMISSION = "no-permission" + + +class SimpleModelProviderEntity(BaseModel): + """ + Simple provider. + """ + provider: str + label: I18nObject + icon_small: Optional[I18nObject] = None + icon_large: Optional[I18nObject] = None + supported_model_types: list[ModelType] + + def __init__(self, provider_entity: ProviderEntity) -> None: + """ + Init simple provider. + + :param provider_entity: provider entity + """ + super().__init__( + provider=provider_entity.provider, + label=provider_entity.label, + icon_small=provider_entity.icon_small, + icon_large=provider_entity.icon_large, + supported_model_types=provider_entity.supported_model_types + ) + + +class ModelWithProviderEntity(ProviderModel): + """ + Model with provider entity. + """ + provider: SimpleModelProviderEntity + status: ModelStatus + + +class DefaultModelProviderEntity(BaseModel): + """ + Default model provider entity. + """ + provider: str + label: I18nObject + icon_small: Optional[I18nObject] = None + icon_large: Optional[I18nObject] = None + supported_model_types: list[ModelType] + + +class DefaultModelEntity(BaseModel): + """ + Default model entity. + """ + model: str + model_type: ModelType + provider: DefaultModelProviderEntity diff --git a/api/core/entities/provider_configuration.py b/api/core/entities/provider_configuration.py new file mode 100644 index 00000000000000..2228560a87ff97 --- /dev/null +++ b/api/core/entities/provider_configuration.py @@ -0,0 +1,657 @@ +import datetime +import json +import time +from json import JSONDecodeError +from typing import Optional, List, Dict, Tuple, Iterator + +from pydantic import BaseModel + +from core.entities.model_entities import ModelWithProviderEntity, ModelStatus, SimpleModelProviderEntity +from core.entities.provider_entities import SystemConfiguration, CustomConfiguration, SystemConfigurationStatus +from core.helper import encrypter +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.entities.provider_entities import ProviderEntity, CredentialFormSchema, FormType +from core.model_runtime.model_providers import model_provider_factory +from core.model_runtime.model_providers.__base.ai_model import AIModel +from core.model_runtime.model_providers.__base.model_provider import ModelProvider +from core.model_runtime.utils import encoders +from extensions.ext_database import db +from models.provider import ProviderType, Provider, ProviderModel, TenantPreferredModelProvider + + +class ProviderConfiguration(BaseModel): + """ + Model class for provider configuration. + """ + tenant_id: str + provider: ProviderEntity + preferred_provider_type: ProviderType + using_provider_type: ProviderType + system_configuration: SystemConfiguration + custom_configuration: CustomConfiguration + + def get_current_credentials(self, model_type: ModelType, model: str) -> Optional[dict]: + """ + Get current credentials. + + :param model_type: model type + :param model: model name + :return: + """ + if self.using_provider_type == ProviderType.SYSTEM: + return self.system_configuration.credentials + else: + if self.custom_configuration.models: + for model_configuration in self.custom_configuration.models: + if model_configuration.model_type == model_type and model_configuration.model == model: + return model_configuration.credentials + + if self.custom_configuration.provider: + return self.custom_configuration.provider.credentials + else: + return None + + def get_system_configuration_status(self) -> SystemConfigurationStatus: + """ + Get system configuration status. + :return: + """ + if self.system_configuration.enabled is False: + return SystemConfigurationStatus.UNSUPPORTED + + current_quota_type = self.system_configuration.current_quota_type + current_quota_configuration = next( + (q for q in self.system_configuration.quota_configurations if q.quota_type == current_quota_type), + None + ) + + return SystemConfigurationStatus.ACTIVE if current_quota_configuration.is_valid else \ + SystemConfigurationStatus.QUOTA_EXCEEDED + + def is_custom_configuration_available(self) -> bool: + """ + Check custom configuration available. + :return: + """ + return (self.custom_configuration.provider is not None + or len(self.custom_configuration.models) > 0) + + def get_custom_credentials(self, obfuscated: bool = False) -> Optional[dict]: + """ + Get custom credentials. + + :param obfuscated: obfuscated secret data in credentials + :return: + """ + if self.custom_configuration.provider is None: + return None + + credentials = self.custom_configuration.provider.credentials + if not obfuscated: + return credentials + + # Obfuscate credentials + return self._obfuscated_credentials( + credentials=credentials, + credential_form_schemas=self.provider.provider_credential_schema.credential_form_schemas + if self.provider.provider_credential_schema else [] + ) + + def custom_credentials_validate(self, credentials: dict) -> Tuple[Provider, dict]: + """ + Validate custom credentials. + :param credentials: provider credentials + :return: + """ + # get provider + provider_record = db.session.query(Provider) \ + .filter( + Provider.tenant_id == self.tenant_id, + Provider.provider_name == self.provider.provider, + Provider.provider_type == ProviderType.CUSTOM.value + ).first() + + # Get provider credential secret variables + provider_credential_secret_variables = self._extract_secret_variables( + self.provider.provider_credential_schema.credential_form_schemas + if self.provider.provider_credential_schema else [] + ) + + if provider_record: + try: + original_credentials = json.loads(provider_record.encrypted_config) if provider_record.encrypted_config else {} + except JSONDecodeError: + original_credentials = {} + + # encrypt credentials + for key, value in credentials.items(): + if key in provider_credential_secret_variables: + # if send [__HIDDEN__] in secret input, it will be same as original value + if value == '[__HIDDEN__]' and key in original_credentials: + credentials[key] = encrypter.decrypt_token(self.tenant_id, original_credentials[key]) + + model_provider_factory.provider_credentials_validate( + self.provider.provider, + credentials + ) + + for key, value in credentials.items(): + if key in provider_credential_secret_variables: + credentials[key] = encrypter.encrypt_token(self.tenant_id, value) + + return provider_record, credentials + + def add_or_update_custom_credentials(self, credentials: dict) -> None: + """ + Add or update custom provider credentials. + :param credentials: + :return: + """ + # validate custom provider config + provider_record, credentials = self.custom_credentials_validate(credentials) + + # save provider + # Note: Do not switch the preferred provider, which allows users to use quotas first + if provider_record: + provider_record.encrypted_config = json.dumps(credentials) + provider_record.is_valid = True + provider_record.updated_at = datetime.datetime.utcnow() + db.session.commit() + else: + provider_record = Provider( + tenant_id=self.tenant_id, + provider_name=self.provider.provider, + provider_type=ProviderType.CUSTOM.value, + encrypted_config=json.dumps(credentials), + is_valid=True + ) + db.session.add(provider_record) + db.session.commit() + + self.switch_preferred_provider_type(ProviderType.CUSTOM) + + def delete_custom_credentials(self) -> None: + """ + Delete custom provider credentials. + :return: + """ + # get provider + provider_record = db.session.query(Provider) \ + .filter( + Provider.tenant_id == self.tenant_id, + Provider.provider_name == self.provider.provider, + Provider.provider_type == ProviderType.CUSTOM.value + ).first() + + # delete provider + if provider_record: + self.switch_preferred_provider_type(ProviderType.SYSTEM) + + db.session.delete(provider_record) + db.session.commit() + + def get_custom_model_credentials(self, model_type: ModelType, model: str, obfuscated: bool = False) \ + -> Optional[dict]: + """ + Get custom model credentials. + + :param model_type: model type + :param model: model name + :param obfuscated: obfuscated secret data in credentials + :return: + """ + if not self.custom_configuration.models: + return None + + for model_configuration in self.custom_configuration.models: + if model_configuration.model_type == model_type and model_configuration.model == model: + credentials = model_configuration.credentials + if not obfuscated: + return credentials + + # Obfuscate credentials + return self._obfuscated_credentials( + credentials=credentials, + credential_form_schemas=self.provider.model_credential_schema.credential_form_schemas + if self.provider.model_credential_schema else [] + ) + + return None + + def custom_model_credentials_validate(self, model_type: ModelType, model: str, credentials: dict) \ + -> Tuple[ProviderModel, dict]: + """ + Validate custom model credentials. + + :param model_type: model type + :param model: model name + :param credentials: model credentials + :return: + """ + # get provider model + provider_model_record = db.session.query(ProviderModel) \ + .filter( + ProviderModel.tenant_id == self.tenant_id, + ProviderModel.provider_name == self.provider.provider, + ProviderModel.model_name == model, + ProviderModel.model_type == model_type.to_origin_model_type() + ).first() + + # Get provider credential secret variables + provider_credential_secret_variables = self._extract_secret_variables( + self.provider.model_credential_schema.credential_form_schemas + if self.provider.model_credential_schema else [] + ) + + if provider_model_record: + try: + original_credentials = json.loads(provider_model_record.encrypted_config) if provider_model_record.encrypted_config else {} + except JSONDecodeError: + original_credentials = {} + + # decrypt credentials + for key, value in credentials.items(): + if key in provider_credential_secret_variables: + # if send [__HIDDEN__] in secret input, it will be same as original value + if value == '[__HIDDEN__]' and key in original_credentials: + credentials[key] = encrypter.decrypt_token(self.tenant_id, original_credentials[key]) + + model_provider_factory.model_credentials_validate( + provider=self.provider.provider, + model_type=model_type, + model=model, + credentials=credentials + ) + + model_schema = ( + model_provider_factory.get_provider_instance(self.provider.provider) + .get_model_instance(model_type)._get_customizable_model_schema( + model=model, + credentials=credentials + ) + ) + + if model_schema: + credentials['schema'] = json.dumps(encoders.jsonable_encoder(model_schema)) + + for key, value in credentials.items(): + if key in provider_credential_secret_variables: + credentials[key] = encrypter.encrypt_token(self.tenant_id, value) + + return provider_model_record, credentials + + def add_or_update_custom_model_credentials(self, model_type: ModelType, model: str, credentials: dict) -> None: + """ + Add or update custom model credentials. + + :param model_type: model type + :param model: model name + :param credentials: model credentials + :return: + """ + # validate custom model config + provider_model_record, credentials = self.custom_model_credentials_validate(model_type, model, credentials) + + # save provider model + # Note: Do not switch the preferred provider, which allows users to use quotas first + if provider_model_record: + provider_model_record.encrypted_config = json.dumps(credentials) + provider_model_record.is_valid = True + provider_model_record.updated_at = datetime.datetime.utcnow() + db.session.commit() + else: + provider_model_record = ProviderModel( + tenant_id=self.tenant_id, + provider_name=self.provider.provider, + model_name=model, + model_type=model_type.to_origin_model_type(), + encrypted_config=json.dumps(credentials), + is_valid=True + ) + db.session.add(provider_model_record) + db.session.commit() + + def delete_custom_model_credentials(self, model_type: ModelType, model: str) -> None: + """ + Delete custom model credentials. + :param model_type: model type + :param model: model name + :return: + """ + # get provider model + provider_model_record = db.session.query(ProviderModel) \ + .filter( + ProviderModel.tenant_id == self.tenant_id, + ProviderModel.provider_name == self.provider.provider, + ProviderModel.model_name == model, + ProviderModel.model_type == model_type.to_origin_model_type() + ).first() + + # delete provider model + if provider_model_record: + db.session.delete(provider_model_record) + db.session.commit() + + def get_provider_instance(self) -> ModelProvider: + """ + Get provider instance. + :return: + """ + return model_provider_factory.get_provider_instance(self.provider.provider) + + def get_model_type_instance(self, model_type: ModelType) -> AIModel: + """ + Get current model type instance. + + :param model_type: model type + :return: + """ + # Get provider instance + provider_instance = self.get_provider_instance() + + # Get model instance of LLM + return provider_instance.get_model_instance(model_type) + + def switch_preferred_provider_type(self, provider_type: ProviderType) -> None: + """ + Switch preferred provider type. + :param provider_type: + :return: + """ + if provider_type == self.preferred_provider_type: + return + + if provider_type == ProviderType.SYSTEM and not self.system_configuration.enabled: + return + + # get preferred provider + preferred_model_provider = db.session.query(TenantPreferredModelProvider) \ + .filter( + TenantPreferredModelProvider.tenant_id == self.tenant_id, + TenantPreferredModelProvider.provider_name == self.provider.provider + ).first() + + if preferred_model_provider: + preferred_model_provider.preferred_provider_type = provider_type.value + else: + preferred_model_provider = TenantPreferredModelProvider( + tenant_id=self.tenant_id, + provider_name=self.provider.provider, + preferred_provider_type=provider_type.value + ) + db.session.add(preferred_model_provider) + + db.session.commit() + + def _extract_secret_variables(self, credential_form_schemas: list[CredentialFormSchema]) -> list[str]: + """ + Extract secret input form variables. + + :param credential_form_schemas: + :return: + """ + secret_input_form_variables = [] + for credential_form_schema in credential_form_schemas: + if credential_form_schema.type == FormType.SECRET_INPUT: + secret_input_form_variables.append(credential_form_schema.variable) + + return secret_input_form_variables + + def _obfuscated_credentials(self, credentials: dict, credential_form_schemas: list[CredentialFormSchema]) -> dict: + """ + Obfuscated credentials. + + :param credentials: credentials + :param credential_form_schemas: credential form schemas + :return: + """ + # Get provider credential secret variables + credential_secret_variables = self._extract_secret_variables( + credential_form_schemas + ) + + # Obfuscate provider credentials + copy_credentials = credentials.copy() + for key, value in copy_credentials.items(): + if key in credential_secret_variables: + copy_credentials[key] = encrypter.obfuscated_token(value) + + return copy_credentials + + def get_provider_model(self, model_type: ModelType, + model: str, + only_active: bool = False) -> Optional[ModelWithProviderEntity]: + """ + Get provider model. + :param model_type: model type + :param model: model name + :param only_active: return active model only + :return: + """ + provider_models = self.get_provider_models(model_type, only_active) + + for provider_model in provider_models: + if provider_model.model == model: + return provider_model + + return None + + def get_provider_models(self, model_type: Optional[ModelType] = None, + only_active: bool = False) -> list[ModelWithProviderEntity]: + """ + Get provider models. + :param model_type: model type + :param only_active: only active models + :return: + """ + provider_instance = self.get_provider_instance() + + model_types = [] + if model_type: + model_types.append(model_type) + else: + model_types = provider_instance.get_provider_schema().supported_model_types + + if self.using_provider_type == ProviderType.SYSTEM: + provider_models = self._get_system_provider_models( + model_types=model_types, + provider_instance=provider_instance + ) + else: + provider_models = self._get_custom_provider_models( + model_types=model_types, + provider_instance=provider_instance + ) + + if only_active: + provider_models = [m for m in provider_models if m.status == ModelStatus.ACTIVE] + + # resort provider_models + return sorted(provider_models, key=lambda x: x.model_type.value) + + def _get_system_provider_models(self, + model_types: list[ModelType], + provider_instance: ModelProvider) -> list[ModelWithProviderEntity]: + """ + Get system provider models. + + :param model_types: model types + :param provider_instance: provider instance + :return: + """ + provider_models = [] + for model_type in model_types: + provider_models.extend( + [ + ModelWithProviderEntity( + **m.dict(), + provider=SimpleModelProviderEntity(self.provider), + status=ModelStatus.ACTIVE + ) + for m in provider_instance.models(model_type) + ] + ) + + for quota_configuration in self.system_configuration.quota_configurations: + if self.system_configuration.current_quota_type != quota_configuration.quota_type: + continue + + restrict_llms = quota_configuration.restrict_llms + if not restrict_llms: + break + + # if llm name not in restricted llm list, remove it + for m in provider_models: + if m.model_type == ModelType.LLM and m.model not in restrict_llms: + m.status = ModelStatus.NO_PERMISSION + elif not quota_configuration.is_valid: + m.status = ModelStatus.QUOTA_EXCEEDED + + return provider_models + + def _get_custom_provider_models(self, + model_types: list[ModelType], + provider_instance: ModelProvider) -> list[ModelWithProviderEntity]: + """ + Get custom provider models. + + :param model_types: model types + :param provider_instance: provider instance + :return: + """ + provider_models = [] + + credentials = None + if self.custom_configuration.provider: + credentials = self.custom_configuration.provider.credentials + + for model_type in model_types: + if model_type not in self.provider.supported_model_types: + continue + + models = provider_instance.models(model_type) + for m in models: + provider_models.append( + ModelWithProviderEntity( + **m.dict(), + provider=SimpleModelProviderEntity(self.provider), + status=ModelStatus.ACTIVE if credentials else ModelStatus.NO_CONFIGURE + ) + ) + + # custom models + for model_configuration in self.custom_configuration.models: + if model_configuration.model_type not in model_types: + continue + + custom_model_schema = ( + provider_instance.get_model_instance(model_configuration.model_type) + .get_customizable_model_schema_from_credentials( + model_configuration.model, + model_configuration.credentials + ) + ) + + if not custom_model_schema: + continue + + provider_models.append( + ModelWithProviderEntity( + **custom_model_schema.dict(), + provider=SimpleModelProviderEntity(self.provider), + status=ModelStatus.ACTIVE + ) + ) + + return provider_models + + +class ProviderConfigurations(BaseModel): + """ + Model class for provider configuration dict. + """ + tenant_id: str + configurations: Dict[str, ProviderConfiguration] = {} + + def __init__(self, tenant_id: str): + super().__init__(tenant_id=tenant_id) + + def get_models(self, + provider: Optional[str] = None, + model_type: Optional[ModelType] = None, + only_active: bool = False) \ + -> list[ModelWithProviderEntity]: + """ + Get available models. + + If preferred provider type is `system`: + Get the current **system mode** if provider supported, + if all system modes are not available (no quota), it is considered to be the **custom credential mode**. + If there is no model configured in custom mode, it is treated as no_configure. + system > custom > no_configure + + If preferred provider type is `custom`: + If custom credentials are configured, it is treated as custom mode. + Otherwise, get the current **system mode** if supported, + If all system modes are not available (no quota), it is treated as no_configure. + custom > system > no_configure + + If real mode is `system`, use system credentials to get models, + paid quotas > provider free quotas > system free quotas + include pre-defined models (exclude GPT-4, status marked as `no_permission`). + If real mode is `custom`, use workspace custom credentials to get models, + include pre-defined models, custom models(manual append). + If real mode is `no_configure`, only return pre-defined models from `model runtime`. + (model status marked as `no_configure` if preferred provider type is `custom` otherwise `quota_exceeded`) + model status marked as `active` is available. + + :param provider: provider name + :param model_type: model type + :param only_active: only active models + :return: + """ + all_models = [] + for provider_configuration in self.values(): + if provider and provider_configuration.provider.provider != provider: + continue + + all_models.extend(provider_configuration.get_provider_models(model_type, only_active)) + + return all_models + + def to_list(self) -> List[ProviderConfiguration]: + """ + Convert to list. + + :return: + """ + return list(self.values()) + + def __getitem__(self, key): + return self.configurations[key] + + def __setitem__(self, key, value): + self.configurations[key] = value + + def __iter__(self): + return iter(self.configurations) + + def values(self) -> Iterator[ProviderConfiguration]: + return self.configurations.values() + + def get(self, key, default=None): + return self.configurations.get(key, default) + + +class ProviderModelBundle(BaseModel): + """ + Provider model bundle. + """ + configuration: ProviderConfiguration + provider_instance: ModelProvider + model_type_instance: AIModel + + class Config: + """Configuration for this pydantic object.""" + + arbitrary_types_allowed = True diff --git a/api/core/entities/provider_entities.py b/api/core/entities/provider_entities.py new file mode 100644 index 00000000000000..d8905c71af4387 --- /dev/null +++ b/api/core/entities/provider_entities.py @@ -0,0 +1,67 @@ +from enum import Enum +from typing import Optional + +from pydantic import BaseModel + +from core.model_runtime.entities.model_entities import ModelType +from models.provider import ProviderQuotaType + + +class QuotaUnit(Enum): + TIMES = 'times' + TOKENS = 'tokens' + + +class SystemConfigurationStatus(Enum): + """ + Enum class for system configuration status. + """ + ACTIVE = 'active' + QUOTA_EXCEEDED = 'quota-exceeded' + UNSUPPORTED = 'unsupported' + + +class QuotaConfiguration(BaseModel): + """ + Model class for provider quota configuration. + """ + quota_type: ProviderQuotaType + quota_unit: QuotaUnit + quota_limit: int + quota_used: int + is_valid: bool + restrict_llms: list[str] = [] + + +class SystemConfiguration(BaseModel): + """ + Model class for provider system configuration. + """ + enabled: bool + current_quota_type: Optional[ProviderQuotaType] = None + quota_configurations: list[QuotaConfiguration] = [] + credentials: Optional[dict] = None + + +class CustomProviderConfiguration(BaseModel): + """ + Model class for provider custom configuration. + """ + credentials: dict + + +class CustomModelConfiguration(BaseModel): + """ + Model class for provider custom model configuration. + """ + model: str + model_type: ModelType + credentials: dict + + +class CustomConfiguration(BaseModel): + """ + Model class for provider custom configuration. + """ + provider: Optional[CustomProviderConfiguration] = None + models: list[CustomModelConfiguration] = [] diff --git a/api/core/entities/queue_entities.py b/api/core/entities/queue_entities.py new file mode 100644 index 00000000000000..20b434b05d8b39 --- /dev/null +++ b/api/core/entities/queue_entities.py @@ -0,0 +1,118 @@ +from enum import Enum +from typing import Any + +from pydantic import BaseModel + +from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk + + +class QueueEvent(Enum): + """ + QueueEvent enum + """ + MESSAGE = "message" + MESSAGE_REPLACE = "message-replace" + MESSAGE_END = "message-end" + RETRIEVER_RESOURCES = "retriever-resources" + ANNOTATION_REPLY = "annotation-reply" + AGENT_THOUGHT = "agent-thought" + ERROR = "error" + PING = "ping" + STOP = "stop" + + +class AppQueueEvent(BaseModel): + """ + QueueEvent entity + """ + event: QueueEvent + + +class QueueMessageEvent(AppQueueEvent): + """ + QueueMessageEvent entity + """ + event = QueueEvent.MESSAGE + chunk: LLMResultChunk + + +class QueueMessageReplaceEvent(AppQueueEvent): + """ + QueueMessageReplaceEvent entity + """ + event = QueueEvent.MESSAGE_REPLACE + text: str + + +class QueueRetrieverResourcesEvent(AppQueueEvent): + """ + QueueRetrieverResourcesEvent entity + """ + event = QueueEvent.RETRIEVER_RESOURCES + retriever_resources: list[dict] + + +class AnnotationReplyEvent(AppQueueEvent): + """ + AnnotationReplyEvent entity + """ + event = QueueEvent.ANNOTATION_REPLY + message_annotation_id: str + + +class QueueMessageEndEvent(AppQueueEvent): + """ + QueueMessageEndEvent entity + """ + event = QueueEvent.MESSAGE_END + llm_result: LLMResult + + +class QueueAgentThoughtEvent(AppQueueEvent): + """ + QueueAgentThoughtEvent entity + """ + event = QueueEvent.AGENT_THOUGHT + agent_thought_id: str + + +class QueueErrorEvent(AppQueueEvent): + """ + QueueErrorEvent entity + """ + event = QueueEvent.ERROR + error: Any + + +class QueuePingEvent(AppQueueEvent): + """ + QueuePingEvent entity + """ + event = QueueEvent.PING + + +class QueueStopEvent(AppQueueEvent): + """ + QueueStopEvent entity + """ + class StopBy(Enum): + """ + Stop by enum + """ + USER_MANUAL = "user-manual" + ANNOTATION_REPLY = "annotation-reply" + OUTPUT_MODERATION = "output-moderation" + + event = QueueEvent.STOP + stopped_by: StopBy + + +class QueueMessage(BaseModel): + """ + QueueMessage entity + """ + task_id: str + message_id: str + conversation_id: str + app_mode: str + event: AppQueueEvent diff --git a/api/core/model_providers/models/entity/__init__.py b/api/core/errors/__init__.py similarity index 100% rename from api/core/model_providers/models/entity/__init__.py rename to api/core/errors/__init__.py diff --git a/api/core/model_providers/error.py b/api/core/errors/error.py similarity index 63% rename from api/core/model_providers/error.py rename to api/core/errors/error.py index 9bba8401f26bc8..fddfb345fd78c7 100644 --- a/api/core/model_providers/error.py +++ b/api/core/errors/error.py @@ -14,26 +14,6 @@ class LLMBadRequestError(LLMError): description = "Bad Request" -class LLMAPIConnectionError(LLMError): - """Raised when the LLM returns API connection error.""" - description = "API Connection Error" - - -class LLMAPIUnavailableError(LLMError): - """Raised when the LLM returns API unavailable error.""" - description = "API Unavailable Error" - - -class LLMRateLimitError(LLMError): - """Raised when the LLM returns rate limit error.""" - description = "Rate Limit Error" - - -class LLMAuthorizationError(LLMError): - """Raised when the LLM returns authorization error.""" - description = "Authorization Error" - - class ProviderTokenNotInitError(Exception): """ Custom exception raised when the provider token is not initialized. diff --git a/api/core/model_providers/models/llm/__init__.py b/api/core/external_data_tool/weather_search/__init__.py similarity index 100% rename from api/core/model_providers/models/llm/__init__.py rename to api/core/external_data_tool/weather_search/__init__.py diff --git a/api/core/external_data_tool/weather_search/schema.json b/api/core/external_data_tool/weather_search/schema.json new file mode 100644 index 00000000000000..6e8baffe59b276 --- /dev/null +++ b/api/core/external_data_tool/weather_search/schema.json @@ -0,0 +1,35 @@ +{ + "label": { + "en-US": "Weather Search", + "zh-Hans": "天气查询" + }, + "form_schema": [ + { + "type": "select", + "label": { + "en-US": "Temperature Unit", + "zh-Hans": "温度单位" + }, + "variable": "temperature_unit", + "required": true, + "options": [ + { + "label": { + "en-US": "Fahrenheit", + "zh-Hans": "华氏度" + }, + "value": "fahrenheit" + }, + { + "label": { + "en-US": "Centigrade", + "zh-Hans": "摄氏度" + }, + "value": "centigrade" + } + ], + "default": "centigrade", + "placeholder": "Please select temperature unit" + } + ] +} \ No newline at end of file diff --git a/api/core/external_data_tool/weather_search/weather_search.py b/api/core/external_data_tool/weather_search/weather_search.py new file mode 100644 index 00000000000000..70f11b72aee9ad --- /dev/null +++ b/api/core/external_data_tool/weather_search/weather_search.py @@ -0,0 +1,45 @@ +from typing import Optional + +from core.external_data_tool.base import ExternalDataTool + + +class WeatherSearch(ExternalDataTool): + """ + The name of custom type must be unique, keep the same with directory and file name. + """ + name: str = "weather_search" + + @classmethod + def validate_config(cls, tenant_id: str, config: dict) -> None: + """ + schema.json validation. It will be called when user save the config. + + Example: + .. code-block:: python + config = { + "temperature_unit": "centigrade" + } + + :param tenant_id: the id of workspace + :param config: the variables of form config + :return: + """ + + if not config.get('temperature_unit'): + raise ValueError('temperature unit is required') + + def query(self, inputs: dict, query: Optional[str] = None) -> str: + """ + Query the external data tool. + + :param inputs: user inputs + :param query: the query of chat app + :return: the tool query result + """ + city = inputs.get('city') + temperature_unit = self.config.get('temperature_unit') + + if temperature_unit == 'fahrenheit': + return f'Weather in {city} is 32°F' + else: + return f'Weather in {city} is 0°C' diff --git a/api/core/model_providers/models/moderation/__init__.py b/api/core/features/__init__.py similarity index 100% rename from api/core/model_providers/models/moderation/__init__.py rename to api/core/features/__init__.py diff --git a/api/core/features/agent_runner.py b/api/core/features/agent_runner.py new file mode 100644 index 00000000000000..2c63c6669919ea --- /dev/null +++ b/api/core/features/agent_runner.py @@ -0,0 +1,325 @@ +import logging +from typing import cast, Optional, List + +from langchain import WikipediaAPIWrapper +from langchain.callbacks.base import BaseCallbackHandler +from langchain.tools import BaseTool, WikipediaQueryRun, Tool +from pydantic import BaseModel, Field + +from core.agent.agent.agent_llm_callback import AgentLLMCallback +from core.agent.agent_executor import PlanningStrategy, AgentConfiguration, AgentExecutor +from core.application_queue_manager import ApplicationQueueManager +from core.callback_handler.agent_loop_gather_callback_handler import AgentLoopGatherCallbackHandler +from core.callback_handler.index_tool_callback_handler import DatasetIndexToolCallbackHandler +from core.callback_handler.std_out_callback_handler import DifyStdOutCallbackHandler +from core.entities.application_entities import ModelConfigEntity, InvokeFrom, \ + AgentEntity, AgentToolEntity, AppOrchestrationConfigEntity +from core.memory.token_buffer_memory import TokenBufferMemory +from core.model_runtime.entities.model_entities import ModelFeature, ModelType +from core.model_runtime.model_providers import model_provider_factory +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from core.tool.current_datetime_tool import DatetimeTool +from core.tool.dataset_retriever_tool import DatasetRetrieverTool +from core.tool.provider.serpapi_provider import SerpAPIToolProvider +from core.tool.serpapi_wrapper import OptimizedSerpAPIWrapper, OptimizedSerpAPIInput +from core.tool.web_reader_tool import WebReaderTool +from extensions.ext_database import db +from models.dataset import Dataset +from models.model import Message + +logger = logging.getLogger(__name__) + + +class AgentRunnerFeature: + def __init__(self, tenant_id: str, + app_orchestration_config: AppOrchestrationConfigEntity, + model_config: ModelConfigEntity, + config: AgentEntity, + queue_manager: ApplicationQueueManager, + message: Message, + user_id: str, + agent_llm_callback: AgentLLMCallback, + callback: AgentLoopGatherCallbackHandler, + memory: Optional[TokenBufferMemory] = None,) -> None: + """ + Agent runner + :param tenant_id: tenant id + :param app_orchestration_config: app orchestration config + :param model_config: model config + :param config: dataset config + :param queue_manager: queue manager + :param message: message + :param user_id: user id + :param agent_llm_callback: agent llm callback + :param callback: callback + :param memory: memory + """ + self.tenant_id = tenant_id + self.app_orchestration_config = app_orchestration_config + self.model_config = model_config + self.config = config + self.queue_manager = queue_manager + self.message = message + self.user_id = user_id + self.agent_llm_callback = agent_llm_callback + self.callback = callback + self.memory = memory + + def run(self, query: str, + invoke_from: InvokeFrom) -> Optional[str]: + """ + Retrieve agent loop result. + :param query: query + :param invoke_from: invoke from + :return: + """ + provider = self.config.provider + model = self.config.model + tool_configs = self.config.tools + + # check model is support tool calling + provider_instance = model_provider_factory.get_provider_instance(provider=provider) + model_type_instance = provider_instance.get_model_instance(ModelType.LLM) + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + # get model schema + model_schema = model_type_instance.get_model_schema( + model=model, + credentials=self.model_config.credentials + ) + + if not model_schema: + return None + + planning_strategy = PlanningStrategy.REACT + features = model_schema.features + if features: + if ModelFeature.TOOL_CALL in features \ + or ModelFeature.MULTI_TOOL_CALL in features: + planning_strategy = PlanningStrategy.FUNCTION_CALL + + tools = self.to_tools( + tool_configs=tool_configs, + invoke_from=invoke_from, + callbacks=[self.callback, DifyStdOutCallbackHandler()], + ) + + if len(tools) == 0: + return None + + agent_configuration = AgentConfiguration( + strategy=planning_strategy, + model_config=self.model_config, + tools=tools, + memory=self.memory, + max_iterations=10, + max_execution_time=400.0, + early_stopping_method="generate", + agent_llm_callback=self.agent_llm_callback, + callbacks=[self.callback, DifyStdOutCallbackHandler()] + ) + + agent_executor = AgentExecutor(agent_configuration) + + try: + # check if should use agent + should_use_agent = agent_executor.should_use_agent(query) + if not should_use_agent: + return None + + result = agent_executor.run(query) + return result.output + except Exception as ex: + logger.exception("agent_executor run failed") + return None + + def to_tools(self, tool_configs: list[AgentToolEntity], + invoke_from: InvokeFrom, + callbacks: list[BaseCallbackHandler]) \ + -> Optional[List[BaseTool]]: + """ + Convert tool configs to tools + :param tool_configs: tool configs + :param invoke_from: invoke from + :param callbacks: callbacks + """ + tools = [] + for tool_config in tool_configs: + tool = None + if tool_config.tool_id == "dataset": + tool = self.to_dataset_retriever_tool( + tool_config=tool_config.config, + invoke_from=invoke_from + ) + elif tool_config.tool_id == "web_reader": + tool = self.to_web_reader_tool( + tool_config=tool_config.config, + invoke_from=invoke_from + ) + elif tool_config.tool_id == "google_search": + tool = self.to_google_search_tool( + tool_config=tool_config.config, + invoke_from=invoke_from + ) + elif tool_config.tool_id == "wikipedia": + tool = self.to_wikipedia_tool( + tool_config=tool_config.config, + invoke_from=invoke_from + ) + elif tool_config.tool_id == "current_datetime": + tool = self.to_current_datetime_tool( + tool_config=tool_config.config, + invoke_from=invoke_from + ) + + if tool: + if tool.callbacks is not None: + tool.callbacks.extend(callbacks) + else: + tool.callbacks = callbacks + + tools.append(tool) + + return tools + + def to_dataset_retriever_tool(self, tool_config: dict, + invoke_from: InvokeFrom) \ + -> Optional[BaseTool]: + """ + A dataset tool is a tool that can be used to retrieve information from a dataset + :param tool_config: tool config + :param invoke_from: invoke from + """ + show_retrieve_source = self.app_orchestration_config.show_retrieve_source + + hit_callback = DatasetIndexToolCallbackHandler( + queue_manager=self.queue_manager, + app_id=self.message.app_id, + message_id=self.message.id, + user_id=self.user_id, + invoke_from=invoke_from + ) + + # get dataset from dataset id + dataset = db.session.query(Dataset).filter( + Dataset.tenant_id == self.tenant_id, + Dataset.id == tool_config.get("id") + ).first() + + # pass if dataset is not available + if not dataset: + return None + + # pass if dataset is not available + if (dataset and dataset.available_document_count == 0 + and dataset.available_document_count == 0): + return None + + # get retrieval model config + default_retrieval_model = { + 'search_method': 'semantic_search', + 'reranking_enable': False, + 'reranking_model': { + 'reranking_provider_name': '', + 'reranking_model_name': '' + }, + 'top_k': 2, + 'score_threshold_enabled': False + } + + retrieval_model_config = dataset.retrieval_model \ + if dataset.retrieval_model else default_retrieval_model + + # get top k + top_k = retrieval_model_config['top_k'] + + # get score threshold + score_threshold = None + score_threshold_enabled = retrieval_model_config.get("score_threshold_enabled") + if score_threshold_enabled: + score_threshold = retrieval_model_config.get("score_threshold") + + tool = DatasetRetrieverTool.from_dataset( + dataset=dataset, + top_k=top_k, + score_threshold=score_threshold, + hit_callbacks=[hit_callback], + return_resource=show_retrieve_source, + retriever_from=invoke_from.to_source() + ) + + return tool + + def to_web_reader_tool(self, tool_config: dict, + invoke_from: InvokeFrom) -> Optional[BaseTool]: + """ + A tool for reading web pages + :param tool_config: tool config + :param invoke_from: invoke from + :return: + """ + model_parameters = { + "temperature": 0, + "max_tokens": 500 + } + + tool = WebReaderTool( + model_config=self.model_config, + model_parameters=model_parameters, + max_chunk_length=4000, + continue_reading=True + ) + + return tool + + def to_google_search_tool(self, tool_config: dict, + invoke_from: InvokeFrom) -> Optional[BaseTool]: + """ + A tool for performing a Google search and extracting snippets and webpages + :param tool_config: tool config + :param invoke_from: invoke from + :return: + """ + tool_provider = SerpAPIToolProvider(tenant_id=self.tenant_id) + func_kwargs = tool_provider.credentials_to_func_kwargs() + if not func_kwargs: + return None + + tool = Tool( + name="google_search", + description="A tool for performing a Google search and extracting snippets and webpages " + "when you need to search for something you don't know or when your information " + "is not up to date. " + "Input should be a search query.", + func=OptimizedSerpAPIWrapper(**func_kwargs).run, + args_schema=OptimizedSerpAPIInput + ) + + return tool + + def to_current_datetime_tool(self, tool_config: dict, + invoke_from: InvokeFrom) -> Optional[BaseTool]: + """ + A tool for getting the current date and time + :param tool_config: tool config + :param invoke_from: invoke from + :return: + """ + return DatetimeTool() + + def to_wikipedia_tool(self, tool_config: dict, + invoke_from: InvokeFrom) -> Optional[BaseTool]: + """ + A tool for searching Wikipedia + :param tool_config: tool config + :param invoke_from: invoke from + :return: + """ + class WikipediaInput(BaseModel): + query: str = Field(..., description="search query.") + + return WikipediaQueryRun( + name="wikipedia", + api_wrapper=WikipediaAPIWrapper(doc_content_chars_max=4000), + args_schema=WikipediaInput + ) diff --git a/api/core/features/annotation_reply.py b/api/core/features/annotation_reply.py new file mode 100644 index 00000000000000..060a6c20c3bd02 --- /dev/null +++ b/api/core/features/annotation_reply.py @@ -0,0 +1,119 @@ +import logging +from typing import Optional + +from flask import current_app + +from core.embedding.cached_embedding import CacheEmbedding +from core.entities.application_entities import InvokeFrom +from core.index.vector_index.vector_index import VectorIndex +from core.model_manager import ModelManager +from core.model_runtime.entities.model_entities import ModelType +from extensions.ext_database import db +from models.dataset import Dataset +from models.model import App, Message, AppAnnotationSetting, MessageAnnotation +from services.annotation_service import AppAnnotationService +from services.dataset_service import DatasetCollectionBindingService + +logger = logging.getLogger(__name__) + + +class AnnotationReplyFeature: + def query(self, app_record: App, + message: Message, + query: str, + user_id: str, + invoke_from: InvokeFrom) -> Optional[MessageAnnotation]: + """ + Query app annotations to reply + :param app_record: app record + :param message: message + :param query: query + :param user_id: user id + :param invoke_from: invoke from + :return: + """ + annotation_setting = db.session.query(AppAnnotationSetting).filter( + AppAnnotationSetting.app_id == app_record.id).first() + + if not annotation_setting: + return None + + collection_binding_detail = annotation_setting.collection_binding_detail + + try: + score_threshold = annotation_setting.score_threshold or 1 + embedding_provider_name = collection_binding_detail.provider_name + embedding_model_name = collection_binding_detail.model_name + + model_manager = ModelManager() + model_instance = model_manager.get_model_instance( + tenant_id=app_record.tenant_id, + provider=embedding_provider_name, + model_type=ModelType.TEXT_EMBEDDING, + model=embedding_model_name + ) + + # get embedding model + embeddings = CacheEmbedding(model_instance) + + dataset_collection_binding = DatasetCollectionBindingService.get_dataset_collection_binding( + embedding_provider_name, + embedding_model_name, + 'annotation' + ) + + dataset = Dataset( + id=app_record.id, + tenant_id=app_record.tenant_id, + indexing_technique='high_quality', + embedding_model_provider=embedding_provider_name, + embedding_model=embedding_model_name, + collection_binding_id=dataset_collection_binding.id + ) + + vector_index = VectorIndex( + dataset=dataset, + config=current_app.config, + embeddings=embeddings, + attributes=['doc_id', 'annotation_id', 'app_id'] + ) + + documents = vector_index.search( + query=query, + search_type='similarity_score_threshold', + search_kwargs={ + 'k': 1, + 'score_threshold': score_threshold, + 'filter': { + 'group_id': [dataset.id] + } + } + ) + + if documents: + annotation_id = documents[0].metadata['annotation_id'] + score = documents[0].metadata['score'] + annotation = AppAnnotationService.get_annotation_by_id(annotation_id) + if annotation: + if invoke_from in [InvokeFrom.SERVICE_API, InvokeFrom.WEB_APP]: + from_source = 'api' + else: + from_source = 'console' + + # insert annotation history + AppAnnotationService.add_annotation_history(annotation.id, + app_record.id, + annotation.question, + annotation.content, + query, + user_id, + message.id, + from_source, + score) + + return annotation + except Exception as e: + logger.warning(f'Query annotation failed, exception: {str(e)}.') + return None + + return None diff --git a/api/core/features/dataset_retrieval.py b/api/core/features/dataset_retrieval.py new file mode 100644 index 00000000000000..3476bf9ad9050c --- /dev/null +++ b/api/core/features/dataset_retrieval.py @@ -0,0 +1,181 @@ +from typing import cast, Optional, List + +from langchain.tools import BaseTool + +from core.agent.agent_executor import PlanningStrategy, AgentConfiguration, AgentExecutor +from core.callback_handler.index_tool_callback_handler import DatasetIndexToolCallbackHandler +from core.entities.application_entities import DatasetEntity, ModelConfigEntity, InvokeFrom, DatasetRetrieveConfigEntity +from core.memory.token_buffer_memory import TokenBufferMemory +from core.model_runtime.entities.model_entities import ModelFeature +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from core.tool.dataset_multi_retriever_tool import DatasetMultiRetrieverTool +from core.tool.dataset_retriever_tool import DatasetRetrieverTool +from extensions.ext_database import db +from models.dataset import Dataset + + +class DatasetRetrievalFeature: + def retrieve(self, tenant_id: str, + model_config: ModelConfigEntity, + config: DatasetEntity, + query: str, + invoke_from: InvokeFrom, + show_retrieve_source: bool, + hit_callback: DatasetIndexToolCallbackHandler, + memory: Optional[TokenBufferMemory] = None) -> Optional[str]: + """ + Retrieve dataset. + :param tenant_id: tenant id + :param model_config: model config + :param config: dataset config + :param query: query + :param invoke_from: invoke from + :param show_retrieve_source: show retrieve source + :param hit_callback: hit callback + :param memory: memory + :return: + """ + dataset_ids = config.dataset_ids + retrieve_config = config.retrieve_config + + # check model is support tool calling + model_type_instance = model_config.provider_model_bundle.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + + # get model schema + model_schema = model_type_instance.get_model_schema( + model=model_config.model, + credentials=model_config.credentials + ) + + if not model_schema: + return None + + planning_strategy = PlanningStrategy.REACT_ROUTER + features = model_schema.features + if features: + if ModelFeature.TOOL_CALL in features \ + or ModelFeature.MULTI_TOOL_CALL in features: + planning_strategy = PlanningStrategy.ROUTER + + dataset_retriever_tools = self.to_dataset_retriever_tool( + tenant_id=tenant_id, + dataset_ids=dataset_ids, + retrieve_config=retrieve_config, + return_resource=show_retrieve_source, + invoke_from=invoke_from, + hit_callback=hit_callback + ) + + if len(dataset_retriever_tools) == 0: + return None + + agent_configuration = AgentConfiguration( + strategy=planning_strategy, + model_config=model_config, + tools=dataset_retriever_tools, + memory=memory, + max_iterations=10, + max_execution_time=400.0, + early_stopping_method="generate" + ) + + agent_executor = AgentExecutor(agent_configuration) + + should_use_agent = agent_executor.should_use_agent(query) + if not should_use_agent: + return None + + result = agent_executor.run(query) + + return result.output + + def to_dataset_retriever_tool(self, tenant_id: str, + dataset_ids: list[str], + retrieve_config: DatasetRetrieveConfigEntity, + return_resource: bool, + invoke_from: InvokeFrom, + hit_callback: DatasetIndexToolCallbackHandler) \ + -> Optional[List[BaseTool]]: + """ + A dataset tool is a tool that can be used to retrieve information from a dataset + :param tenant_id: tenant id + :param dataset_ids: dataset ids + :param retrieve_config: retrieve config + :param return_resource: return resource + :param invoke_from: invoke from + :param hit_callback: hit callback + """ + tools = [] + available_datasets = [] + for dataset_id in dataset_ids: + # get dataset from dataset id + dataset = db.session.query(Dataset).filter( + Dataset.tenant_id == tenant_id, + Dataset.id == dataset_id + ).first() + + # pass if dataset is not available + if not dataset: + continue + + # pass if dataset is not available + if (dataset and dataset.available_document_count == 0 + and dataset.available_document_count == 0): + continue + + available_datasets.append(dataset) + + if retrieve_config.retrieve_strategy == DatasetRetrieveConfigEntity.RetrieveStrategy.SINGLE: + # get retrieval model config + default_retrieval_model = { + 'search_method': 'semantic_search', + 'reranking_enable': False, + 'reranking_model': { + 'reranking_provider_name': '', + 'reranking_model_name': '' + }, + 'top_k': 2, + 'score_threshold_enabled': False + } + + for dataset in available_datasets: + retrieval_model_config = dataset.retrieval_model \ + if dataset.retrieval_model else default_retrieval_model + + # get top k + top_k = retrieval_model_config['top_k'] + + # get score threshold + score_threshold = None + score_threshold_enabled = retrieval_model_config.get("score_threshold_enabled") + if score_threshold_enabled: + score_threshold = retrieval_model_config.get("score_threshold") + + tool = DatasetRetrieverTool.from_dataset( + dataset=dataset, + top_k=top_k, + score_threshold=score_threshold, + hit_callbacks=[hit_callback], + return_resource=return_resource, + retriever_from=invoke_from.to_source() + ) + + tools.append(tool) + elif retrieve_config.retrieve_strategy == DatasetRetrieveConfigEntity.RetrieveStrategy.MULTIPLE: + tool = DatasetMultiRetrieverTool.from_dataset( + dataset_ids=[dataset.id for dataset in available_datasets], + tenant_id=tenant_id, + top_k=retrieve_config.top_k or 2, + score_threshold=(retrieve_config.score_threshold or 0.5) + if retrieve_config.reranking_model.get('score_threshold_enabled', False) else None, + hit_callbacks=[hit_callback], + return_resource=return_resource, + retriever_from=invoke_from.to_source(), + reranking_provider_name=retrieve_config.reranking_model.get('reranking_provider_name'), + reranking_model_name=retrieve_config.reranking_model.get('reranking_model_name') + ) + + tools.append(tool) + + return tools diff --git a/api/core/features/external_data_fetch.py b/api/core/features/external_data_fetch.py new file mode 100644 index 00000000000000..272b7cee952c8c --- /dev/null +++ b/api/core/features/external_data_fetch.py @@ -0,0 +1,96 @@ +import concurrent +import json +import logging + +from concurrent.futures import ThreadPoolExecutor +from typing import Tuple, Optional + +from flask import current_app, Flask + +from core.entities.application_entities import ExternalDataVariableEntity +from core.external_data_tool.factory import ExternalDataToolFactory + +logger = logging.getLogger(__name__) + + +class ExternalDataFetchFeature: + def fetch(self, tenant_id: str, + app_id: str, + external_data_tools: list[ExternalDataVariableEntity], + inputs: dict, + query: str) -> dict: + """ + Fill in variable inputs from external data tools if exists. + + :param tenant_id: workspace id + :param app_id: app id + :param external_data_tools: external data tools configs + :param inputs: the inputs + :param query: the query + :return: the filled inputs + """ + # Group tools by type and config + grouped_tools = {} + for tool in external_data_tools: + tool_key = (tool.type, json.dumps(tool.config, sort_keys=True)) + grouped_tools.setdefault(tool_key, []).append(tool) + + results = {} + with ThreadPoolExecutor() as executor: + futures = {} + for tool in external_data_tools: + future = executor.submit( + self._query_external_data_tool, + current_app._get_current_object(), + tenant_id, + app_id, + tool, + inputs, + query + ) + + futures[future] = tool + + for future in concurrent.futures.as_completed(futures): + tool_variable, result = future.result() + results[tool_variable] = result + + inputs.update(results) + return inputs + + def _query_external_data_tool(self, flask_app: Flask, + tenant_id: str, + app_id: str, + external_data_tool: ExternalDataVariableEntity, + inputs: dict, + query: str) -> Tuple[Optional[str], Optional[str]]: + """ + Query external data tool. + :param flask_app: flask app + :param tenant_id: tenant id + :param app_id: app id + :param external_data_tool: external data tool + :param inputs: inputs + :param query: query + :return: + """ + with flask_app.app_context(): + tool_variable = external_data_tool.variable + tool_type = external_data_tool.type + tool_config = external_data_tool.config + + external_data_tool_factory = ExternalDataToolFactory( + name=tool_type, + tenant_id=tenant_id, + app_id=app_id, + variable=tool_variable, + config=tool_config + ) + + # query external data tool + result = external_data_tool_factory.query( + inputs=inputs, + query=query + ) + + return tool_variable, result diff --git a/api/core/features/hosting_moderation.py b/api/core/features/hosting_moderation.py new file mode 100644 index 00000000000000..d8ae7adcac5d47 --- /dev/null +++ b/api/core/features/hosting_moderation.py @@ -0,0 +1,32 @@ +import logging + +from core.entities.application_entities import ApplicationGenerateEntity +from core.helper import moderation +from core.model_runtime.entities.message_entities import PromptMessage + +logger = logging.getLogger(__name__) + + +class HostingModerationFeature: + def check(self, application_generate_entity: ApplicationGenerateEntity, + prompt_messages: list[PromptMessage]) -> bool: + """ + Check hosting moderation + :param application_generate_entity: application generate entity + :param prompt_messages: prompt messages + :return: + """ + app_orchestration_config = application_generate_entity.app_orchestration_config_entity + model_config = app_orchestration_config.model_config + + text = "" + for prompt_message in prompt_messages: + if isinstance(prompt_message.content, str): + text += prompt_message.content + "\n" + + moderation_result = moderation.check_moderation( + model_config, + text + ) + + return moderation_result diff --git a/api/core/features/moderation.py b/api/core/features/moderation.py new file mode 100644 index 00000000000000..9735fad0e70ebe --- /dev/null +++ b/api/core/features/moderation.py @@ -0,0 +1,50 @@ +import logging +from typing import Tuple + +from core.entities.application_entities import AppOrchestrationConfigEntity +from core.moderation.base import ModerationAction, ModerationException +from core.moderation.factory import ModerationFactory + +logger = logging.getLogger(__name__) + + +class ModerationFeature: + def check(self, app_id: str, + tenant_id: str, + app_orchestration_config_entity: AppOrchestrationConfigEntity, + inputs: dict, + query: str) -> Tuple[bool, dict, str]: + """ + Process sensitive_word_avoidance. + :param app_id: app id + :param tenant_id: tenant id + :param app_orchestration_config_entity: app orchestration config entity + :param inputs: inputs + :param query: query + :return: + """ + if not app_orchestration_config_entity.sensitive_word_avoidance: + return False, inputs, query + + sensitive_word_avoidance_config = app_orchestration_config_entity.sensitive_word_avoidance + moderation_type = sensitive_word_avoidance_config.type + + moderation_factory = ModerationFactory( + name=moderation_type, + app_id=app_id, + tenant_id=tenant_id, + config=sensitive_word_avoidance_config.config + ) + + moderation_result = moderation_factory.moderation_for_inputs(inputs, query) + + if not moderation_result.flagged: + return False, inputs, query + + if moderation_result.action == ModerationAction.DIRECT_OUTPUT: + raise ModerationException(moderation_result.preset_response) + elif moderation_result.action == ModerationAction.OVERRIDED: + inputs = moderation_result.inputs + query = moderation_result.query + + return True, inputs, query diff --git a/api/core/file/file_obj.py b/api/core/file/file_obj.py index e2487e7ed1adb2..7f6e79b15b9b41 100644 --- a/api/core/file/file_obj.py +++ b/api/core/file/file_obj.py @@ -4,7 +4,7 @@ from pydantic import BaseModel from core.file.upload_file_parser import UploadFileParser -from core.model_providers.models.entity.message import PromptMessageFile, ImagePromptMessageFile +from core.model_runtime.entities.message_entities import ImagePromptMessageContent from extensions.ext_database import db from models.model import UploadFile @@ -50,14 +50,14 @@ def preview_url(self) -> Optional[str]: return self._get_data(force_url=True) @property - def prompt_message_file(self) -> PromptMessageFile: + def prompt_message_content(self) -> ImagePromptMessageContent: if self.type == FileType.IMAGE: image_config = self.file_config.get('image') - return ImagePromptMessageFile( + return ImagePromptMessageContent( data=self.data, - detail=ImagePromptMessageFile.DETAIL.HIGH - if image_config.get("detail") == "high" else ImagePromptMessageFile.DETAIL.LOW + detail=ImagePromptMessageContent.DETAIL.HIGH + if image_config.get("detail") == "high" else ImagePromptMessageContent.DETAIL.LOW ) def _get_data(self, force_url: bool = False) -> Optional[str]: diff --git a/api/core/generator/llm_generator.py b/api/core/generator/llm_generator.py index 87a934e55d54e6..acb7a6d2c92e92 100644 --- a/api/core/generator/llm_generator.py +++ b/api/core/generator/llm_generator.py @@ -3,10 +3,10 @@ from langchain.schema import OutputParserException -from core.model_providers.error import LLMError, ProviderTokenNotInitError -from core.model_providers.model_factory import ModelFactory -from core.model_providers.models.entity.message import PromptMessage, MessageType -from core.model_providers.models.entity.model_params import ModelKwargs +from core.model_manager import ModelManager +from core.model_runtime.entities.message_entities import UserPromptMessage, SystemPromptMessage +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.errors.invoke import InvokeAuthorizationError, InvokeError from core.prompt.output_parser.rule_config_generator import RuleConfigGeneratorOutputParser from core.prompt.output_parser.suggested_questions_after_answer import SuggestedQuestionsAfterAnswerOutputParser @@ -26,17 +26,22 @@ def generate_conversation_name(cls, tenant_id: str, query): prompt += query + "\n" - model_instance = ModelFactory.get_text_generation_model( + model_manager = ModelManager() + model_instance = model_manager.get_default_model_instance( tenant_id=tenant_id, - model_kwargs=ModelKwargs( - temperature=1, - max_tokens=100 - ) + model_type=ModelType.LLM, ) - prompts = [PromptMessage(content=prompt)] - response = model_instance.run(prompts) - answer = response.content + prompts = [UserPromptMessage(content=prompt)] + response = model_instance.invoke_llm( + prompt_messages=prompts, + model_parameters={ + "max_tokens": 100, + "temperature": 1 + }, + stream=False + ) + answer = response.message.content result_dict = json.loads(answer) answer = result_dict['Your Output'] @@ -62,22 +67,28 @@ def generate_suggested_questions_after_answer(cls, tenant_id: str, histories: st }) try: - model_instance = ModelFactory.get_text_generation_model( + model_manager = ModelManager() + model_instance = model_manager.get_default_model_instance( tenant_id=tenant_id, - model_kwargs=ModelKwargs( - max_tokens=256, - temperature=0 - ) + model_type=ModelType.LLM, ) - except ProviderTokenNotInitError: + except InvokeAuthorizationError: return [] - prompt_messages = [PromptMessage(content=prompt)] + prompt_messages = [UserPromptMessage(content=prompt)] try: - output = model_instance.run(prompt_messages) - questions = output_parser.parse(output.content) - except LLMError: + response = model_instance.invoke_llm( + prompt_messages=prompt_messages, + model_parameters={ + "max_tokens": 256, + "temperature": 0 + }, + stream=False + ) + + questions = output_parser.parse(response.message.content) + except InvokeError: questions = [] except Exception as e: logging.exception(e) @@ -105,20 +116,26 @@ def generate_rule_config(cls, tenant_id: str, audiences: str, hoping_to_solve: s remove_template_variables=False ) - model_instance = ModelFactory.get_text_generation_model( + model_manager = ModelManager() + model_instance = model_manager.get_default_model_instance( tenant_id=tenant_id, - model_kwargs=ModelKwargs( - max_tokens=512, - temperature=0 - ) + model_type=ModelType.LLM, ) - prompt_messages = [PromptMessage(content=prompt)] + prompt_messages = [UserPromptMessage(content=prompt)] try: - output = model_instance.run(prompt_messages) - rule_config = output_parser.parse(output.content) - except LLMError as e: + response = model_instance.invoke_llm( + prompt_messages=prompt_messages, + model_parameters={ + "max_tokens": 512, + "temperature": 0 + }, + stream=False + ) + + rule_config = output_parser.parse(response.message.content) + except InvokeError as e: raise e except OutputParserException: raise ValueError('Please give a valid input for intended audience or hoping to solve problems.') @@ -136,18 +153,24 @@ def generate_rule_config(cls, tenant_id: str, audiences: str, hoping_to_solve: s def generate_qa_document(cls, tenant_id: str, query, document_language: str): prompt = GENERATOR_QA_PROMPT.format(language=document_language) - model_instance = ModelFactory.get_text_generation_model( + model_manager = ModelManager() + model_instance = model_manager.get_default_model_instance( tenant_id=tenant_id, - model_kwargs=ModelKwargs( - max_tokens=2000 - ) + model_type=ModelType.LLM, ) - prompts = [ - PromptMessage(content=prompt, type=MessageType.SYSTEM), - PromptMessage(content=query) + prompt_messages = [ + SystemPromptMessage(content=prompt), + UserPromptMessage(content=query) ] - response = model_instance.run(prompts) - answer = response.content + response = model_instance.invoke_llm( + prompt_messages=prompt_messages, + model_parameters={ + "max_tokens": 2000 + }, + stream=False + ) + + answer = response.message.content return answer.strip() diff --git a/api/core/helper/encrypter.py b/api/core/helper/encrypter.py index fa94867ba280c5..4d57d2d5fef627 100644 --- a/api/core/helper/encrypter.py +++ b/api/core/helper/encrypter.py @@ -18,3 +18,17 @@ def encrypt_token(tenant_id: str, token: str): def decrypt_token(tenant_id: str, token: str): return rsa.decrypt(base64.b64decode(token), tenant_id) + + +def batch_decrypt_token(tenant_id: str, tokens: list[str]): + rsa_key, cipher_rsa = rsa.get_decrypt_decoding(tenant_id) + + return [rsa.decrypt_token_with_decoding(base64.b64decode(token), rsa_key, cipher_rsa) for token in tokens] + + +def get_decrypt_decoding(tenant_id: str): + return rsa.get_decrypt_decoding(tenant_id) + + +def decrypt_token_with_decoding(token: str, rsa_key, cipher_rsa): + return rsa.decrypt_token_with_decoding(base64.b64decode(token), rsa_key, cipher_rsa) diff --git a/api/core/helper/lru_cache.py b/api/core/helper/lru_cache.py new file mode 100644 index 00000000000000..518962c1652df7 --- /dev/null +++ b/api/core/helper/lru_cache.py @@ -0,0 +1,22 @@ +from collections import OrderedDict +from typing import Any + + +class LRUCache: + def __init__(self, capacity: int): + self.cache = OrderedDict() + self.capacity = capacity + + def get(self, key: Any) -> Any: + if key not in self.cache: + return None + else: + self.cache.move_to_end(key) # move the key to the end of the OrderedDict + return self.cache[key] + + def put(self, key: Any, value: Any) -> None: + if key in self.cache: + self.cache.move_to_end(key) + self.cache[key] = value + if len(self.cache) > self.capacity: + self.cache.popitem(last=False) # pop the first item diff --git a/api/core/helper/moderation.py b/api/core/helper/moderation.py index ac71af9ef4db9f..86d6b498da35e7 100644 --- a/api/core/helper/moderation.py +++ b/api/core/helper/moderation.py @@ -1,18 +1,27 @@ import logging import random -import openai - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.providers.base import BaseModelProvider -from core.model_providers.providers.hosted import hosted_config, hosted_model_providers +from core.entities.application_entities import ModelConfigEntity +from core.model_runtime.errors.invoke import InvokeBadRequestError +from core.model_runtime.model_providers.openai.moderation.moderation import OpenAIModerationModel +from extensions.ext_hosting_provider import hosting_configuration from models.provider import ProviderType +logger = logging.getLogger(__name__) + + +def check_moderation(model_config: ModelConfigEntity, text: str) -> bool: + moderation_config = hosting_configuration.moderation_config + if (moderation_config and moderation_config.enabled is True + and 'openai' in hosting_configuration.provider_map + and hosting_configuration.provider_map['openai'].enabled is True + ): + using_provider_type = model_config.provider_model_bundle.configuration.using_provider_type + provider_name = model_config.provider + if using_provider_type == ProviderType.SYSTEM \ + and provider_name in moderation_config.providers: + hosting_openai_config = hosting_configuration.provider_map['openai'] -def check_moderation(model_provider: BaseModelProvider, text: str) -> bool: - if hosted_config.moderation.enabled is True and hosted_model_providers.openai: - if model_provider.provider.provider_type == ProviderType.SYSTEM.value \ - and model_provider.provider_name in hosted_config.moderation.providers: # 2000 text per chunk length = 2000 text_chunks = [text[i:i + length] for i in range(0, len(text), length)] @@ -23,14 +32,17 @@ def check_moderation(model_provider: BaseModelProvider, text: str) -> bool: text_chunk = random.choice(text_chunks) try: - moderation_result = openai.Moderation.create(input=text_chunk, - api_key=hosted_model_providers.openai.api_key) + model_type_instance = OpenAIModerationModel() + moderation_result = model_type_instance.invoke( + model='text-moderation-stable', + credentials=hosting_openai_config.credentials, + text=text_chunk + ) + + if moderation_result is True: + return True except Exception as ex: - logging.exception(ex) - raise LLMBadRequestError('Rate limit exceeded, please try again later.') - - for result in moderation_result.results: - if result['flagged'] is True: - return False + logger.exception(ex) + raise InvokeBadRequestError('Rate limit exceeded, please try again later.') - return True + return False diff --git a/api/core/hosting_configuration.py b/api/core/hosting_configuration.py new file mode 100644 index 00000000000000..ad58dd382e461e --- /dev/null +++ b/api/core/hosting_configuration.py @@ -0,0 +1,213 @@ +import os +from typing import Optional + +from flask import Flask +from pydantic import BaseModel + +from core.entities.provider_entities import QuotaUnit +from models.provider import ProviderQuotaType + + +class HostingQuota(BaseModel): + quota_type: ProviderQuotaType + restrict_llms: list[str] = [] + + +class TrialHostingQuota(HostingQuota): + quota_type: ProviderQuotaType = ProviderQuotaType.TRIAL + quota_limit: int = 0 + """Quota limit for the hosting provider models. -1 means unlimited.""" + + +class PaidHostingQuota(HostingQuota): + quota_type: ProviderQuotaType = ProviderQuotaType.PAID + stripe_price_id: str = None + increase_quota: int = 1 + min_quantity: int = 20 + max_quantity: int = 100 + + +class FreeHostingQuota(HostingQuota): + quota_type: ProviderQuotaType = ProviderQuotaType.FREE + + +class HostingProvider(BaseModel): + enabled: bool = False + credentials: Optional[dict] = None + quota_unit: Optional[QuotaUnit] = None + quotas: list[HostingQuota] = [] + + +class HostedModerationConfig(BaseModel): + enabled: bool = False + providers: list[str] = [] + + +class HostingConfiguration: + provider_map: dict[str, HostingProvider] = {} + moderation_config: HostedModerationConfig = None + + def init_app(self, app: Flask): + if app.config.get('EDITION') != 'CLOUD': + return + + self.provider_map["openai"] = self.init_openai() + self.provider_map["anthropic"] = self.init_anthropic() + self.provider_map["minimax"] = self.init_minimax() + self.provider_map["spark"] = self.init_spark() + self.provider_map["zhipuai"] = self.init_zhipuai() + + self.moderation_config = self.init_moderation_config() + + def init_openai(self) -> HostingProvider: + quota_unit = QuotaUnit.TIMES + if os.environ.get("HOSTED_OPENAI_ENABLED") and os.environ.get("HOSTED_OPENAI_ENABLED").lower() == 'true': + credentials = { + "openai_api_key": os.environ.get("HOSTED_OPENAI_API_KEY"), + } + + if os.environ.get("HOSTED_OPENAI_API_BASE"): + credentials["openai_api_base"] = os.environ.get("HOSTED_OPENAI_API_BASE") + + if os.environ.get("HOSTED_OPENAI_API_ORGANIZATION"): + credentials["openai_organization"] = os.environ.get("HOSTED_OPENAI_API_ORGANIZATION") + + quotas = [] + hosted_quota_limit = int(os.environ.get("HOSTED_OPENAI_QUOTA_LIMIT", "200")) + if hosted_quota_limit != -1 or hosted_quota_limit > 0: + trial_quota = TrialHostingQuota( + quota_limit=hosted_quota_limit, + restrict_llms=[ + "gpt-3.5-turbo", + "gpt-3.5-turbo-1106", + "gpt-3.5-turbo-instruct", + "gpt-3.5-turbo-16k", + "text-davinci-003" + ] + ) + quotas.append(trial_quota) + + if os.environ.get("HOSTED_OPENAI_PAID_ENABLED") and os.environ.get( + "HOSTED_OPENAI_PAID_ENABLED").lower() == 'true': + paid_quota = PaidHostingQuota( + stripe_price_id=os.environ.get("HOSTED_OPENAI_PAID_STRIPE_PRICE_ID"), + increase_quota=int(os.environ.get("HOSTED_OPENAI_PAID_INCREASE_QUOTA", "1")), + min_quantity=int(os.environ.get("HOSTED_OPENAI_PAID_MIN_QUANTITY", "1")), + max_quantity=int(os.environ.get("HOSTED_OPENAI_PAID_MAX_QUANTITY", "1")) + ) + quotas.append(paid_quota) + + return HostingProvider( + enabled=True, + credentials=credentials, + quota_unit=quota_unit, + quotas=quotas + ) + + return HostingProvider( + enabled=False, + quota_unit=quota_unit, + ) + + def init_anthropic(self) -> HostingProvider: + quota_unit = QuotaUnit.TOKENS + if os.environ.get("HOSTED_ANTHROPIC_ENABLED") and os.environ.get("HOSTED_ANTHROPIC_ENABLED").lower() == 'true': + credentials = { + "anthropic_api_key": os.environ.get("HOSTED_ANTHROPIC_API_KEY"), + } + + if os.environ.get("HOSTED_ANTHROPIC_API_BASE"): + credentials["anthropic_api_url"] = os.environ.get("HOSTED_ANTHROPIC_API_BASE") + + quotas = [] + hosted_quota_limit = int(os.environ.get("HOSTED_ANTHROPIC_QUOTA_LIMIT", "0")) + if hosted_quota_limit != -1 or hosted_quota_limit > 0: + trial_quota = TrialHostingQuota( + quota_limit=hosted_quota_limit + ) + quotas.append(trial_quota) + + if os.environ.get("HOSTED_ANTHROPIC_PAID_ENABLED") and os.environ.get( + "HOSTED_ANTHROPIC_PAID_ENABLED").lower() == 'true': + paid_quota = PaidHostingQuota( + stripe_price_id=os.environ.get("HOSTED_ANTHROPIC_PAID_STRIPE_PRICE_ID"), + increase_quota=int(os.environ.get("HOSTED_ANTHROPIC_PAID_INCREASE_QUOTA", "1000000")), + min_quantity=int(os.environ.get("HOSTED_ANTHROPIC_PAID_MIN_QUANTITY", "20")), + max_quantity=int(os.environ.get("HOSTED_ANTHROPIC_PAID_MAX_QUANTITY", "100")) + ) + quotas.append(paid_quota) + + return HostingProvider( + enabled=True, + credentials=credentials, + quota_unit=quota_unit, + quotas=quotas + ) + + return HostingProvider( + enabled=False, + quota_unit=quota_unit, + ) + + def init_minimax(self) -> HostingProvider: + quota_unit = QuotaUnit.TOKENS + if os.environ.get("HOSTED_MINIMAX_ENABLED") and os.environ.get("HOSTED_MINIMAX_ENABLED").lower() == 'true': + quotas = [FreeHostingQuota()] + + return HostingProvider( + enabled=True, + credentials=None, # use credentials from the provider + quota_unit=quota_unit, + quotas=quotas + ) + + return HostingProvider( + enabled=False, + quota_unit=quota_unit, + ) + + def init_spark(self) -> HostingProvider: + quota_unit = QuotaUnit.TOKENS + if os.environ.get("HOSTED_SPARK_ENABLED") and os.environ.get("HOSTED_SPARK_ENABLED").lower() == 'true': + quotas = [FreeHostingQuota()] + + return HostingProvider( + enabled=True, + credentials=None, # use credentials from the provider + quota_unit=quota_unit, + quotas=quotas + ) + + return HostingProvider( + enabled=False, + quota_unit=quota_unit, + ) + + def init_zhipuai(self) -> HostingProvider: + quota_unit = QuotaUnit.TOKENS + if os.environ.get("HOSTED_ZHIPUAI_ENABLED") and os.environ.get("HOSTED_ZHIPUAI_ENABLED").lower() == 'true': + quotas = [FreeHostingQuota()] + + return HostingProvider( + enabled=True, + credentials=None, # use credentials from the provider + quota_unit=quota_unit, + quotas=quotas + ) + + return HostingProvider( + enabled=False, + quota_unit=quota_unit, + ) + + def init_moderation_config(self) -> HostedModerationConfig: + if os.environ.get("HOSTED_MODERATION_ENABLED") and os.environ.get("HOSTED_MODERATION_ENABLED").lower() == 'true' \ + and os.environ.get("HOSTED_MODERATION_PROVIDERS"): + return HostedModerationConfig( + enabled=True, + providers=os.environ.get("HOSTED_MODERATION_PROVIDERS").split(',') + ) + + return HostedModerationConfig( + enabled=False + ) diff --git a/api/core/index/index.py b/api/core/index/index.py index be5ca315104f35..ce11171d0c544b 100644 --- a/api/core/index/index.py +++ b/api/core/index/index.py @@ -1,18 +1,12 @@ -import json - from flask import current_app from langchain.embeddings import OpenAIEmbeddings from core.embedding.cached_embedding import CacheEmbedding from core.index.keyword_table_index.keyword_table_index import KeywordTableIndex, KeywordTableConfig from core.index.vector_index.vector_index import VectorIndex -from core.model_providers.model_factory import ModelFactory -from core.model_providers.models.embedding.openai_embedding import OpenAIEmbedding -from core.model_providers.models.entity.model_params import ModelKwargs -from core.model_providers.models.llm.openai_model import OpenAIModel -from core.model_providers.providers.openai_provider import OpenAIProvider +from core.model_manager import ModelManager +from core.model_runtime.entities.model_entities import ModelType from models.dataset import Dataset -from models.provider import Provider, ProviderType class IndexBuilder: @@ -22,10 +16,12 @@ def get_index(cls, dataset: Dataset, indexing_technique: str, ignore_high_qualit if not ignore_high_quality_check and dataset.indexing_technique != 'high_quality': return None - embedding_model = ModelFactory.get_embedding_model( + model_manager = ModelManager() + embedding_model = model_manager.get_model_instance( tenant_id=dataset.tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + model_type=ModelType.TEXT_EMBEDDING, + provider=dataset.embedding_model_provider, + model=dataset.embedding_model ) embeddings = CacheEmbedding(embedding_model) diff --git a/api/core/indexing_runner.py b/api/core/indexing_runner.py index 89fba99cab76b9..d7e0843c8460c2 100644 --- a/api/core/indexing_runner.py +++ b/api/core/indexing_runner.py @@ -18,9 +18,11 @@ from core.docstore.dataset_docstore import DatasetDocumentStore from core.generator.llm_generator import LLMGenerator from core.index.index import IndexBuilder -from core.model_providers.error import ProviderTokenNotInitError -from core.model_providers.model_factory import ModelFactory -from core.model_providers.models.entity.message import MessageType +from core.model_manager import ModelManager +from core.errors.error import ProviderTokenNotInitError +from core.model_runtime.entities.model_entities import ModelType, PriceType +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from core.model_runtime.model_providers.__base.text_embedding_model import TextEmbeddingModel from core.spiltter.fixed_text_splitter import FixedRecursiveCharacterTextSplitter from extensions.ext_database import db from extensions.ext_redis import redis_client @@ -36,6 +38,7 @@ class IndexingRunner: def __init__(self): self.storage = storage + self.model_manager = ModelManager() def run(self, dataset_documents: List[DatasetDocument]): """Run the indexing process.""" @@ -210,7 +213,7 @@ def file_indexing_estimate(self, tenant_id: str, file_details: List[UploadFile], """ Estimate the indexing for the document. """ - embedding_model = None + embedding_model_instance = None if dataset_id: dataset = Dataset.query.filter_by( id=dataset_id @@ -218,15 +221,17 @@ def file_indexing_estimate(self, tenant_id: str, file_details: List[UploadFile], if not dataset: raise ValueError('Dataset not found.') if dataset.indexing_technique == 'high_quality' or indexing_technique == 'high_quality': - embedding_model = ModelFactory.get_embedding_model( - tenant_id=dataset.tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + embedding_model_instance = self.model_manager.get_model_instance( + tenant_id=tenant_id, + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) else: if indexing_technique == 'high_quality': - embedding_model = ModelFactory.get_embedding_model( - tenant_id=tenant_id + embedding_model_instance = self.model_manager.get_default_model_instance( + tenant_id=tenant_id, + model_type=ModelType.TEXT_EMBEDDING, ) tokens = 0 preview_texts = [] @@ -255,32 +260,56 @@ def file_indexing_estimate(self, tenant_id: str, file_details: List[UploadFile], for document in documents: if len(preview_texts) < 5: preview_texts.append(document.page_content) - if indexing_technique == 'high_quality' or embedding_model: - tokens += embedding_model.get_num_tokens(self.filter_string(document.page_content)) + if indexing_technique == 'high_quality' or embedding_model_instance: + embedding_model_type_instance = embedding_model_instance.model_type_instance + embedding_model_type_instance = cast(TextEmbeddingModel, embedding_model_type_instance) + tokens += embedding_model_type_instance.get_num_tokens( + model=embedding_model_instance.model, + credentials=embedding_model_instance.credentials, + texts=[self.filter_string(document.page_content)] + ) if doc_form and doc_form == 'qa_model': - text_generation_model = ModelFactory.get_text_generation_model( - tenant_id=tenant_id + model_instance = self.model_manager.get_default_model_instance( + tenant_id=tenant_id, + model_type=ModelType.LLM ) + + model_type_instance = model_instance.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) + if len(preview_texts) > 0: # qa model document response = LLMGenerator.generate_qa_document(current_user.current_tenant_id, preview_texts[0], doc_language) document_qa_list = self.format_split_text(response) + price_info = model_type_instance.get_price( + model=model_instance.model, + credentials=model_instance.credentials, + price_type=PriceType.INPUT, + tokens=total_segments * 2000, + ) return { "total_segments": total_segments * 20, "tokens": total_segments * 2000, - "total_price": '{:f}'.format( - text_generation_model.calc_tokens_price(total_segments * 2000, MessageType.USER)), - "currency": embedding_model.get_currency(), + "total_price": '{:f}'.format(price_info.total_amount), + "currency": price_info.currency, "qa_preview": document_qa_list, "preview": preview_texts } + if embedding_model_instance: + embedding_model_type_instance = cast(TextEmbeddingModel, embedding_model_instance.model_type_instance) + embedding_price_info = embedding_model_type_instance.get_price( + model=embedding_model_instance.model, + credentials=embedding_model_instance.credentials, + price_type=PriceType.INPUT, + tokens=tokens + ) return { "total_segments": total_segments, "tokens": tokens, - "total_price": '{:f}'.format(embedding_model.calc_tokens_price(tokens)) if embedding_model else 0, - "currency": embedding_model.get_currency() if embedding_model else 'USD', + "total_price": '{:f}'.format(embedding_price_info.total_amount) if embedding_model_instance else 0, + "currency": embedding_price_info.currency if embedding_model_instance else 'USD', "preview": preview_texts } @@ -290,7 +319,7 @@ def notion_indexing_estimate(self, tenant_id: str, notion_info_list: list, tmp_p """ Estimate the indexing for the document. """ - embedding_model = None + embedding_model_instance = None if dataset_id: dataset = Dataset.query.filter_by( id=dataset_id @@ -298,15 +327,17 @@ def notion_indexing_estimate(self, tenant_id: str, notion_info_list: list, tmp_p if not dataset: raise ValueError('Dataset not found.') if dataset.indexing_technique == 'high_quality' or indexing_technique == 'high_quality': - embedding_model = ModelFactory.get_embedding_model( - tenant_id=dataset.tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + embedding_model_instance = self.model_manager.get_model_instance( + tenant_id=tenant_id, + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) else: if indexing_technique == 'high_quality': - embedding_model = ModelFactory.get_embedding_model( - tenant_id=tenant_id + embedding_model_instance = self.model_manager.get_default_model_instance( + tenant_id=tenant_id, + model_type=ModelType.TEXT_EMBEDDING ) # load data from notion tokens = 0 @@ -349,35 +380,63 @@ def notion_indexing_estimate(self, tenant_id: str, notion_info_list: list, tmp_p processing_rule=processing_rule ) total_segments += len(documents) + + embedding_model_type_instance = embedding_model_instance.model_type_instance + embedding_model_type_instance = cast(TextEmbeddingModel, embedding_model_type_instance) + for document in documents: if len(preview_texts) < 5: preview_texts.append(document.page_content) - if indexing_technique == 'high_quality' or embedding_model: - tokens += embedding_model.get_num_tokens(document.page_content) + if indexing_technique == 'high_quality' or embedding_model_instance: + tokens += embedding_model_type_instance.get_num_tokens( + model=embedding_model_instance.model, + credentials=embedding_model_instance.credentials, + texts=[document.page_content] + ) if doc_form and doc_form == 'qa_model': - text_generation_model = ModelFactory.get_text_generation_model( - tenant_id=tenant_id + model_instance = self.model_manager.get_default_model_instance( + tenant_id=tenant_id, + model_type=ModelType.LLM ) + + model_type_instance = model_instance.model_type_instance + model_type_instance = cast(LargeLanguageModel, model_type_instance) if len(preview_texts) > 0: # qa model document response = LLMGenerator.generate_qa_document(current_user.current_tenant_id, preview_texts[0], doc_language) document_qa_list = self.format_split_text(response) + + price_info = model_type_instance.get_price( + model=model_instance.model, + credentials=model_instance.credentials, + price_type=PriceType.INPUT, + tokens=total_segments * 2000, + ) + return { "total_segments": total_segments * 20, "tokens": total_segments * 2000, - "total_price": '{:f}'.format( - text_generation_model.calc_tokens_price(total_segments * 2000, MessageType.USER)), - "currency": embedding_model.get_currency(), + "total_price": '{:f}'.format(price_info.total_amount), + "currency": price_info.currency, "qa_preview": document_qa_list, "preview": preview_texts } + + embedding_model_type_instance = embedding_model_instance.model_type_instance + embedding_model_type_instance = cast(TextEmbeddingModel, embedding_model_type_instance) + embedding_price_info = embedding_model_type_instance.get_price( + model=embedding_model_instance.model, + credentials=embedding_model_instance.credentials, + price_type=PriceType.INPUT, + tokens=tokens + ) return { "total_segments": total_segments, "tokens": tokens, - "total_price": '{:f}'.format(embedding_model.calc_tokens_price(tokens)) if embedding_model else 0, - "currency": embedding_model.get_currency() if embedding_model else 'USD', + "total_price": '{:f}'.format(embedding_price_info.total_amount) if embedding_model_instance else 0, + "currency": embedding_price_info.currency if embedding_model_instance else 'USD', "preview": preview_texts } @@ -656,25 +715,36 @@ def _build_index(self, dataset: Dataset, dataset_document: DatasetDocument, docu """ vector_index = IndexBuilder.get_index(dataset, 'high_quality') keyword_table_index = IndexBuilder.get_index(dataset, 'economy') - embedding_model = None + embedding_model_instance = None if dataset.indexing_technique == 'high_quality': - embedding_model = ModelFactory.get_embedding_model( + embedding_model_instance = self.model_manager.get_model_instance( tenant_id=dataset.tenant_id, - model_provider_name=dataset.embedding_model_provider, - model_name=dataset.embedding_model + provider=dataset.embedding_model_provider, + model_type=ModelType.TEXT_EMBEDDING, + model=dataset.embedding_model ) # chunk nodes by chunk size indexing_start_at = time.perf_counter() tokens = 0 chunk_size = 100 + + embedding_model_type_instance = None + if embedding_model_instance: + embedding_model_type_instance = embedding_model_instance.model_type_instance + embedding_model_type_instance = cast(TextEmbeddingModel, embedding_model_type_instance) + for i in range(0, len(documents), chunk_size): # check document is paused self._check_document_paused_status(dataset_document.id) chunk_documents = documents[i:i + chunk_size] - if dataset.indexing_technique == 'high_quality' or embedding_model: + if dataset.indexing_technique == 'high_quality' or embedding_model_type_instance: tokens += sum( - embedding_model.get_num_tokens(document.page_content) + embedding_model_type_instance.get_num_tokens( + embedding_model_instance.model, + embedding_model_instance.credentials, + [document.page_content] + ) for document in chunk_documents ) diff --git a/api/core/memory/read_only_conversation_token_db_buffer_shared_memory.py b/api/core/memory/read_only_conversation_token_db_buffer_shared_memory.py deleted file mode 100644 index 9840c5c22da5c3..00000000000000 --- a/api/core/memory/read_only_conversation_token_db_buffer_shared_memory.py +++ /dev/null @@ -1,95 +0,0 @@ -from typing import Any, List, Dict - -from langchain.memory.chat_memory import BaseChatMemory -from langchain.schema import get_buffer_string, BaseMessage - -from core.file.message_file_parser import MessageFileParser -from core.model_providers.models.entity.message import PromptMessage, MessageType, to_lc_messages -from core.model_providers.models.llm.base import BaseLLM -from extensions.ext_database import db -from models.model import Conversation, Message - - -class ReadOnlyConversationTokenDBBufferSharedMemory(BaseChatMemory): - conversation: Conversation - human_prefix: str = "Human" - ai_prefix: str = "Assistant" - model_instance: BaseLLM - memory_key: str = "chat_history" - max_token_limit: int = 2000 - message_limit: int = 10 - - @property - def buffer(self) -> List[BaseMessage]: - """String buffer of memory.""" - app_model = self.conversation.app - - # fetch limited messages desc, and return reversed - messages = db.session.query(Message).filter( - Message.conversation_id == self.conversation.id, - Message.answer != '' - ).order_by(Message.created_at.desc()).limit(self.message_limit).all() - - messages = list(reversed(messages)) - message_file_parser = MessageFileParser(tenant_id=app_model.tenant_id, app_id=self.conversation.app_id) - - chat_messages: List[PromptMessage] = [] - for message in messages: - files = message.message_files - if files: - file_objs = message_file_parser.transform_message_files( - files, message.app_model_config - ) - - prompt_message_files = [file_obj.prompt_message_file for file_obj in file_objs] - chat_messages.append(PromptMessage( - content=message.query, - type=MessageType.USER, - files=prompt_message_files - )) - else: - chat_messages.append(PromptMessage(content=message.query, type=MessageType.USER)) - - chat_messages.append(PromptMessage(content=message.answer, type=MessageType.ASSISTANT)) - - if not chat_messages: - return [] - - # prune the chat message if it exceeds the max token limit - curr_buffer_length = self.model_instance.get_num_tokens(chat_messages) - if curr_buffer_length > self.max_token_limit: - pruned_memory = [] - while curr_buffer_length > self.max_token_limit and chat_messages: - pruned_memory.append(chat_messages.pop(0)) - curr_buffer_length = self.model_instance.get_num_tokens(chat_messages) - - return to_lc_messages(chat_messages) - - @property - def memory_variables(self) -> List[str]: - """Will always return list of memory variables. - - :meta private: - """ - return [self.memory_key] - - def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, Any]: - """Return history buffer.""" - buffer: Any = self.buffer - if self.return_messages: - final_buffer: Any = buffer - else: - final_buffer = get_buffer_string( - buffer, - human_prefix=self.human_prefix, - ai_prefix=self.ai_prefix, - ) - return {self.memory_key: final_buffer} - - def save_context(self, inputs: Dict[str, Any], outputs: Dict[str, str]) -> None: - """Nothing should be saved or changed""" - pass - - def clear(self) -> None: - """Nothing to clear, got a memory like a vault.""" - pass diff --git a/api/core/memory/read_only_conversation_token_db_string_buffer_shared_memory.py b/api/core/memory/read_only_conversation_token_db_string_buffer_shared_memory.py deleted file mode 100644 index 0edd2445e298d7..00000000000000 --- a/api/core/memory/read_only_conversation_token_db_string_buffer_shared_memory.py +++ /dev/null @@ -1,36 +0,0 @@ -from typing import Any, List, Dict - -from langchain.memory.chat_memory import BaseChatMemory -from langchain.schema import get_buffer_string - -from core.memory.read_only_conversation_token_db_buffer_shared_memory import \ - ReadOnlyConversationTokenDBBufferSharedMemory - - -class ReadOnlyConversationTokenDBStringBufferSharedMemory(BaseChatMemory): - memory: ReadOnlyConversationTokenDBBufferSharedMemory - - @property - def memory_variables(self) -> List[str]: - """Return memory variables.""" - return self.memory.memory_variables - - def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, str]: - """Load memory variables from memory.""" - buffer: Any = self.memory.buffer - - final_buffer = get_buffer_string( - buffer, - human_prefix=self.memory.human_prefix, - ai_prefix=self.memory.ai_prefix, - ) - - return {self.memory.memory_key: final_buffer} - - def save_context(self, inputs: Dict[str, Any], outputs: Dict[str, str]) -> None: - """Nothing should be saved or changed""" - pass - - def clear(self) -> None: - """Nothing to clear, got a memory like a vault.""" - pass \ No newline at end of file diff --git a/api/core/memory/token_buffer_memory.py b/api/core/memory/token_buffer_memory.py new file mode 100644 index 00000000000000..285cb3eeb1114d --- /dev/null +++ b/api/core/memory/token_buffer_memory.py @@ -0,0 +1,109 @@ +from core.file.message_file_parser import MessageFileParser +from core.model_manager import ModelInstance +from core.model_runtime.entities.message_entities import PromptMessage, TextPromptMessageContent, UserPromptMessage, \ + AssistantPromptMessage, PromptMessageRole +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.model_providers import model_provider_factory +from extensions.ext_database import db +from models.model import Conversation, Message + + +class TokenBufferMemory: + def __init__(self, conversation: Conversation, model_instance: ModelInstance) -> None: + self.conversation = conversation + self.model_instance = model_instance + + def get_history_prompt_messages(self, max_token_limit: int = 2000, + message_limit: int = 10) -> list[PromptMessage]: + """ + Get history prompt messages. + :param max_token_limit: max token limit + :param message_limit: message limit + """ + app_record = self.conversation.app + + # fetch limited messages, and return reversed + messages = db.session.query(Message).filter( + Message.conversation_id == self.conversation.id, + Message.answer != '' + ).order_by(Message.created_at.desc()).limit(message_limit).all() + + messages = list(reversed(messages)) + message_file_parser = MessageFileParser( + tenant_id=app_record.tenant_id, + app_id=app_record.id + ) + + prompt_messages = [] + for message in messages: + files = message.message_files + if files: + file_objs = message_file_parser.transform_message_files( + files, message.app_model_config + ) + + prompt_message_contents = [TextPromptMessageContent(data=message.query)] + for file_obj in file_objs: + prompt_message_contents.append(file_obj.prompt_message_content) + + prompt_messages.append(UserPromptMessage(content=prompt_message_contents)) + else: + prompt_messages.append(UserPromptMessage(content=message.query)) + + prompt_messages.append(AssistantPromptMessage(content=message.answer)) + + if not prompt_messages: + return [] + + # prune the chat message if it exceeds the max token limit + provider_instance = model_provider_factory.get_provider_instance(self.model_instance.provider) + model_type_instance = provider_instance.get_model_instance(ModelType.LLM) + + curr_message_tokens = model_type_instance.get_num_tokens( + self.model_instance.model, + self.model_instance.credentials, + prompt_messages + ) + + if curr_message_tokens > max_token_limit: + pruned_memory = [] + while curr_message_tokens > max_token_limit and prompt_messages: + pruned_memory.append(prompt_messages.pop(0)) + curr_message_tokens = model_type_instance.get_num_tokens( + self.model_instance.model, + self.model_instance.credentials, + prompt_messages + ) + + return prompt_messages + + def get_history_prompt_text(self, human_prefix: str = "Human", + ai_prefix: str = "Assistant", + max_token_limit: int = 2000, + message_limit: int = 10) -> str: + """ + Get history prompt text. + :param human_prefix: human prefix + :param ai_prefix: ai prefix + :param max_token_limit: max token limit + :param message_limit: message limit + :return: + """ + prompt_messages = self.get_history_prompt_messages( + max_token_limit=max_token_limit, + message_limit=message_limit + ) + + string_messages = [] + for m in prompt_messages: + if m.role == PromptMessageRole.USER: + role = human_prefix + elif m.role == PromptMessageRole.ASSISTANT: + role = ai_prefix + else: + continue + + message = f"{role}: {m.content}" + string_messages.append(message) + + return "\n".join(string_messages) \ No newline at end of file diff --git a/api/core/model_manager.py b/api/core/model_manager.py new file mode 100644 index 00000000000000..ffbec8578e535a --- /dev/null +++ b/api/core/model_manager.py @@ -0,0 +1,209 @@ +from typing import Optional, Union, Generator, cast, List, IO + +from core.entities.provider_configuration import ProviderModelBundle +from core.errors.error import ProviderTokenNotInitError +from core.model_runtime.callbacks.base_callback import Callback +from core.model_runtime.entities.llm_entities import LLMResult +from core.model_runtime.entities.message_entities import PromptMessageTool, PromptMessage +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.entities.rerank_entities import RerankResult +from core.model_runtime.entities.text_embedding_entities import TextEmbeddingResult +from core.model_runtime.model_providers.__base.large_language_model import LargeLanguageModel +from core.model_runtime.model_providers.__base.moderation_model import ModerationModel +from core.model_runtime.model_providers.__base.rerank_model import RerankModel +from core.model_runtime.model_providers.__base.speech2text_model import Speech2TextModel +from core.model_runtime.model_providers.__base.text_embedding_model import TextEmbeddingModel +from core.provider_manager import ProviderManager + + +class ModelInstance: + """ + Model instance class + """ + + def __init__(self, provider_model_bundle: ProviderModelBundle, model: str) -> None: + self._provider_model_bundle = provider_model_bundle + self.model = model + self.provider = provider_model_bundle.configuration.provider.provider + self.credentials = self._fetch_credentials_from_bundle(provider_model_bundle, model) + self.model_type_instance = self._provider_model_bundle.model_type_instance + + def _fetch_credentials_from_bundle(self, provider_model_bundle: ProviderModelBundle, model: str) -> dict: + """ + Fetch credentials from provider model bundle + :param provider_model_bundle: provider model bundle + :param model: model name + :return: + """ + credentials = provider_model_bundle.configuration.get_current_credentials( + model_type=provider_model_bundle.model_type_instance.model_type, + model=model + ) + + if credentials is None: + raise ProviderTokenNotInitError(f"Model {model} credentials is not initialized.") + + return credentials + + def invoke_llm(self, prompt_messages: list[PromptMessage], model_parameters: Optional[dict] = None, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None, callbacks: list[Callback] = None) \ + -> Union[LLMResult, Generator]: + """ + Invoke large language model + + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :param callbacks: callbacks + :return: full response or stream response chunk generator result + """ + if not isinstance(self.model_type_instance, LargeLanguageModel): + raise Exception(f"Model type instance is not LargeLanguageModel") + + self.model_type_instance = cast(LargeLanguageModel, self.model_type_instance) + return self.model_type_instance.invoke( + model=self.model, + credentials=self.credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user, + callbacks=callbacks + ) + + def invoke_text_embedding(self, texts: list[str], user: Optional[str] = None) \ + -> TextEmbeddingResult: + """ + Invoke large language model + + :param texts: texts to embed + :param user: unique user id + :return: embeddings result + """ + if not isinstance(self.model_type_instance, TextEmbeddingModel): + raise Exception(f"Model type instance is not TextEmbeddingModel") + + self.model_type_instance = cast(TextEmbeddingModel, self.model_type_instance) + return self.model_type_instance.invoke( + model=self.model, + credentials=self.credentials, + texts=texts, + user=user + ) + + def invoke_rerank(self, query: str, docs: list[str], score_threshold: Optional[float] = None, top_n: Optional[int] = None, + user: Optional[str] = None) \ + -> RerankResult: + """ + Invoke rerank model + + :param query: search query + :param docs: docs for reranking + :param score_threshold: score threshold + :param top_n: top n + :param user: unique user id + :return: rerank result + """ + if not isinstance(self.model_type_instance, RerankModel): + raise Exception(f"Model type instance is not RerankModel") + + self.model_type_instance = cast(RerankModel, self.model_type_instance) + return self.model_type_instance.invoke( + model=self.model, + credentials=self.credentials, + query=query, + docs=docs, + score_threshold=score_threshold, + top_n=top_n, + user=user + ) + + def invoke_moderation(self, text: str, user: Optional[str] = None) \ + -> bool: + """ + Invoke moderation model + + :param text: text to moderate + :param user: unique user id + :return: false if text is safe, true otherwise + """ + if not isinstance(self.model_type_instance, ModerationModel): + raise Exception(f"Model type instance is not ModerationModel") + + self.model_type_instance = cast(ModerationModel, self.model_type_instance) + return self.model_type_instance.invoke( + model=self.model, + credentials=self.credentials, + text=text, + user=user + ) + + def invoke_speech2text(self, file: IO[bytes], user: Optional[str] = None) \ + -> str: + """ + Invoke large language model + + :param file: audio file + :param user: unique user id + :return: text for given audio file + """ + if not isinstance(self.model_type_instance, Speech2TextModel): + raise Exception(f"Model type instance is not Speech2TextModel") + + self.model_type_instance = cast(Speech2TextModel, self.model_type_instance) + return self.model_type_instance.invoke( + model=self.model, + credentials=self.credentials, + file=file, + user=user + ) + + +class ModelManager: + def __init__(self) -> None: + self._provider_manager = ProviderManager() + + def get_model_instance(self, tenant_id: str, provider: str, model_type: ModelType, model: str) -> ModelInstance: + """ + Get model instance + :param tenant_id: tenant id + :param provider: provider name + :param model_type: model type + :param model: model name + :return: + """ + provider_model_bundle = self._provider_manager.get_provider_model_bundle( + tenant_id=tenant_id, + provider=provider, + model_type=model_type + ) + + return ModelInstance(provider_model_bundle, model) + + def get_default_model_instance(self, tenant_id: str, model_type: ModelType) -> ModelInstance: + """ + Get default model instance + :param tenant_id: tenant id + :param model_type: model type + :return: + """ + default_model_entity = self._provider_manager.get_default_model( + tenant_id=tenant_id, + model_type=model_type + ) + + if not default_model_entity: + raise ProviderTokenNotInitError(f"Default model not found for {model_type}") + + return self.get_model_instance( + tenant_id=tenant_id, + provider=default_model_entity.provider.provider, + model_type=model_type, + model=default_model_entity.model + ) diff --git a/api/core/model_providers/model_factory.py b/api/core/model_providers/model_factory.py deleted file mode 100644 index f663707b075553..00000000000000 --- a/api/core/model_providers/model_factory.py +++ /dev/null @@ -1,335 +0,0 @@ -from typing import Optional - -from langchain.callbacks.base import Callbacks - -from core.model_providers.error import ProviderTokenNotInitError, LLMBadRequestError -from core.model_providers.model_provider_factory import ModelProviderFactory, DEFAULT_MODELS -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.embedding.base import BaseEmbedding -from core.model_providers.models.entity.model_params import ModelKwargs, ModelType -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.moderation.base import BaseModeration -from core.model_providers.models.reranking.base import BaseReranking -from core.model_providers.models.speech2text.base import BaseSpeech2Text -from extensions.ext_database import db -from models.provider import TenantDefaultModel - - -class ModelFactory: - - @classmethod - def get_text_generation_model_from_model_config(cls, tenant_id: str, - model_config: dict, - streaming: bool = False, - callbacks: Callbacks = None) -> Optional[BaseLLM]: - provider_name = model_config.get("provider") - model_name = model_config.get("name") - completion_params = model_config.get("completion_params", {}) - - return cls.get_text_generation_model( - tenant_id=tenant_id, - model_provider_name=provider_name, - model_name=model_name, - model_kwargs=ModelKwargs( - temperature=completion_params.get('temperature', 0), - max_tokens=completion_params.get('max_tokens', 256), - top_p=completion_params.get('top_p', 0), - frequency_penalty=completion_params.get('frequency_penalty', 0.1), - presence_penalty=completion_params.get('presence_penalty', 0.1) - ), - streaming=streaming, - callbacks=callbacks - ) - - @classmethod - def get_text_generation_model(cls, - tenant_id: str, - model_provider_name: Optional[str] = None, - model_name: Optional[str] = None, - model_kwargs: Optional[ModelKwargs] = None, - streaming: bool = False, - callbacks: Callbacks = None, - deduct_quota: bool = True) -> Optional[BaseLLM]: - """ - get text generation model. - - :param tenant_id: a string representing the ID of the tenant. - :param model_provider_name: - :param model_name: - :param model_kwargs: - :param streaming: - :param callbacks: - :param deduct_quota: - :return: - """ - is_default_model = False - if model_provider_name is None and model_name is None: - default_model = cls.get_default_model(tenant_id, ModelType.TEXT_GENERATION) - - if not default_model: - raise LLMBadRequestError(f"Default model is not available. " - f"Please configure a Default System Reasoning Model " - f"in the Settings -> Model Provider.") - - model_provider_name = default_model.provider_name - model_name = default_model.model_name - is_default_model = True - - # get model provider - model_provider = ModelProviderFactory.get_preferred_model_provider(tenant_id, model_provider_name) - - if not model_provider: - raise ProviderTokenNotInitError(f"Model {model_name} provider credentials is not initialized.") - - # init text generation model - model_class = model_provider.get_model_class(model_type=ModelType.TEXT_GENERATION) - - try: - model_instance = model_class( - model_provider=model_provider, - name=model_name, - model_kwargs=model_kwargs, - streaming=streaming, - callbacks=callbacks - ) - except LLMBadRequestError as e: - if is_default_model: - raise LLMBadRequestError(f"Default model {model_name} is not available. " - f"Please check your model provider credentials.") - else: - raise e - - if is_default_model or not deduct_quota: - model_instance.deduct_quota = False - - return model_instance - - @classmethod - def get_embedding_model(cls, - tenant_id: str, - model_provider_name: Optional[str] = None, - model_name: Optional[str] = None) -> Optional[BaseEmbedding]: - """ - get embedding model. - - :param tenant_id: a string representing the ID of the tenant. - :param model_provider_name: - :param model_name: - :return: - """ - if model_provider_name is None and model_name is None: - default_model = cls.get_default_model(tenant_id, ModelType.EMBEDDINGS) - - if not default_model: - raise LLMBadRequestError(f"Default model is not available. " - f"Please configure a Default Embedding Model " - f"in the Settings -> Model Provider.") - - model_provider_name = default_model.provider_name - model_name = default_model.model_name - - # get model provider - model_provider = ModelProviderFactory.get_preferred_model_provider(tenant_id, model_provider_name) - - if not model_provider: - raise ProviderTokenNotInitError(f"Model {model_name} provider credentials is not initialized.") - - # init embedding model - model_class = model_provider.get_model_class(model_type=ModelType.EMBEDDINGS) - return model_class( - model_provider=model_provider, - name=model_name - ) - - - @classmethod - def get_reranking_model(cls, - tenant_id: str, - model_provider_name: Optional[str] = None, - model_name: Optional[str] = None) -> Optional[BaseReranking]: - """ - get reranking model. - - :param tenant_id: a string representing the ID of the tenant. - :param model_provider_name: - :param model_name: - :return: - """ - if (model_provider_name is None or len(model_provider_name) == 0) and (model_name is None or len(model_name) == 0): - default_model = cls.get_default_model(tenant_id, ModelType.RERANKING) - - if not default_model: - raise LLMBadRequestError(f"Default model is not available. " - f"Please configure a Default Reranking Model " - f"in the Settings -> Model Provider.") - - model_provider_name = default_model.provider_name - model_name = default_model.model_name - - # get model provider - model_provider = ModelProviderFactory.get_preferred_model_provider(tenant_id, model_provider_name) - - if not model_provider: - raise ProviderTokenNotInitError(f"Model {model_name} provider credentials is not initialized.") - - # init reranking model - model_class = model_provider.get_model_class(model_type=ModelType.RERANKING) - return model_class( - model_provider=model_provider, - name=model_name - ) - - @classmethod - def get_speech2text_model(cls, - tenant_id: str, - model_provider_name: Optional[str] = None, - model_name: Optional[str] = None) -> Optional[BaseSpeech2Text]: - """ - get speech to text model. - - :param tenant_id: a string representing the ID of the tenant. - :param model_provider_name: - :param model_name: - :return: - """ - if model_provider_name is None and model_name is None: - default_model = cls.get_default_model(tenant_id, ModelType.SPEECH_TO_TEXT) - - if not default_model: - raise LLMBadRequestError(f"Default model is not available. " - f"Please configure a Default Speech-to-Text Model " - f"in the Settings -> Model Provider.") - - model_provider_name = default_model.provider_name - model_name = default_model.model_name - - # get model provider - model_provider = ModelProviderFactory.get_preferred_model_provider(tenant_id, model_provider_name) - - if not model_provider: - raise ProviderTokenNotInitError(f"Model {model_name} provider credentials is not initialized.") - - # init speech to text model - model_class = model_provider.get_model_class(model_type=ModelType.SPEECH_TO_TEXT) - return model_class( - model_provider=model_provider, - name=model_name - ) - - @classmethod - def get_moderation_model(cls, - tenant_id: str, - model_provider_name: str, - model_name: str) -> Optional[BaseModeration]: - """ - get moderation model. - - :param tenant_id: a string representing the ID of the tenant. - :param model_provider_name: - :param model_name: - :return: - """ - # get model provider - model_provider = ModelProviderFactory.get_preferred_model_provider(tenant_id, model_provider_name) - - if not model_provider: - raise ProviderTokenNotInitError(f"Model {model_name} provider credentials is not initialized.") - - # init moderation model - model_class = model_provider.get_model_class(model_type=ModelType.MODERATION) - return model_class( - model_provider=model_provider, - name=model_name - ) - - @classmethod - def get_default_model(cls, tenant_id: str, model_type: ModelType) -> TenantDefaultModel: - """ - get default model of model type. - - :param tenant_id: - :param model_type: - :return: - """ - # get default model - default_model = db.session.query(TenantDefaultModel) \ - .filter( - TenantDefaultModel.tenant_id == tenant_id, - TenantDefaultModel.model_type == model_type.value - ).first() - - if not default_model: - model_provider_rules = ModelProviderFactory.get_provider_rules() - for model_provider_name, model_provider_rule in model_provider_rules.items(): - model_provider = ModelProviderFactory.get_preferred_model_provider(tenant_id, model_provider_name) - if not model_provider: - continue - - model_list = model_provider.get_supported_model_list(model_type) - if model_list: - model_info = model_list[0] - default_model = TenantDefaultModel( - tenant_id=tenant_id, - model_type=model_type.value, - provider_name=model_provider_name, - model_name=model_info['id'] - ) - db.session.add(default_model) - db.session.commit() - break - - return default_model - - @classmethod - def update_default_model(cls, - tenant_id: str, - model_type: ModelType, - provider_name: str, - model_name: str) -> TenantDefaultModel: - """ - update default model of model type. - - :param tenant_id: - :param model_type: - :param provider_name: - :param model_name: - :return: - """ - model_provider_name = ModelProviderFactory.get_provider_names() - if provider_name not in model_provider_name: - raise ValueError(f'Invalid provider name: {provider_name}') - - model_provider = ModelProviderFactory.get_preferred_model_provider(tenant_id, provider_name) - - if not model_provider: - raise ProviderTokenNotInitError(f"Model {model_name} provider credentials is not initialized.") - - model_list = model_provider.get_supported_model_list(model_type) - model_ids = [model['id'] for model in model_list] - if model_name not in model_ids: - raise ValueError(f'Invalid model name: {model_name}') - - # get default model - default_model = db.session.query(TenantDefaultModel) \ - .filter( - TenantDefaultModel.tenant_id == tenant_id, - TenantDefaultModel.model_type == model_type.value - ).first() - - if default_model: - # update default model - default_model.provider_name = provider_name - default_model.model_name = model_name - db.session.commit() - else: - # create default model - default_model = TenantDefaultModel( - tenant_id=tenant_id, - model_type=model_type.value, - provider_name=provider_name, - model_name=model_name, - ) - db.session.add(default_model) - db.session.commit() - - return default_model diff --git a/api/core/model_providers/model_provider_factory.py b/api/core/model_providers/model_provider_factory.py deleted file mode 100644 index de6b8287f8dece..00000000000000 --- a/api/core/model_providers/model_provider_factory.py +++ /dev/null @@ -1,276 +0,0 @@ -from typing import Type - -from sqlalchemy.exc import IntegrityError - -from core.model_providers.models.entity.model_params import ModelType -from core.model_providers.providers.base import BaseModelProvider -from core.model_providers.rules import provider_rules -from extensions.ext_database import db -from models.provider import TenantPreferredModelProvider, ProviderType, Provider, ProviderQuotaType - -DEFAULT_MODELS = { - ModelType.TEXT_GENERATION.value: { - 'provider_name': 'openai', - 'model_name': 'gpt-3.5-turbo', - }, - ModelType.EMBEDDINGS.value: { - 'provider_name': 'openai', - 'model_name': 'text-embedding-ada-002', - }, - ModelType.SPEECH_TO_TEXT.value: { - 'provider_name': 'openai', - 'model_name': 'whisper-1', - } -} - - -class ModelProviderFactory: - @classmethod - def get_model_provider_class(cls, provider_name: str) -> Type[BaseModelProvider]: - if provider_name == 'openai': - from core.model_providers.providers.openai_provider import OpenAIProvider - return OpenAIProvider - elif provider_name == 'anthropic': - from core.model_providers.providers.anthropic_provider import AnthropicProvider - return AnthropicProvider - elif provider_name == 'minimax': - from core.model_providers.providers.minimax_provider import MinimaxProvider - return MinimaxProvider - elif provider_name == 'spark': - from core.model_providers.providers.spark_provider import SparkProvider - return SparkProvider - elif provider_name == 'tongyi': - from core.model_providers.providers.tongyi_provider import TongyiProvider - return TongyiProvider - elif provider_name == 'wenxin': - from core.model_providers.providers.wenxin_provider import WenxinProvider - return WenxinProvider - elif provider_name == 'zhipuai': - from core.model_providers.providers.zhipuai_provider import ZhipuAIProvider - return ZhipuAIProvider - elif provider_name == 'chatglm': - from core.model_providers.providers.chatglm_provider import ChatGLMProvider - return ChatGLMProvider - elif provider_name == 'baichuan': - from core.model_providers.providers.baichuan_provider import BaichuanProvider - return BaichuanProvider - elif provider_name == 'azure_openai': - from core.model_providers.providers.azure_openai_provider import AzureOpenAIProvider - return AzureOpenAIProvider - elif provider_name == 'replicate': - from core.model_providers.providers.replicate_provider import ReplicateProvider - return ReplicateProvider - elif provider_name == 'huggingface_hub': - from core.model_providers.providers.huggingface_hub_provider import HuggingfaceHubProvider - return HuggingfaceHubProvider - elif provider_name == 'xinference': - from core.model_providers.providers.xinference_provider import XinferenceProvider - return XinferenceProvider - elif provider_name == 'openllm': - from core.model_providers.providers.openllm_provider import OpenLLMProvider - return OpenLLMProvider - elif provider_name == 'localai': - from core.model_providers.providers.localai_provider import LocalAIProvider - return LocalAIProvider - elif provider_name == 'cohere': - from core.model_providers.providers.cohere_provider import CohereProvider - return CohereProvider - elif provider_name == 'jina': - from core.model_providers.providers.jina_provider import JinaProvider - return JinaProvider - else: - raise NotImplementedError - - @classmethod - def get_provider_names(cls): - """ - Returns a list of provider names. - """ - return list(provider_rules.keys()) - - @classmethod - def get_provider_rules(cls): - """ - Returns a list of provider rules. - - :return: - """ - return provider_rules - - @classmethod - def get_provider_rule(cls, provider_name: str): - """ - Returns provider rule. - """ - return provider_rules[provider_name] - - @classmethod - def get_preferred_model_provider(cls, tenant_id: str, model_provider_name: str): - """ - get preferred model provider. - - :param tenant_id: a string representing the ID of the tenant. - :param model_provider_name: - :return: - """ - # get preferred provider - preferred_provider = cls._get_preferred_provider(tenant_id, model_provider_name) - if not preferred_provider or not preferred_provider.is_valid: - return None - - # init model provider - model_provider_class = ModelProviderFactory.get_model_provider_class(model_provider_name) - return model_provider_class(provider=preferred_provider) - - @classmethod - def get_preferred_type_by_preferred_model_provider(cls, - tenant_id: str, - model_provider_name: str, - preferred_model_provider: TenantPreferredModelProvider): - """ - get preferred provider type by preferred model provider. - - :param model_provider_name: - :param preferred_model_provider: - :return: - """ - if not preferred_model_provider: - model_provider_rules = ModelProviderFactory.get_provider_rule(model_provider_name) - support_provider_types = model_provider_rules['support_provider_types'] - - if ProviderType.CUSTOM.value in support_provider_types: - custom_provider = db.session.query(Provider) \ - .filter( - Provider.tenant_id == tenant_id, - Provider.provider_name == model_provider_name, - Provider.provider_type == ProviderType.CUSTOM.value, - Provider.is_valid == True - ).first() - - if custom_provider: - return ProviderType.CUSTOM.value - - model_provider = cls.get_model_provider_class(model_provider_name) - - if ProviderType.SYSTEM.value in support_provider_types \ - and model_provider.is_provider_type_system_supported(): - return ProviderType.SYSTEM.value - elif ProviderType.CUSTOM.value in support_provider_types: - return ProviderType.CUSTOM.value - else: - return preferred_model_provider.preferred_provider_type - - @classmethod - def _get_preferred_provider(cls, tenant_id: str, model_provider_name: str): - """ - get preferred provider of tenant. - - :param tenant_id: - :param model_provider_name: - :return: - """ - # get preferred provider type - preferred_provider_type = cls._get_preferred_provider_type(tenant_id, model_provider_name) - - # get providers by preferred provider type - providers = db.session.query(Provider) \ - .filter( - Provider.tenant_id == tenant_id, - Provider.provider_name == model_provider_name, - Provider.provider_type == preferred_provider_type - ).all() - - no_system_provider = False - if preferred_provider_type == ProviderType.SYSTEM.value: - quota_type_to_provider_dict = {} - for provider in providers: - quota_type_to_provider_dict[provider.quota_type] = provider - - model_provider_rules = ModelProviderFactory.get_provider_rule(model_provider_name) - for quota_type_enum in ProviderQuotaType: - quota_type = quota_type_enum.value - if quota_type in model_provider_rules['system_config']['supported_quota_types']: - if quota_type in quota_type_to_provider_dict.keys(): - provider = quota_type_to_provider_dict[quota_type] - if provider.is_valid and provider.quota_limit > provider.quota_used: - return provider - elif quota_type == ProviderQuotaType.TRIAL.value: - try: - provider = Provider( - tenant_id=tenant_id, - provider_name=model_provider_name, - provider_type=ProviderType.SYSTEM.value, - is_valid=True, - quota_type=ProviderQuotaType.TRIAL.value, - quota_limit=model_provider_rules['system_config']['quota_limit'], - quota_used=0 - ) - db.session.add(provider) - db.session.commit() - except IntegrityError: - db.session.rollback() - provider = db.session.query(Provider) \ - .filter( - Provider.tenant_id == tenant_id, - Provider.provider_name == model_provider_name, - Provider.provider_type == ProviderType.SYSTEM.value, - Provider.quota_type == ProviderQuotaType.TRIAL.value - ).first() - - if provider.quota_limit == 0: - return None - - return provider - - no_system_provider = True - - if no_system_provider: - providers = db.session.query(Provider) \ - .filter( - Provider.tenant_id == tenant_id, - Provider.provider_name == model_provider_name, - Provider.provider_type == ProviderType.CUSTOM.value - ).all() - - if preferred_provider_type == ProviderType.CUSTOM.value or no_system_provider: - if providers: - return providers[0] - else: - try: - provider = Provider( - tenant_id=tenant_id, - provider_name=model_provider_name, - provider_type=ProviderType.CUSTOM.value, - is_valid=False - ) - db.session.add(provider) - db.session.commit() - except IntegrityError: - db.session.rollback() - provider = db.session.query(Provider) \ - .filter( - Provider.tenant_id == tenant_id, - Provider.provider_name == model_provider_name, - Provider.provider_type == ProviderType.CUSTOM.value - ).first() - - return provider - - return None - - @classmethod - def _get_preferred_provider_type(cls, tenant_id: str, model_provider_name: str): - """ - get preferred provider type of tenant. - - :param tenant_id: - :param model_provider_name: - :return: - """ - preferred_model_provider = db.session.query(TenantPreferredModelProvider) \ - .filter( - TenantPreferredModelProvider.tenant_id == tenant_id, - TenantPreferredModelProvider.provider_name == model_provider_name - ).first() - - return cls.get_preferred_type_by_preferred_model_provider(tenant_id, model_provider_name, preferred_model_provider) diff --git a/api/core/model_providers/models/base.py b/api/core/model_providers/models/base.py deleted file mode 100644 index 01f83efa848ba1..00000000000000 --- a/api/core/model_providers/models/base.py +++ /dev/null @@ -1,22 +0,0 @@ -from abc import ABC -from typing import Any - -from core.model_providers.providers.base import BaseModelProvider - - -class BaseProviderModel(ABC): - _client: Any - _model_provider: BaseModelProvider - - def __init__(self, model_provider: BaseModelProvider, client: Any): - self._model_provider = model_provider - self._client = client - - @property - def client(self): - return self._client - - @property - def model_provider(self): - return self._model_provider - diff --git a/api/core/model_providers/models/embedding/azure_openai_embedding.py b/api/core/model_providers/models/embedding/azure_openai_embedding.py deleted file mode 100644 index 506b32c55713bb..00000000000000 --- a/api/core/model_providers/models/embedding/azure_openai_embedding.py +++ /dev/null @@ -1,78 +0,0 @@ -import decimal -import logging - -import openai -import tiktoken -from langchain.embeddings import OpenAIEmbeddings - -from core.model_providers.error import LLMBadRequestError, LLMAuthorizationError, LLMRateLimitError, \ - LLMAPIUnavailableError, LLMAPIConnectionError -from core.model_providers.models.embedding.base import BaseEmbedding -from core.model_providers.providers.base import BaseModelProvider - -AZURE_OPENAI_API_VERSION = '2023-07-01-preview' - - -class AzureOpenAIEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - self.credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = OpenAIEmbeddings( - deployment=name, - openai_api_type='azure', - openai_api_version=AZURE_OPENAI_API_VERSION, - chunk_size=16, - max_retries=1, - openai_api_key=self.credentials.get('openai_api_key'), - openai_api_base=self.credentials.get('openai_api_base') - ) - - super().__init__(model_provider, client, name) - - @property - def base_model_name(self) -> str: - """ - get base model name (not deployment) - - :return: str - """ - return self.credentials.get("base_model_name") - - def get_num_tokens(self, text: str) -> int: - """ - get num tokens of text. - - :param text: - :return: - """ - if len(text) == 0: - return 0 - - enc = tiktoken.encoding_for_model(self.credentials.get('base_model_name')) - - tokenized_text = enc.encode(text) - - # calculate the number of tokens in the encoded text - return len(tokenized_text) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to Azure OpenAI API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to Azure OpenAI API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("Azure OpenAI service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError('Azure ' + str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError('Azure ' + str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError('Azure ' + ex.__class__.__name__ + ":" + str(ex)) - else: - return ex diff --git a/api/core/model_providers/models/embedding/base.py b/api/core/model_providers/models/embedding/base.py deleted file mode 100644 index 25f30894b0390f..00000000000000 --- a/api/core/model_providers/models/embedding/base.py +++ /dev/null @@ -1,102 +0,0 @@ -from abc import abstractmethod -from typing import Any -import decimal - -import tiktoken -from langchain.schema.language_model import _get_token_ids_default_method - -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelType -from core.model_providers.providers.base import BaseModelProvider -import logging -logger = logging.getLogger(__name__) - -class BaseEmbedding(BaseProviderModel): - name: str - type: ModelType = ModelType.EMBEDDINGS - - def __init__(self, model_provider: BaseModelProvider, client: Any, name: str): - super().__init__(model_provider, client) - self.name = name - - @property - def base_model_name(self) -> str: - """ - get base model name - - :return: str - """ - return self.name - - @property - def price_config(self) -> dict: - def get_or_default(): - default_price_config = { - 'completion': decimal.Decimal('0'), - 'unit': decimal.Decimal('0'), - 'currency': 'USD' - } - rules = self.model_provider.get_rules() - price_config = rules['price_config'][self.base_model_name] if 'price_config' in rules else default_price_config - price_config = { - 'completion': decimal.Decimal(price_config['completion']), - 'unit': decimal.Decimal(price_config['unit']), - 'currency': price_config['currency'] - } - return price_config - - self._price_config = self._price_config if hasattr(self, '_price_config') else get_or_default() - - logger.debug(f"model: {self.name} price_config: {self._price_config}") - return self._price_config - - def calc_tokens_price(self, tokens: int) -> decimal.Decimal: - """ - calc tokens total price. - - :param tokens: - :return: decimal.Decimal('0.0000001') - """ - unit_price = self.price_config['completion'] - unit = self.price_config['unit'] - total_price = tokens * unit_price * unit - total_price = total_price.quantize(decimal.Decimal('0.0000001'), rounding=decimal.ROUND_HALF_UP) - logging.debug(f"tokens={tokens}, unit_price={unit_price}, unit={unit}, total_price:{total_price}") - return total_price - - def get_tokens_unit_price(self) -> decimal.Decimal: - """ - get token price. - - :return: decimal.Decimal('0.0001') - - """ - unit_price = self.price_config['completion'] - unit_price = unit_price.quantize(decimal.Decimal('0.0001'), rounding=decimal.ROUND_HALF_UP) - logger.debug(f'unit_price:{unit_price}') - return unit_price - - def get_num_tokens(self, text: str) -> int: - """ - get num tokens of text. - - :param text: - :return: - """ - if len(text) == 0: - return 0 - - return len(_get_token_ids_default_method(text)) - - def get_currency(self): - """ - get token currency. - - :return: get from price config, default 'USD' - """ - currency = self.price_config['currency'] - return currency - - @abstractmethod - def handle_exceptions(self, ex: Exception) -> Exception: - raise NotImplementedError diff --git a/api/core/model_providers/models/embedding/huggingface_embedding.py b/api/core/model_providers/models/embedding/huggingface_embedding.py deleted file mode 100644 index 61af1cede8bfe2..00000000000000 --- a/api/core/model_providers/models/embedding/huggingface_embedding.py +++ /dev/null @@ -1,22 +0,0 @@ -from core.model_providers.error import LLMBadRequestError -from core.model_providers.providers.base import BaseModelProvider -from core.third_party.langchain.embeddings.huggingface_hub_embedding import HuggingfaceHubEmbeddings -from core.model_providers.models.embedding.base import BaseEmbedding - - -class HuggingfaceEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = HuggingfaceHubEmbeddings( - model=name, - **credentials - ) - - super().__init__(model_provider, client, name) - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"Huggingface embedding: {str(ex)}") diff --git a/api/core/model_providers/models/embedding/jina_embedding.py b/api/core/model_providers/models/embedding/jina_embedding.py deleted file mode 100644 index 7c611af1c58dcc..00000000000000 --- a/api/core/model_providers/models/embedding/jina_embedding.py +++ /dev/null @@ -1,25 +0,0 @@ -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.embedding.base import BaseEmbedding -from core.model_providers.providers.base import BaseModelProvider -from core.third_party.langchain.embeddings.jina_embedding import JinaEmbeddings - - -class JinaEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = JinaEmbeddings( - model=name, - **credentials - ) - - super().__init__(model_provider, client, name) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, ValueError): - return LLMBadRequestError(f"Jina: {str(ex)}") - else: - return ex diff --git a/api/core/model_providers/models/embedding/localai_embedding.py b/api/core/model_providers/models/embedding/localai_embedding.py deleted file mode 100644 index 437e63c5ab62a4..00000000000000 --- a/api/core/model_providers/models/embedding/localai_embedding.py +++ /dev/null @@ -1,29 +0,0 @@ -from langchain.embeddings import LocalAIEmbeddings - -from replicate.exceptions import ModelError, ReplicateError - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.providers.base import BaseModelProvider -from core.model_providers.models.embedding.base import BaseEmbedding - - -class LocalAIEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = LocalAIEmbeddings( - model=name, - openai_api_key="1", - openai_api_base=credentials['server_url'], - ) - - super().__init__(model_provider, client, name) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, (ModelError, ReplicateError)): - return LLMBadRequestError(f"LocalAI embedding: {str(ex)}") - else: - return ex diff --git a/api/core/model_providers/models/embedding/minimax_embedding.py b/api/core/model_providers/models/embedding/minimax_embedding.py deleted file mode 100644 index 690ca9946fc3af..00000000000000 --- a/api/core/model_providers/models/embedding/minimax_embedding.py +++ /dev/null @@ -1,26 +0,0 @@ -from langchain.embeddings import MiniMaxEmbeddings - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.embedding.base import BaseEmbedding -from core.model_providers.providers.base import BaseModelProvider - - -class MinimaxEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = MiniMaxEmbeddings( - model=name, - **credentials - ) - - super().__init__(model_provider, client, name) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, ValueError): - return LLMBadRequestError(f"Minimax: {str(ex)}") - else: - return ex diff --git a/api/core/model_providers/models/embedding/openai_embedding.py b/api/core/model_providers/models/embedding/openai_embedding.py deleted file mode 100644 index 54444b121ca907..00000000000000 --- a/api/core/model_providers/models/embedding/openai_embedding.py +++ /dev/null @@ -1,62 +0,0 @@ -import decimal -import logging - -import openai -import tiktoken -from langchain.embeddings import OpenAIEmbeddings - -from core.model_providers.error import LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, \ - LLMRateLimitError, LLMAuthorizationError -from core.model_providers.models.embedding.base import BaseEmbedding -from core.model_providers.providers.base import BaseModelProvider - - -class OpenAIEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = OpenAIEmbeddings( - max_retries=1, - **credentials - ) - - super().__init__(model_provider, client, name) - - def get_num_tokens(self, text: str) -> int: - """ - get num tokens of text. - - :param text: - :return: - """ - if len(text) == 0: - return 0 - - enc = tiktoken.encoding_for_model(self.name) - - tokenized_text = enc.encode(text) - - # calculate the number of tokens in the encoded text - return len(tokenized_text) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to OpenAI API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to OpenAI API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("OpenAI service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError(str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError(str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError(ex.__class__.__name__ + ":" + str(ex)) - else: - return ex diff --git a/api/core/model_providers/models/embedding/openllm_embedding.py b/api/core/model_providers/models/embedding/openllm_embedding.py deleted file mode 100644 index 8d27815bfc53d7..00000000000000 --- a/api/core/model_providers/models/embedding/openllm_embedding.py +++ /dev/null @@ -1,22 +0,0 @@ -from core.third_party.langchain.embeddings.openllm_embedding import OpenLLMEmbeddings - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.providers.base import BaseModelProvider -from core.model_providers.models.embedding.base import BaseEmbedding - - -class OpenLLMEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = OpenLLMEmbeddings( - server_url=credentials['server_url'] - ) - - super().__init__(model_provider, client, name) - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"OpenLLM embedding: {str(ex)}") diff --git a/api/core/model_providers/models/embedding/replicate_embedding.py b/api/core/model_providers/models/embedding/replicate_embedding.py deleted file mode 100644 index 962593fcdb08eb..00000000000000 --- a/api/core/model_providers/models/embedding/replicate_embedding.py +++ /dev/null @@ -1,29 +0,0 @@ -import decimal - -from replicate.exceptions import ModelError, ReplicateError - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.providers.base import BaseModelProvider -from core.third_party.langchain.embeddings.replicate_embedding import ReplicateEmbeddings -from core.model_providers.models.embedding.base import BaseEmbedding - - -class ReplicateEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = ReplicateEmbeddings( - model=name + ':' + credentials.get('model_version'), - replicate_api_token=credentials.get('replicate_api_token') - ) - - super().__init__(model_provider, client, name) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, (ModelError, ReplicateError)): - return LLMBadRequestError(f"Replicate: {str(ex)}") - else: - return ex diff --git a/api/core/model_providers/models/embedding/xinference_embedding.py b/api/core/model_providers/models/embedding/xinference_embedding.py deleted file mode 100644 index 81f9756a166bff..00000000000000 --- a/api/core/model_providers/models/embedding/xinference_embedding.py +++ /dev/null @@ -1,22 +0,0 @@ -from core.model_providers.error import LLMBadRequestError -from core.model_providers.providers.base import BaseModelProvider -from core.model_providers.models.embedding.base import BaseEmbedding -from core.third_party.langchain.embeddings.xinference_embedding import XinferenceEmbeddings - - -class XinferenceEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = XinferenceEmbeddings( - server_url=credentials['server_url'], - model_uid=credentials['model_uid'], - ) - - super().__init__(model_provider, client, name) - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"Xinference embedding: {str(ex)}") diff --git a/api/core/model_providers/models/embedding/zhipuai_embedding.py b/api/core/model_providers/models/embedding/zhipuai_embedding.py deleted file mode 100644 index 97d5056c37de76..00000000000000 --- a/api/core/model_providers/models/embedding/zhipuai_embedding.py +++ /dev/null @@ -1,22 +0,0 @@ -from core.model_providers.error import LLMBadRequestError -from core.model_providers.providers.base import BaseModelProvider -from core.model_providers.models.embedding.base import BaseEmbedding -from core.third_party.langchain.embeddings.zhipuai_embedding import ZhipuAIEmbeddings - - -class ZhipuAIEmbedding(BaseEmbedding): - def __init__(self, model_provider: BaseModelProvider, name: str): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = ZhipuAIEmbeddings( - model=name, - **credentials, - ) - - super().__init__(model_provider, client, name) - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"ZhipuAI embedding: {str(ex)}") diff --git a/api/core/model_providers/models/entity/message.py b/api/core/model_providers/models/entity/message.py deleted file mode 100644 index e3e49ba0f42883..00000000000000 --- a/api/core/model_providers/models/entity/message.py +++ /dev/null @@ -1,113 +0,0 @@ -import enum -from typing import Any, cast, Union, List, Dict - -from langchain.schema import HumanMessage, AIMessage, SystemMessage, BaseMessage, FunctionMessage -from pydantic import BaseModel - - -class LLMRunResult(BaseModel): - content: str - prompt_tokens: int - completion_tokens: int - source: list = None - function_call: dict = None - - -class MessageType(enum.Enum): - USER = 'user' - ASSISTANT = 'assistant' - SYSTEM = 'system' - - -class PromptMessageFileType(enum.Enum): - IMAGE = 'image' - - @staticmethod - def value_of(value): - for member in PromptMessageFileType: - if member.value == value: - return member - raise ValueError(f"No matching enum found for value '{value}'") - - - -class PromptMessageFile(BaseModel): - type: PromptMessageFileType - data: Any - - -class ImagePromptMessageFile(PromptMessageFile): - class DETAIL(enum.Enum): - LOW = 'low' - HIGH = 'high' - - type: PromptMessageFileType = PromptMessageFileType.IMAGE - detail: DETAIL = DETAIL.LOW - - -class PromptMessage(BaseModel): - type: MessageType = MessageType.USER - content: str = '' - files: list[PromptMessageFile] = [] - function_call: dict = None - - -class LCHumanMessageWithFiles(HumanMessage): - # content: Union[str, List[Union[str, Dict]]] - content: str - files: list[PromptMessageFile] - - -def to_lc_messages(messages: list[PromptMessage]): - lc_messages = [] - for message in messages: - if message.type == MessageType.USER: - if not message.files: - lc_messages.append(HumanMessage(content=message.content)) - else: - lc_messages.append(LCHumanMessageWithFiles(content=message.content, files=message.files)) - elif message.type == MessageType.ASSISTANT: - additional_kwargs = {} - if message.function_call: - additional_kwargs['function_call'] = message.function_call - lc_messages.append(AIMessage(content=message.content, additional_kwargs=additional_kwargs)) - elif message.type == MessageType.SYSTEM: - lc_messages.append(SystemMessage(content=message.content)) - - return lc_messages - - -def to_prompt_messages(messages: list[BaseMessage]): - prompt_messages = [] - for message in messages: - if isinstance(message, HumanMessage): - if isinstance(message, LCHumanMessageWithFiles): - prompt_messages.append(PromptMessage( - content=message.content, - type=MessageType.USER, - files=message.files - )) - else: - prompt_messages.append(PromptMessage(content=message.content, type=MessageType.USER)) - elif isinstance(message, AIMessage): - message_kwargs = { - 'content': message.content, - 'type': MessageType.ASSISTANT - } - - if 'function_call' in message.additional_kwargs: - message_kwargs['function_call'] = message.additional_kwargs['function_call'] - - prompt_messages.append(PromptMessage(**message_kwargs)) - elif isinstance(message, SystemMessage): - prompt_messages.append(PromptMessage(content=message.content, type=MessageType.SYSTEM)) - elif isinstance(message, FunctionMessage): - prompt_messages.append(PromptMessage(content=message.content, type=MessageType.USER)) - return prompt_messages - - -def str_to_prompt_messages(texts: list[str]): - prompt_messages = [] - for text in texts: - prompt_messages.append(PromptMessage(content=text)) - return prompt_messages diff --git a/api/core/model_providers/models/entity/model_params.py b/api/core/model_providers/models/entity/model_params.py deleted file mode 100644 index 0effa75e6e4aa5..00000000000000 --- a/api/core/model_providers/models/entity/model_params.py +++ /dev/null @@ -1,60 +0,0 @@ -import enum -from typing import Optional, TypeVar, Generic - -from langchain.load.serializable import Serializable -from pydantic import BaseModel - - -class ModelMode(enum.Enum): - COMPLETION = 'completion' - CHAT = 'chat' - - -class ModelType(enum.Enum): - TEXT_GENERATION = 'text-generation' - EMBEDDINGS = 'embeddings' - SPEECH_TO_TEXT = 'speech2text' - IMAGE = 'image' - VIDEO = 'video' - MODERATION = 'moderation' - RERANKING = 'reranking' - @staticmethod - def value_of(value): - for member in ModelType: - if member.value == value: - return member - raise ValueError(f"No matching enum found for value '{value}'") - - -class ModelKwargs(BaseModel): - max_tokens: Optional[int] - temperature: Optional[float] - top_p: Optional[float] - presence_penalty: Optional[float] - frequency_penalty: Optional[float] - - -class KwargRuleType(enum.Enum): - STRING = 'string' - INTEGER = 'integer' - FLOAT = 'float' - - -T = TypeVar('T') - - -class KwargRule(Generic[T], BaseModel): - enabled: bool = True - min: Optional[T] = None - max: Optional[T] = None - default: Optional[T] = None - alias: Optional[str] = None - precision: Optional[int] = None - - -class ModelKwargsRules(BaseModel): - max_tokens: KwargRule = KwargRule[int](enabled=False) - temperature: KwargRule = KwargRule[float](enabled=False) - top_p: KwargRule = KwargRule[float](enabled=False) - presence_penalty: KwargRule = KwargRule[float](enabled=False) - frequency_penalty: KwargRule = KwargRule[float](enabled=False) diff --git a/api/core/model_providers/models/entity/provider.py b/api/core/model_providers/models/entity/provider.py deleted file mode 100644 index d9a32ec7db96ee..00000000000000 --- a/api/core/model_providers/models/entity/provider.py +++ /dev/null @@ -1,11 +0,0 @@ -from enum import Enum - - -class ProviderQuotaUnit(Enum): - TIMES = 'times' - TOKENS = 'tokens' - - -class ModelFeature(Enum): - AGENT_THOUGHT = 'agent_thought' - VISION = 'vision' diff --git a/api/core/model_providers/models/llm/anthropic_model.py b/api/core/model_providers/models/llm/anthropic_model.py deleted file mode 100644 index 5ba7e29c1dab39..00000000000000 --- a/api/core/model_providers/models/llm/anthropic_model.py +++ /dev/null @@ -1,79 +0,0 @@ -import logging -from typing import List, Optional, Any - -import anthropic -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, \ - LLMRateLimitError, LLMAuthorizationError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage, MessageType -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.anthropic_llm import AnthropicLLM - - -class AnthropicModel(BaseLLM): - model_mode: ModelMode = ModelMode.CHAT - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - return AnthropicLLM( - model=self.name, - streaming=self.streaming, - callbacks=self.callbacks, - default_request_timeout=60, - **self.credentials, - **provider_model_kwargs - ) - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(self._client.get_num_tokens_from_messages(prompts) - len(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, anthropic.APIConnectionError): - logging.warning("Failed to connect to Anthropic API.") - return LLMAPIConnectionError(f"Anthropic: The server could not be reached, cause: {ex.__cause__}") - elif isinstance(ex, anthropic.RateLimitError): - return LLMRateLimitError("Anthropic: A 429 status code was received; we should back off a bit.") - elif isinstance(ex, anthropic.AuthenticationError): - return LLMAuthorizationError(f"Anthropic: {ex.message}") - elif isinstance(ex, anthropic.BadRequestError): - return LLMBadRequestError(f"Anthropic: {ex.message}") - elif isinstance(ex, anthropic.APIStatusError): - return LLMAPIUnavailableError(f"Anthropic: code: {ex.status_code}, cause: {ex.message}") - else: - return ex - - @property - def support_streaming(self): - return True - diff --git a/api/core/model_providers/models/llm/azure_openai_model.py b/api/core/model_providers/models/llm/azure_openai_model.py deleted file mode 100644 index 38977e3ad694d2..00000000000000 --- a/api/core/model_providers/models/llm/azure_openai_model.py +++ /dev/null @@ -1,171 +0,0 @@ -import decimal -import logging -from functools import wraps -from typing import List, Optional, Any - -import openai -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.providers.base import BaseModelProvider -from core.third_party.langchain.llms.azure_chat_open_ai import EnhanceAzureChatOpenAI -from core.third_party.langchain.llms.azure_open_ai import EnhanceAzureOpenAI -from core.model_providers.error import LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, \ - LLMRateLimitError, LLMAuthorizationError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage, MessageType -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs - -AZURE_OPENAI_API_VERSION = '2023-07-01-preview' - - -FUNCTION_CALL_MODELS = [ - 'gpt-4', - 'gpt-4-32k', - 'gpt-35-turbo', - 'gpt-35-turbo-16k', - 'gpt-4-1106-preview' -] - -class AzureOpenAIModel(BaseLLM): - def __init__(self, model_provider: BaseModelProvider, - name: str, - model_kwargs: ModelKwargs, - streaming: bool = False, - callbacks: Callbacks = None): - if name == 'text-davinci-003': - self.model_mode = ModelMode.COMPLETION - else: - self.model_mode = ModelMode.CHAT - super().__init__(model_provider, name, model_kwargs, streaming, callbacks) - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - if self.name == 'text-davinci-003': - client = EnhanceAzureOpenAI( - deployment_name=self.name, - streaming=self.streaming, - request_timeout=60, - openai_api_type='azure', - openai_api_version=AZURE_OPENAI_API_VERSION, - openai_api_key=self.credentials.get('openai_api_key'), - openai_api_base=self.credentials.get('openai_api_base'), - callbacks=self.callbacks, - **provider_model_kwargs - ) - else: - extra_model_kwargs = { - 'top_p': provider_model_kwargs.get('top_p'), - 'frequency_penalty': provider_model_kwargs.get('frequency_penalty'), - 'presence_penalty': provider_model_kwargs.get('presence_penalty'), - } - - client = EnhanceAzureChatOpenAI( - deployment_name=self.name, - temperature=provider_model_kwargs.get('temperature'), - max_tokens=provider_model_kwargs.get('max_tokens'), - model_kwargs=extra_model_kwargs, - streaming=self.streaming, - request_timeout=60, - openai_api_type='azure', - openai_api_version=AZURE_OPENAI_API_VERSION, - openai_api_key=self.credentials.get('openai_api_key'), - openai_api_base=self.credentials.get('openai_api_base'), - callbacks=self.callbacks, - ) - - return client - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - generate_kwargs = { - 'stop': stop, - 'callbacks': callbacks - } - - if isinstance(prompts, str): - generate_kwargs['prompts'] = [prompts] - else: - generate_kwargs['messages'] = [prompts] - - if 'functions' in kwargs: - generate_kwargs['functions'] = kwargs['functions'] - - return self._client.generate(**generate_kwargs) - - @property - def base_model_name(self) -> str: - """ - get base model name (not deployment) - - :return: str - """ - return self.credentials.get("base_model_name") - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - if isinstance(prompts, str): - return self._client.get_num_tokens(prompts) - else: - return max(self._client.get_num_tokens_from_messages(prompts) - len(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - if self.name == 'text-davinci-003': - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - else: - extra_model_kwargs = { - 'top_p': provider_model_kwargs.get('top_p'), - 'frequency_penalty': provider_model_kwargs.get('frequency_penalty'), - 'presence_penalty': provider_model_kwargs.get('presence_penalty'), - } - - self.client.temperature = provider_model_kwargs.get('temperature') - self.client.max_tokens = provider_model_kwargs.get('max_tokens') - self.client.model_kwargs = extra_model_kwargs - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to Azure OpenAI API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to Azure OpenAI API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("Azure OpenAI service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError('Azure ' + str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError('Azure ' + str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError('Azure ' + ex.__class__.__name__ + ":" + str(ex)) - else: - return ex - - @property - def support_streaming(self): - return True - - @property - def support_function_call(self): - return self.base_model_name in FUNCTION_CALL_MODELS diff --git a/api/core/model_providers/models/llm/baichuan_model.py b/api/core/model_providers/models/llm/baichuan_model.py deleted file mode 100644 index e614547fa3d517..00000000000000 --- a/api/core/model_providers/models/llm/baichuan_model.py +++ /dev/null @@ -1,61 +0,0 @@ -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.baichuan_llm import BaichuanChatLLM - - -class BaichuanModel(BaseLLM): - model_mode: ModelMode = ModelMode.CHAT - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - return BaichuanChatLLM( - streaming=self.streaming, - callbacks=self.callbacks, - **self.credentials, - **provider_model_kwargs - ) - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(self._client.get_num_tokens_from_messages(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"Baichuan: {str(ex)}") - - @property - def support_streaming(self): - return True diff --git a/api/core/model_providers/models/llm/base.py b/api/core/model_providers/models/llm/base.py deleted file mode 100644 index 9c81170156108f..00000000000000 --- a/api/core/model_providers/models/llm/base.py +++ /dev/null @@ -1,361 +0,0 @@ -from abc import abstractmethod -from typing import List, Optional, Any, Union -import decimal -import logging - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult, BaseMessage, ChatGeneration - -from core.callback_handler.std_out_callback_handler import DifyStreamingStdOutCallbackHandler, DifyStdOutCallbackHandler -from core.helper import moderation -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.message import PromptMessage, MessageType, LLMRunResult, to_lc_messages -from core.model_providers.models.entity.model_params import ModelType, ModelKwargs, ModelMode, ModelKwargsRules -from core.model_providers.providers.base import BaseModelProvider -from core.third_party.langchain.llms.fake import FakeLLM - -logger = logging.getLogger(__name__) - - -class BaseLLM(BaseProviderModel): - model_mode: ModelMode = ModelMode.COMPLETION - name: str - model_kwargs: ModelKwargs - credentials: dict - streaming: bool = False - type: ModelType = ModelType.TEXT_GENERATION - deduct_quota: bool = True - - def __init__(self, model_provider: BaseModelProvider, - name: str, - model_kwargs: ModelKwargs, - streaming: bool = False, - callbacks: Callbacks = None): - self.name = name - self.model_rules = model_provider.get_model_parameter_rules(name, self.type) - self.model_kwargs = model_kwargs if model_kwargs else ModelKwargs( - max_tokens=None, - temperature=None, - top_p=None, - presence_penalty=None, - frequency_penalty=None - ) - self.credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - self.streaming = streaming - - if streaming: - default_callback = DifyStreamingStdOutCallbackHandler() - else: - default_callback = DifyStdOutCallbackHandler() - - if not callbacks: - callbacks = [default_callback] - else: - callbacks.append(default_callback) - - self.callbacks = callbacks - - client = self._init_client() - super().__init__(model_provider, client) - - @abstractmethod - def _init_client(self) -> Any: - raise NotImplementedError - - @property - def base_model_name(self) -> str: - """ - get llm base model name - - :return: str - """ - return self.name - - @property - def price_config(self) -> dict: - def get_or_default(): - default_price_config = { - 'prompt': decimal.Decimal('0'), - 'completion': decimal.Decimal('0'), - 'unit': decimal.Decimal('0'), - 'currency': 'USD' - } - rules = self.model_provider.get_rules() - price_config = rules['price_config'][ - self.base_model_name] if 'price_config' in rules else default_price_config - price_config = { - 'prompt': decimal.Decimal(price_config['prompt']), - 'completion': decimal.Decimal(price_config['completion']), - 'unit': decimal.Decimal(price_config['unit']), - 'currency': price_config['currency'] - } - return price_config - - self._price_config = self._price_config if hasattr(self, '_price_config') else get_or_default() - - logger.debug(f"model: {self.name} price_config: {self._price_config}") - return self._price_config - - def run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMRunResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - moderation_result = moderation.check_moderation( - self.model_provider, - "\n".join([message.content for message in messages]) - ) - - if not moderation_result: - kwargs['fake_response'] = "I apologize for any confusion, " \ - "but I'm an AI assistant to be helpful, harmless, and honest." - - if self.deduct_quota: - self.model_provider.check_quota_over_limit() - - if not callbacks: - callbacks = self.callbacks - else: - callbacks.extend(self.callbacks) - - if 'fake_response' in kwargs and kwargs['fake_response']: - prompts = self._get_prompt_from_messages(messages, ModelMode.CHAT) - fake_llm = FakeLLM( - response=kwargs['fake_response'], - num_token_func=self.get_num_tokens, - streaming=self.streaming, - callbacks=callbacks - ) - result = fake_llm.generate([prompts]) - else: - try: - result = self._run( - messages=messages, - stop=stop, - callbacks=callbacks if not (self.streaming and not self.support_streaming) else None, - **kwargs - ) - except Exception as ex: - raise self.handle_exceptions(ex) - - function_call = None - if isinstance(result.generations[0][0], ChatGeneration): - completion_content = result.generations[0][0].message.content - if 'function_call' in result.generations[0][0].message.additional_kwargs: - function_call = result.generations[0][0].message.additional_kwargs.get('function_call') - else: - completion_content = result.generations[0][0].text - - if self.streaming and not self.support_streaming: - # use FakeLLM to simulate streaming when current model not support streaming but streaming is True - prompts = self._get_prompt_from_messages(messages, ModelMode.CHAT) - fake_llm = FakeLLM( - response=completion_content, - num_token_func=self.get_num_tokens, - streaming=self.streaming, - callbacks=callbacks - ) - fake_llm.generate([prompts]) - - if result.llm_output and result.llm_output['token_usage']: - prompt_tokens = result.llm_output['token_usage']['prompt_tokens'] - completion_tokens = result.llm_output['token_usage']['completion_tokens'] - total_tokens = result.llm_output['token_usage']['total_tokens'] - else: - prompt_tokens = self.get_num_tokens(messages) - completion_tokens = self.get_num_tokens( - [PromptMessage(content=completion_content, type=MessageType.ASSISTANT)]) - total_tokens = prompt_tokens + completion_tokens - - self.model_provider.update_last_used() - - if self.deduct_quota: - self.model_provider.deduct_quota(total_tokens) - - return LLMRunResult( - content=completion_content, - prompt_tokens=prompt_tokens, - completion_tokens=completion_tokens, - function_call=function_call - ) - - @abstractmethod - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - raise NotImplementedError - - @abstractmethod - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - raise NotImplementedError - - def calc_tokens_price(self, tokens: int, message_type: MessageType) -> decimal.Decimal: - """ - calc tokens total price. - - :param tokens: - :param message_type: - :return: - """ - if message_type == MessageType.USER or message_type == MessageType.SYSTEM: - unit_price = self.price_config['prompt'] - else: - unit_price = self.price_config['completion'] - unit = self.get_price_unit(message_type) - - total_price = tokens * unit_price * unit - total_price = total_price.quantize(decimal.Decimal('0.0000001'), rounding=decimal.ROUND_HALF_UP) - logging.debug(f"tokens={tokens}, unit_price={unit_price}, unit={unit}, total_price:{total_price}") - return total_price - - def get_tokens_unit_price(self, message_type: MessageType) -> decimal.Decimal: - """ - get token price. - - :param message_type: - :return: decimal.Decimal('0.0001') - """ - if message_type == MessageType.USER or message_type == MessageType.SYSTEM: - unit_price = self.price_config['prompt'] - else: - unit_price = self.price_config['completion'] - unit_price = unit_price.quantize(decimal.Decimal('0.0001'), rounding=decimal.ROUND_HALF_UP) - logging.debug(f"unit_price={unit_price}") - return unit_price - - def get_price_unit(self, message_type: MessageType) -> decimal.Decimal: - """ - get price unit. - - :param message_type: - :return: decimal.Decimal('0.000001') - """ - if message_type == MessageType.USER or message_type == MessageType.SYSTEM: - price_unit = self.price_config['unit'] - else: - price_unit = self.price_config['unit'] - - price_unit = price_unit.quantize(decimal.Decimal('0.000001'), rounding=decimal.ROUND_HALF_UP) - logging.debug(f"price_unit={price_unit}") - return price_unit - - def get_currency(self) -> str: - """ - get token currency. - - :return: get from price config, default 'USD' - """ - currency = self.price_config['currency'] - return currency - - def get_model_kwargs(self): - return self.model_kwargs - - def set_model_kwargs(self, model_kwargs: ModelKwargs): - self.model_kwargs = model_kwargs - self._set_model_kwargs(model_kwargs) - - @abstractmethod - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - raise NotImplementedError - - @abstractmethod - def handle_exceptions(self, ex: Exception) -> Exception: - """ - Handle llm run exceptions. - - :param ex: - :return: - """ - raise NotImplementedError - - def add_callbacks(self, callbacks: Callbacks): - """ - Add callbacks to client. - - :param callbacks: - :return: - """ - if not self.client.callbacks: - self.client.callbacks = callbacks - else: - self.client.callbacks.extend(callbacks) - - @property - def support_streaming(self): - return False - - @property - def support_function_call(self): - return False - - def _get_prompt_from_messages(self, messages: List[PromptMessage], - model_mode: Optional[ModelMode] = None) -> Union[str , List[BaseMessage]]: - if not model_mode: - model_mode = self.model_mode - - if model_mode == ModelMode.COMPLETION: - if len(messages) == 0: - return '' - - return messages[0].content - else: - if len(messages) == 0: - return [] - - return to_lc_messages(messages) - - def _to_model_kwargs_input(self, model_rules: ModelKwargsRules, model_kwargs: ModelKwargs) -> dict: - """ - convert model kwargs to provider model kwargs. - - :param model_rules: - :param model_kwargs: - :return: - """ - model_kwargs_input = {} - for key, value in model_kwargs.dict().items(): - rule = getattr(model_rules, key) - if not rule.enabled: - continue - - if rule.alias: - key = rule.alias - - if rule.default is not None and value is None: - value = rule.default - - if rule.min is not None: - value = max(value, rule.min) - - if rule.max is not None: - value = min(value, rule.max) - - model_kwargs_input[key] = value - - return model_kwargs_input diff --git a/api/core/model_providers/models/llm/chatglm_model.py b/api/core/model_providers/models/llm/chatglm_model.py deleted file mode 100644 index cb6e98d5e27f0a..00000000000000 --- a/api/core/model_providers/models/llm/chatglm_model.py +++ /dev/null @@ -1,102 +0,0 @@ -import logging -from typing import List, Optional, Any - -import openai -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult, get_buffer_string - -from core.model_providers.error import LLMBadRequestError, LLMRateLimitError, LLMAuthorizationError, \ - LLMAPIUnavailableError, LLMAPIConnectionError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage, MessageType -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.chat_open_ai import EnhanceChatOpenAI - - -class ChatGLMModel(BaseLLM): - model_mode: ModelMode = ModelMode.CHAT - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - - extra_model_kwargs = { - 'top_p': provider_model_kwargs.get('top_p') - } - - if provider_model_kwargs.get('max_length') is not None: - extra_model_kwargs['max_length'] = provider_model_kwargs.get('max_length') - - client = EnhanceChatOpenAI( - model_name=self.name, - temperature=provider_model_kwargs.get('temperature'), - max_tokens=provider_model_kwargs.get('max_tokens'), - model_kwargs=extra_model_kwargs, - streaming=self.streaming, - callbacks=self.callbacks, - request_timeout=60, - openai_api_key="1", - openai_api_base=self.credentials['api_base'] + '/v1' - ) - - return client - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(sum([self._client.get_num_tokens(get_buffer_string([m])) for m in prompts]) - len(prompts), 0) - - def get_currency(self): - return 'RMB' - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - extra_model_kwargs = { - 'top_p': provider_model_kwargs.get('top_p') - } - - self.client.temperature = provider_model_kwargs.get('temperature') - self.client.max_tokens = provider_model_kwargs.get('max_tokens') - self.client.model_kwargs = extra_model_kwargs - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to ChatGLM API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to ChatGLM API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("ChatGLM service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError(str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError(str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError(ex.__class__.__name__ + ":" + str(ex)) - else: - return ex - - @classmethod - def support_streaming(cls): - return True \ No newline at end of file diff --git a/api/core/model_providers/models/llm/huggingface_hub_model.py b/api/core/model_providers/models/llm/huggingface_hub_model.py deleted file mode 100644 index ca3f1d2cf72657..00000000000000 --- a/api/core/model_providers/models/llm/huggingface_hub_model.py +++ /dev/null @@ -1,84 +0,0 @@ -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.huggingface_endpoint_llm import HuggingFaceEndpointLLM -from core.third_party.langchain.llms.huggingface_hub_llm import HuggingFaceHubLLM - - -class HuggingfaceHubModel(BaseLLM): - model_mode: ModelMode = ModelMode.COMPLETION - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - if self.credentials['huggingfacehub_api_type'] == 'inference_endpoints': - streaming = self.streaming - - if 'baichuan' in self.name.lower(): - streaming = False - - client = HuggingFaceEndpointLLM( - endpoint_url=self.credentials['huggingfacehub_endpoint_url'], - task=self.credentials['task_type'], - model_kwargs=provider_model_kwargs, - huggingfacehub_api_token=self.credentials['huggingfacehub_api_token'], - callbacks=self.callbacks, - streaming=streaming - ) - else: - client = HuggingFaceHubLLM( - repo_id=self.name, - task=self.credentials['task_type'], - model_kwargs=provider_model_kwargs, - huggingfacehub_api_token=self.credentials['huggingfacehub_api_token'], - callbacks=self.callbacks, - ) - - return client - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.get_num_tokens(prompts) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - self.client.model_kwargs = provider_model_kwargs - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"Huggingface Hub: {str(ex)}") - - @property - def support_streaming(self): - if self.credentials['huggingfacehub_api_type'] == 'inference_endpoints': - if 'baichuan' in self.name.lower(): - return False - - return True - else: - return False diff --git a/api/core/model_providers/models/llm/localai_model.py b/api/core/model_providers/models/llm/localai_model.py deleted file mode 100644 index 072b2f14b8e4f5..00000000000000 --- a/api/core/model_providers/models/llm/localai_model.py +++ /dev/null @@ -1,131 +0,0 @@ -import logging -from typing import List, Optional, Any - -import openai -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult, get_buffer_string - -from core.model_providers.error import LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, \ - LLMRateLimitError, LLMAuthorizationError -from core.model_providers.providers.base import BaseModelProvider -from core.third_party.langchain.llms.chat_open_ai import EnhanceChatOpenAI -from core.third_party.langchain.llms.open_ai import EnhanceOpenAI -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs - - -class LocalAIModel(BaseLLM): - def __init__(self, model_provider: BaseModelProvider, - name: str, - model_kwargs: ModelKwargs, - streaming: bool = False, - callbacks: Callbacks = None): - credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - if credentials['completion_type'] == 'chat_completion': - self.model_mode = ModelMode.CHAT - else: - self.model_mode = ModelMode.COMPLETION - - super().__init__(model_provider, name, model_kwargs, streaming, callbacks) - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - if self.model_mode == ModelMode.COMPLETION: - client = EnhanceOpenAI( - model_name=self.name, - streaming=self.streaming, - callbacks=self.callbacks, - request_timeout=60, - openai_api_key="1", - openai_api_base=self.credentials['server_url'] + '/v1', - **provider_model_kwargs - ) - else: - extra_model_kwargs = { - 'top_p': provider_model_kwargs.get('top_p') - } - - client = EnhanceChatOpenAI( - model_name=self.name, - temperature=provider_model_kwargs.get('temperature'), - max_tokens=provider_model_kwargs.get('max_tokens'), - model_kwargs=extra_model_kwargs, - streaming=self.streaming, - callbacks=self.callbacks, - request_timeout=60, - openai_api_key="1", - openai_api_base=self.credentials['server_url'] + '/v1' - ) - - return client - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - if isinstance(prompts, str): - return self._client.get_num_tokens(prompts) - else: - return max(sum([self._client.get_num_tokens(get_buffer_string([m])) for m in prompts]) - len(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - if self.model_mode == ModelMode.COMPLETION: - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - else: - extra_model_kwargs = { - 'top_p': provider_model_kwargs.get('top_p') - } - - self.client.temperature = provider_model_kwargs.get('temperature') - self.client.max_tokens = provider_model_kwargs.get('max_tokens') - self.client.model_kwargs = extra_model_kwargs - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to LocalAI API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to LocalAI API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("LocalAI service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError(str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError(str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError(ex.__class__.__name__ + ":" + str(ex)) - else: - return ex - - @classmethod - def support_streaming(cls): - return True diff --git a/api/core/model_providers/models/llm/minimax_model.py b/api/core/model_providers/models/llm/minimax_model.py deleted file mode 100644 index 83fca8fd75fca4..00000000000000 --- a/api/core/model_providers/models/llm/minimax_model.py +++ /dev/null @@ -1,68 +0,0 @@ -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.minimax_llm import MinimaxChatLLM - - -class MinimaxModel(BaseLLM): - model_mode: ModelMode = ModelMode.CHAT - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - return MinimaxChatLLM( - model=self.name, - streaming=self.streaming, - callbacks=self.callbacks, - **self.credentials, - **provider_model_kwargs - ) - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(self._client.get_num_tokens_from_messages(prompts), 0) - - def get_currency(self): - return 'RMB' - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, ValueError): - return LLMBadRequestError(f"Minimax: {str(ex)}") - else: - return ex - - @property - def support_streaming(self): - return True diff --git a/api/core/model_providers/models/llm/openai_model.py b/api/core/model_providers/models/llm/openai_model.py deleted file mode 100644 index 08331885b8daad..00000000000000 --- a/api/core/model_providers/models/llm/openai_model.py +++ /dev/null @@ -1,215 +0,0 @@ -import logging -from typing import List, Optional, Any - -import openai -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.providers.base import BaseModelProvider -from core.third_party.langchain.llms.chat_open_ai import EnhanceChatOpenAI -from core.model_providers.error import LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, \ - LLMRateLimitError, LLMAuthorizationError, ModelCurrentlyNotSupportError -from core.third_party.langchain.llms.open_ai import EnhanceOpenAI -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage, MessageType -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from models.provider import ProviderType, ProviderQuotaType - -COMPLETION_MODELS = [ - 'gpt-3.5-turbo-instruct', # 4,096 tokens - 'text-davinci-003', # 4,097 tokens -] - -CHAT_MODELS = [ - 'gpt-4-1106-preview', # 128,000 tokens - 'gpt-4-vision-preview', # 128,000 tokens - 'gpt-4', # 8,192 tokens - 'gpt-4-32k', # 32,768 tokens - 'gpt-3.5-turbo-1106', # 16,384 tokens - 'gpt-3.5-turbo', # 4,096 tokens - 'gpt-3.5-turbo-16k', # 16,384 tokens -] - -MODEL_MAX_TOKENS = { - 'gpt-4-1106-preview': 128000, - 'gpt-4-vision-preview': 128000, - 'gpt-4': 8192, - 'gpt-4-32k': 32768, - 'gpt-3.5-turbo-1106': 16384, - 'gpt-3.5-turbo': 4096, - 'gpt-3.5-turbo-instruct': 4097, - 'gpt-3.5-turbo-16k': 16384, - 'text-davinci-003': 4097, -} - -FUNCTION_CALL_MODELS = [ - 'gpt-4-1106-preview', - 'gpt-4', - 'gpt-4-32k', - 'gpt-3.5-turbo-1106', - 'gpt-3.5-turbo', - 'gpt-3.5-turbo-16k' -] - - -class OpenAIModel(BaseLLM): - def __init__(self, model_provider: BaseModelProvider, - name: str, - model_kwargs: ModelKwargs, - streaming: bool = False, - callbacks: Callbacks = None): - if name in COMPLETION_MODELS: - self.model_mode = ModelMode.COMPLETION - else: - self.model_mode = ModelMode.CHAT - - super().__init__(model_provider, name, model_kwargs, streaming, callbacks) - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - if self.name in COMPLETION_MODELS: - client = EnhanceOpenAI( - model_name=self.name, - streaming=self.streaming, - callbacks=self.callbacks, - request_timeout=60, - **self.credentials, - **provider_model_kwargs - ) - else: - # Fine-tuning is currently only available for the following base models: - # davinci, curie, babbage, and ada. - # This means that except for the fixed `completion` model, - # all other fine-tuned models are `completion` models. - extra_model_kwargs = { - 'top_p': provider_model_kwargs.get('top_p'), - 'frequency_penalty': provider_model_kwargs.get('frequency_penalty'), - 'presence_penalty': provider_model_kwargs.get('presence_penalty'), - } - - client = EnhanceChatOpenAI( - model_name=self.name, - temperature=provider_model_kwargs.get('temperature'), - max_tokens=provider_model_kwargs.get('max_tokens'), - model_kwargs=extra_model_kwargs, - streaming=self.streaming, - callbacks=self.callbacks, - request_timeout=60, - **self.credentials - ) - - return client - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - if self.name.startswith('gpt-4') \ - and self.model_provider.provider.provider_type == ProviderType.SYSTEM.value \ - and self.model_provider.provider.quota_type == ProviderQuotaType.TRIAL.value: - raise ModelCurrentlyNotSupportError("Dify Hosted OpenAI GPT-4 currently not support.") - - prompts = self._get_prompt_from_messages(messages) - - generate_kwargs = { - 'stop': stop, - 'callbacks': callbacks - } - - if isinstance(prompts, str): - generate_kwargs['prompts'] = [prompts] - else: - generate_kwargs['messages'] = [prompts] - - if 'functions' in kwargs: - generate_kwargs['functions'] = kwargs['functions'] - - return self._client.generate(**generate_kwargs) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - if isinstance(prompts, str): - return self._client.get_num_tokens(prompts) - else: - return max(self._client.get_num_tokens_from_messages(prompts) - len(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - if self.name in COMPLETION_MODELS: - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - else: - extra_model_kwargs = { - 'top_p': provider_model_kwargs.get('top_p'), - 'frequency_penalty': provider_model_kwargs.get('frequency_penalty'), - 'presence_penalty': provider_model_kwargs.get('presence_penalty'), - } - - self.client.temperature = provider_model_kwargs.get('temperature') - self.client.max_tokens = provider_model_kwargs.get('max_tokens') - self.client.model_kwargs = extra_model_kwargs - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to OpenAI API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to OpenAI API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("OpenAI service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError(str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError(str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError(ex.__class__.__name__ + ":" + str(ex)) - else: - return ex - - @property - def support_streaming(self): - return True - - @property - def support_function_call(self): - return self.name in FUNCTION_CALL_MODELS - - # def is_model_valid_or_raise(self): - # """ - # check is a valid model. - # - # :return: - # """ - # credentials = self._model_provider.get_credentials() - # - # try: - # result = openai.Model.retrieve( - # id=self.name, - # api_key=credentials.get('openai_api_key'), - # request_timeout=60 - # ) - # - # if 'id' not in result or result['id'] != self.name: - # raise LLMNotExistsError(f"OpenAI Model {self.name} not exists.") - # except openai.error.OpenAIError as e: - # raise LLMNotExistsError(f"OpenAI Model {self.name} not exists, cause: {e.__class__.__name__}:{str(e)}") - # except Exception as e: - # logging.exception("OpenAI Model retrieve failed.") - # raise e diff --git a/api/core/model_providers/models/llm/openllm_model.py b/api/core/model_providers/models/llm/openllm_model.py deleted file mode 100644 index c92877fd8b6ae6..00000000000000 --- a/api/core/model_providers/models/llm/openllm_model.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.openllm import OpenLLM - - -class OpenLLMModel(BaseLLM): - model_mode: ModelMode = ModelMode.COMPLETION - - def _init_client(self) -> Any: - self.provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - - client = OpenLLM( - server_url=self.credentials.get('server_url'), - callbacks=self.callbacks, - llm_kwargs=self.provider_model_kwargs - ) - - return client - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(self._client.get_num_tokens(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - pass - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"OpenLLM: {str(ex)}") diff --git a/api/core/model_providers/models/llm/replicate_model.py b/api/core/model_providers/models/llm/replicate_model.py deleted file mode 100644 index becc212ad9f8cf..00000000000000 --- a/api/core/model_providers/models/llm/replicate_model.py +++ /dev/null @@ -1,96 +0,0 @@ -import decimal -from functools import wraps -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult, get_buffer_string -from replicate.exceptions import ReplicateError, ModelError - -from core.model_providers.providers.base import BaseModelProvider -from core.model_providers.error import LLMBadRequestError -from core.third_party.langchain.llms.replicate_llm import EnhanceReplicate -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage, MessageType -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs - - -class ReplicateModel(BaseLLM): - def __init__(self, model_provider: BaseModelProvider, - name: str, - model_kwargs: ModelKwargs, - streaming: bool = False, - callbacks: Callbacks = None): - self.model_mode = ModelMode.CHAT if name.endswith('-chat') else ModelMode.COMPLETION - - super().__init__(model_provider, name, model_kwargs, streaming, callbacks) - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - - return EnhanceReplicate( - model=self.name + ':' + self.credentials.get('model_version'), - input=provider_model_kwargs, - streaming=self.streaming, - replicate_api_token=self.credentials.get('replicate_api_token'), - callbacks=self.callbacks, - ) - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - extra_kwargs = {} - if isinstance(prompts, list): - system_messages = [message for message in messages if message.type == 'system'] - if system_messages: - system_message = system_messages[0] - extra_kwargs['system_prompt'] = system_message.content - prompts = [message for message in messages if message.type != 'system'] - - prompts = get_buffer_string(prompts) - - # The maximum length the generated tokens can have. - # Corresponds to the length of the input prompt + max_new_tokens. - if 'max_length' in self._client.input: - self._client.input['max_length'] = min( - self._client.input['max_length'] + self.get_num_tokens(messages), - self.model_rules.max_tokens.max - ) - - return self._client.generate([prompts], stop, callbacks, **extra_kwargs) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - if isinstance(prompts, list): - prompts = get_buffer_string(prompts) - - return self._client.get_num_tokens(prompts) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - self.client.input = provider_model_kwargs - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, (ModelError, ReplicateError)): - return LLMBadRequestError(f"Replicate: {str(ex)}") - else: - return ex - - @property - def support_streaming(self): - return True diff --git a/api/core/model_providers/models/llm/spark_model.py b/api/core/model_providers/models/llm/spark_model.py deleted file mode 100644 index ecbcb103e0ed38..00000000000000 --- a/api/core/model_providers/models/llm/spark_model.py +++ /dev/null @@ -1,70 +0,0 @@ -import decimal -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage, MessageType -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.spark import ChatSpark -from core.third_party.spark.spark_llm import SparkError - - -class SparkModel(BaseLLM): - model_mode: ModelMode = ModelMode.CHAT - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - return ChatSpark( - model_name=self.name, - streaming=self.streaming, - callbacks=self.callbacks, - **self.credentials, - **provider_model_kwargs - ) - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - contents = [message.content for message in messages] - return max(self._client.get_num_tokens("".join(contents)), 0) - - def get_currency(self): - return 'RMB' - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, SparkError): - return LLMBadRequestError(f"Spark: {str(ex)}") - else: - return ex - - @property - def support_streaming(self): - return True diff --git a/api/core/model_providers/models/llm/tongyi_model.py b/api/core/model_providers/models/llm/tongyi_model.py deleted file mode 100644 index 319505817ffbea..00000000000000 --- a/api/core/model_providers/models/llm/tongyi_model.py +++ /dev/null @@ -1,72 +0,0 @@ -import decimal -from functools import wraps -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult -from requests import HTTPError - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage, MessageType -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.tongyi_llm import EnhanceTongyi - - -class TongyiModel(BaseLLM): - model_mode: ModelMode = ModelMode.COMPLETION - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - return EnhanceTongyi( - model_name=self.name, - max_retries=1, - streaming=self.streaming, - callbacks=self.callbacks, - **self.credentials, - **provider_model_kwargs - ) - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(self._client.get_num_tokens(prompts), 0) - - def get_currency(self): - return 'RMB' - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, (ValueError, HTTPError)): - return LLMBadRequestError(f"Tongyi: {str(ex)}") - else: - return ex - - @property - def support_streaming(self): - return True diff --git a/api/core/model_providers/models/llm/wenxin_model.py b/api/core/model_providers/models/llm/wenxin_model.py deleted file mode 100644 index c912ffb5d32c74..00000000000000 --- a/api/core/model_providers/models/llm/wenxin_model.py +++ /dev/null @@ -1,69 +0,0 @@ -import decimal -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.wenxin import Wenxin - - -class WenxinModel(BaseLLM): - model_mode: ModelMode = ModelMode.CHAT - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - return Wenxin( - model=self.name, - streaming=self.streaming, - callbacks=self.callbacks, - **self.credentials, - **provider_model_kwargs - ) - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - - generate_kwargs = {'stop': stop, 'callbacks': callbacks, 'messages': [prompts]} - - if 'functions' in kwargs: - generate_kwargs['functions'] = kwargs['functions'] - - return self._client.generate(**generate_kwargs) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(self._client.get_num_tokens_from_messages(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"Wenxin: {str(ex)}") - - @property - def support_streaming(self): - return True diff --git a/api/core/model_providers/models/llm/xinference_model.py b/api/core/model_providers/models/llm/xinference_model.py deleted file mode 100644 index 2239ef1336856c..00000000000000 --- a/api/core/model_providers/models/llm/xinference_model.py +++ /dev/null @@ -1,70 +0,0 @@ -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.xinference_llm import XinferenceLLM - - -class XinferenceModel(BaseLLM): - model_mode: ModelMode = ModelMode.COMPLETION - - def _init_client(self) -> Any: - self.provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - - client = XinferenceLLM( - server_url=self.credentials['server_url'], - model_uid=self.credentials['model_uid'], - ) - - client.callbacks = self.callbacks - - return client - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate( - [prompts], - stop, - callbacks, - generate_config={ - "stop": stop, - "stream": self.streaming, - **self.provider_model_kwargs, - } - ) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(self._client.get_num_tokens(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - pass - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"Xinference: {str(ex)}") - - @property - def support_streaming(self): - return True diff --git a/api/core/model_providers/models/llm/zhipuai_model.py b/api/core/model_providers/models/llm/zhipuai_model.py deleted file mode 100644 index f94eb4e7298ea0..00000000000000 --- a/api/core/model_providers/models/llm/zhipuai_model.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import List, Optional, Any - -from langchain.callbacks.manager import Callbacks -from langchain.schema import LLMResult - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.llm.base import BaseLLM -from core.model_providers.models.entity.message import PromptMessage -from core.model_providers.models.entity.model_params import ModelMode, ModelKwargs -from core.third_party.langchain.llms.zhipuai_llm import ZhipuAIChatLLM - - -class ZhipuAIModel(BaseLLM): - model_mode: ModelMode = ModelMode.CHAT - - def _init_client(self) -> Any: - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, self.model_kwargs) - return ZhipuAIChatLLM( - model=self.name, - streaming=self.streaming, - callbacks=self.callbacks, - **self.credentials, - **provider_model_kwargs - ) - - def _run(self, messages: List[PromptMessage], - stop: Optional[List[str]] = None, - callbacks: Callbacks = None, - **kwargs) -> LLMResult: - """ - run predict by prompt messages and stop words. - - :param messages: - :param stop: - :param callbacks: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return self._client.generate([prompts], stop, callbacks) - - def get_num_tokens(self, messages: List[PromptMessage]) -> int: - """ - get num tokens of prompt messages. - - :param messages: - :return: - """ - prompts = self._get_prompt_from_messages(messages) - return max(self._client.get_num_tokens_from_messages(prompts), 0) - - def _set_model_kwargs(self, model_kwargs: ModelKwargs): - provider_model_kwargs = self._to_model_kwargs_input(self.model_rules, model_kwargs) - for k, v in provider_model_kwargs.items(): - if hasattr(self.client, k): - setattr(self.client, k, v) - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"ZhipuAI: {str(ex)}") - - @property - def support_streaming(self): - return True diff --git a/api/core/model_providers/models/moderation/base.py b/api/core/model_providers/models/moderation/base.py deleted file mode 100644 index 0d56739f1a1852..00000000000000 --- a/api/core/model_providers/models/moderation/base.py +++ /dev/null @@ -1,29 +0,0 @@ -from abc import abstractmethod -from typing import Any - -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelType -from core.model_providers.providers.base import BaseModelProvider - - -class BaseModeration(BaseProviderModel): - name: str - type: ModelType = ModelType.MODERATION - - def __init__(self, model_provider: BaseModelProvider, client: Any, name: str): - super().__init__(model_provider, client) - self.name = name - - def run(self, text: str) -> bool: - try: - return self._run(text) - except Exception as ex: - raise self.handle_exceptions(ex) - - @abstractmethod - def _run(self, text: str) -> bool: - raise NotImplementedError - - @abstractmethod - def handle_exceptions(self, ex: Exception) -> Exception: - raise NotImplementedError diff --git a/api/core/model_providers/models/moderation/openai_moderation.py b/api/core/model_providers/models/moderation/openai_moderation.py deleted file mode 100644 index f3dedc542a2b21..00000000000000 --- a/api/core/model_providers/models/moderation/openai_moderation.py +++ /dev/null @@ -1,58 +0,0 @@ -import logging - -import openai - -from core.model_providers.error import LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, \ - LLMRateLimitError, LLMAuthorizationError -from core.model_providers.models.moderation.base import BaseModeration -from core.model_providers.providers.base import BaseModelProvider - -DEFAULT_MODEL = 'whisper-1' - - -class OpenAIModeration(BaseModeration): - - def __init__(self, model_provider: BaseModelProvider, name: str): - super().__init__(model_provider, openai.Moderation, name) - - def _run(self, text: str) -> bool: - credentials = self.model_provider.get_model_credentials( - model_name=self.name, - model_type=self.type - ) - - # 2000 text per chunk - length = 2000 - text_chunks = [text[i:i + length] for i in range(0, len(text), length)] - - max_text_chunks = 32 - chunks = [text_chunks[i:i + max_text_chunks] for i in range(0, len(text_chunks), max_text_chunks)] - - for text_chunk in chunks: - moderation_result = self._client.create(input=text_chunk, - api_key=credentials['openai_api_key']) - - for result in moderation_result.results: - if result['flagged'] is True: - return False - - return True - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to OpenAI API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to OpenAI API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("OpenAI service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError(str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError(str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError(ex.__class__.__name__ + ":" + str(ex)) - else: - return ex diff --git a/api/core/model_providers/models/reranking/base.py b/api/core/model_providers/models/reranking/base.py deleted file mode 100644 index 85863895f4208d..00000000000000 --- a/api/core/model_providers/models/reranking/base.py +++ /dev/null @@ -1,36 +0,0 @@ -from abc import abstractmethod -from typing import Any, Optional, List -from langchain.schema import Document - -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelType -from core.model_providers.providers.base import BaseModelProvider -import logging - -logger = logging.getLogger(__name__) - - -class BaseReranking(BaseProviderModel): - name: str - type: ModelType = ModelType.RERANKING - - def __init__(self, model_provider: BaseModelProvider, client: Any, name: str): - super().__init__(model_provider, client) - self.name = name - - @property - def base_model_name(self) -> str: - """ - get base model name - - :return: str - """ - return self.name - - @abstractmethod - def rerank(self, query: str, documents: List[Document], score_threshold: Optional[float], top_k: Optional[int]) -> Optional[List[Document]]: - raise NotImplementedError - - @abstractmethod - def handle_exceptions(self, ex: Exception) -> Exception: - raise NotImplementedError diff --git a/api/core/model_providers/models/reranking/cohere_reranking.py b/api/core/model_providers/models/reranking/cohere_reranking.py deleted file mode 100644 index fa2748734d34de..00000000000000 --- a/api/core/model_providers/models/reranking/cohere_reranking.py +++ /dev/null @@ -1,81 +0,0 @@ -import logging -from typing import List, Optional - -import cohere -import openai -from core.model_providers.error import (LLMAPIConnectionError, - LLMAPIUnavailableError, - LLMAuthorizationError, - LLMBadRequestError, LLMRateLimitError) -from core.model_providers.models.reranking.base import BaseReranking -from core.model_providers.providers.base import BaseModelProvider -from langchain.schema import Document - - -class CohereReranking(BaseReranking): - - def __init__(self, model_provider: BaseModelProvider, name: str): - self.credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = cohere.Client(self.credentials.get('api_key')) - - super().__init__(model_provider, client, name) - - def rerank(self, query: str, documents: List[Document], score_threshold: Optional[float], top_k: Optional[int]) -> \ - Optional[List[Document]]: - if not documents: - return [] - docs = [] - doc_id = [] - unique_documents = [] - for document in documents: - if document.metadata['doc_id'] not in doc_id: - doc_id.append(document.metadata['doc_id']) - docs.append(document.page_content) - unique_documents.append(document) - documents = unique_documents - - results = self.client.rerank(query=query, documents=docs, model=self.name, top_n=top_k) - rerank_documents = [] - - for idx, result in enumerate(results): - # format document - rerank_document = Document( - page_content=result.document['text'], - metadata={ - "doc_id": documents[result.index].metadata['doc_id'], - "doc_hash": documents[result.index].metadata['doc_hash'], - "document_id": documents[result.index].metadata['document_id'], - "dataset_id": documents[result.index].metadata['dataset_id'], - 'score': result.relevance_score - } - ) - # score threshold check - if score_threshold is not None: - if result.relevance_score >= score_threshold: - rerank_documents.append(rerank_document) - else: - rerank_documents.append(rerank_document) - return rerank_documents - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to OpenAI API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to OpenAI API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("OpenAI service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError(str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError(str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError(ex.__class__.__name__ + ":" + str(ex)) - else: - return ex diff --git a/api/core/model_providers/models/reranking/xinference_reranking.py b/api/core/model_providers/models/reranking/xinference_reranking.py deleted file mode 100644 index fda2772c70f767..00000000000000 --- a/api/core/model_providers/models/reranking/xinference_reranking.py +++ /dev/null @@ -1,62 +0,0 @@ -import logging -from typing import List, Optional - -from core.model_providers.error import LLMBadRequestError -from core.model_providers.models.reranking.base import BaseReranking -from core.model_providers.providers.base import BaseModelProvider -from langchain.schema import Document -from xinference_client.client.restful.restful_client import Client - - -class XinferenceReranking(BaseReranking): - - def __init__(self, model_provider: BaseModelProvider, name: str): - self.credentials = model_provider.get_model_credentials( - model_name=name, - model_type=self.type - ) - - client = Client(self.credentials['server_url']) - - super().__init__(model_provider, client, name) - - def rerank(self, query: str, documents: List[Document], score_threshold: Optional[float], top_k: Optional[int]) -> Optional[List[Document]]: - if not documents: - return [] - docs = [] - doc_id = [] - unique_documents = [] - for document in documents: - if document.metadata['doc_id'] not in doc_id: - doc_id.append(document.metadata['doc_id']) - docs.append(document.page_content) - unique_documents.append(document) - documents = unique_documents - - model = self.client.get_model(self.credentials['model_uid']) - response = model.rerank(query=query, documents=docs, top_n=top_k) - rerank_documents = [] - - for idx, result in enumerate(response['results']): - # format document - index = result['index'] - rerank_document = Document( - page_content=result['document'], - metadata={ - "doc_id": documents[index].metadata['doc_id'], - "doc_hash": documents[index].metadata['doc_hash'], - "document_id": documents[index].metadata['document_id'], - "dataset_id": documents[index].metadata['dataset_id'], - 'score': result['relevance_score'] - } - ) - # score threshold check - if score_threshold is not None: - if result['relevance_score'] >= score_threshold: - rerank_documents.append(rerank_document) - else: - rerank_documents.append(rerank_document) - return rerank_documents - - def handle_exceptions(self, ex: Exception) -> Exception: - return LLMBadRequestError(f"Xinference rerank: {str(ex)}") diff --git a/api/core/model_providers/models/speech2text/base.py b/api/core/model_providers/models/speech2text/base.py deleted file mode 100644 index 0b1ec1d558c452..00000000000000 --- a/api/core/model_providers/models/speech2text/base.py +++ /dev/null @@ -1,29 +0,0 @@ -from abc import abstractmethod -from typing import Any - -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelType -from core.model_providers.providers.base import BaseModelProvider - - -class BaseSpeech2Text(BaseProviderModel): - name: str - type: ModelType = ModelType.SPEECH_TO_TEXT - - def __init__(self, model_provider: BaseModelProvider, client: Any, name: str): - super().__init__(model_provider, client) - self.name = name - - def run(self, file): - try: - return self._run(file) - except Exception as ex: - raise self.handle_exceptions(ex) - - @abstractmethod - def _run(self, file): - raise NotImplementedError - - @abstractmethod - def handle_exceptions(self, ex: Exception) -> Exception: - raise NotImplementedError diff --git a/api/core/model_providers/models/speech2text/openai_whisper.py b/api/core/model_providers/models/speech2text/openai_whisper.py deleted file mode 100644 index a1fdc484dd2725..00000000000000 --- a/api/core/model_providers/models/speech2text/openai_whisper.py +++ /dev/null @@ -1,47 +0,0 @@ -import logging - -import openai - -from core.model_providers.error import LLMBadRequestError, LLMAPIConnectionError, LLMAPIUnavailableError, \ - LLMRateLimitError, LLMAuthorizationError -from core.model_providers.models.speech2text.base import BaseSpeech2Text -from core.model_providers.providers.base import BaseModelProvider - - -class OpenAIWhisper(BaseSpeech2Text): - - def __init__(self, model_provider: BaseModelProvider, name: str): - super().__init__(model_provider, openai.Audio, name) - - def _run(self, file): - credentials = self.model_provider.get_model_credentials( - model_name=self.name, - model_type=self.type - ) - - return self._client.transcribe( - model=self.name, - file=file, - api_key=credentials.get('openai_api_key'), - api_base=credentials.get('openai_api_base'), - organization=credentials.get('openai_organization'), - ) - - def handle_exceptions(self, ex: Exception) -> Exception: - if isinstance(ex, openai.error.InvalidRequestError): - logging.warning("Invalid request to OpenAI API.") - return LLMBadRequestError(str(ex)) - elif isinstance(ex, openai.error.APIConnectionError): - logging.warning("Failed to connect to OpenAI API.") - return LLMAPIConnectionError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, (openai.error.APIError, openai.error.ServiceUnavailableError, openai.error.Timeout)): - logging.warning("OpenAI service unavailable.") - return LLMAPIUnavailableError(ex.__class__.__name__ + ":" + str(ex)) - elif isinstance(ex, openai.error.RateLimitError): - return LLMRateLimitError(str(ex)) - elif isinstance(ex, openai.error.AuthenticationError): - return LLMAuthorizationError(str(ex)) - elif isinstance(ex, openai.error.OpenAIError): - return LLMBadRequestError(ex.__class__.__name__ + ":" + str(ex)) - else: - return ex diff --git a/api/core/model_providers/providers/anthropic_provider.py b/api/core/model_providers/providers/anthropic_provider.py deleted file mode 100644 index 7e9c383de5aac0..00000000000000 --- a/api/core/model_providers/providers/anthropic_provider.py +++ /dev/null @@ -1,228 +0,0 @@ -import json -import logging -from json import JSONDecodeError -from typing import Type, Optional - -import anthropic -from flask import current_app -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelMode -from core.model_providers.models.entity.provider import ModelFeature -from core.model_providers.models.llm.anthropic_model import AnthropicModel -from core.model_providers.models.llm.base import ModelType -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.model_providers.providers.hosted import hosted_model_providers -from core.third_party.langchain.llms.anthropic_llm import AnthropicLLM -from models.provider import ProviderType - - -class AnthropicProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'anthropic' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - return [ - { - 'id': 'claude-2.1', - 'name': 'claude-2.1', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'claude-2', - 'name': 'claude-2', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'claude-instant-1', - 'name': 'claude-instant-1', - 'mode': ModelMode.CHAT.value, - }, - ] - else: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.CHAT.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = AnthropicModel - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - model_max_tokens = { - 'claude-instant-1': 100000, - 'claude-2': 100000, - 'claude-2.1': 200000, - } - - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=1, default=1, precision=2), - top_p=KwargRule[float](min=0, max=1, default=0.7, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](alias="max_tokens_to_sample", min=10, max=model_max_tokens.get(model_name, 100000), default=256, precision=0), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'anthropic_api_key' not in credentials: - raise CredentialsValidateFailedError('Anthropic API Key must be provided.') - - try: - credential_kwargs = { - 'anthropic_api_key': credentials['anthropic_api_key'] - } - - if 'anthropic_api_url' in credentials: - credential_kwargs['anthropic_api_url'] = credentials['anthropic_api_url'] - - chat_llm = AnthropicLLM( - model='claude-instant-1', - max_tokens_to_sample=10, - temperature=0, - default_request_timeout=60, - **credential_kwargs - ) - - messages = [ - HumanMessage( - content="ping" - ) - ] - - chat_llm(messages) - except anthropic.APIConnectionError as ex: - raise CredentialsValidateFailedError(str(ex)) - except (anthropic.APIStatusError, anthropic.RateLimitError) as ex: - raise CredentialsValidateFailedError(str(ex)) - except Exception as ex: - logging.exception('Anthropic config validation failed') - raise ex - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['anthropic_api_key'] = encrypter.encrypt_token(tenant_id, credentials['anthropic_api_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'anthropic_api_url': None, - 'anthropic_api_key': None - } - - if credentials['anthropic_api_key']: - credentials['anthropic_api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['anthropic_api_key'] - ) - - if obfuscated: - credentials['anthropic_api_key'] = encrypter.obfuscated_token(credentials['anthropic_api_key']) - - if 'anthropic_api_url' not in credentials: - credentials['anthropic_api_url'] = None - - return credentials - else: - if hosted_model_providers.anthropic: - return { - 'anthropic_api_url': hosted_model_providers.anthropic.api_base, - 'anthropic_api_key': hosted_model_providers.anthropic.api_key, - } - else: - return { - 'anthropic_api_url': None, - 'anthropic_api_key': None - } - - @classmethod - def is_provider_type_system_supported(cls) -> bool: - if current_app.config['EDITION'] != 'CLOUD': - return False - - if hosted_model_providers.anthropic: - return True - - return False - - def should_deduct_quota(self): - if hosted_model_providers.anthropic and \ - hosted_model_providers.anthropic.quota_limit and hosted_model_providers.anthropic.quota_limit > -1: - return True - - return False - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/azure_openai_provider.py b/api/core/model_providers/providers/azure_openai_provider.py deleted file mode 100644 index 25621e72517a0b..00000000000000 --- a/api/core/model_providers/providers/azure_openai_provider.py +++ /dev/null @@ -1,438 +0,0 @@ -import json -import logging -from json import JSONDecodeError -from typing import Type - -import openai -from flask import current_app -from langchain.embeddings import OpenAIEmbeddings -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.embedding.azure_openai_embedding import AzureOpenAIEmbedding, \ - AZURE_OPENAI_API_VERSION -from core.model_providers.models.entity.model_params import ModelType, ModelKwargsRules, KwargRule, ModelMode -from core.model_providers.models.entity.provider import ModelFeature -from core.model_providers.models.llm.azure_openai_model import AzureOpenAIModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.model_providers.providers.hosted import hosted_model_providers -from core.third_party.langchain.llms.azure_chat_open_ai import EnhanceAzureChatOpenAI -from extensions.ext_database import db -from models.provider import ProviderType, ProviderModel, ProviderQuotaType - -BASE_MODELS = [ - 'gpt-4', - 'gpt-4-32k', - 'gpt-4-1106-preview', - 'gpt-4-vision-preview', - 'gpt-35-turbo', - 'gpt-35-turbo-16k', - 'text-davinci-003', - 'text-embedding-ada-002', -] - - -class AzureOpenAIProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'azure_openai' - - def get_supported_model_list(self, model_type: ModelType) -> list[dict]: - # convert old provider config to provider models - self._convert_provider_config_to_model_config() - - if self.provider.provider_type == ProviderType.CUSTOM.value: - # get configurable provider models - provider_models = db.session.query(ProviderModel).filter( - ProviderModel.tenant_id == self.provider.tenant_id, - ProviderModel.provider_name == self.provider.provider_name, - ProviderModel.model_type == model_type.value, - ProviderModel.is_valid == True - ).order_by(ProviderModel.created_at.asc()).all() - - model_list = [] - for provider_model in provider_models: - model_dict = { - 'id': provider_model.model_name, - 'name': provider_model.model_name - } - - credentials = json.loads(provider_model.encrypted_config) - - if provider_model.model_type == ModelType.TEXT_GENERATION.value: - model_dict['mode'] = self._get_text_generation_model_mode(credentials['base_model_name']) - - if credentials['base_model_name'] in [ - 'gpt-4', - 'gpt-4-32k', - 'gpt-35-turbo', - 'gpt-35-turbo-16k', - ]: - model_dict['features'] = [ - ModelFeature.AGENT_THOUGHT.value - ] - - model_list.append(model_dict) - else: - model_list = self._get_fixed_model_list(model_type) - - return model_list - - def _get_text_generation_model_mode(self, model_name) -> str: - if model_name == 'text-davinci-003': - return ModelMode.COMPLETION.value - else: - return ModelMode.CHAT.value - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - models = [ - { - 'id': 'gpt-3.5-turbo', - 'name': 'gpt-3.5-turbo', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-3.5-turbo-16k', - 'name': 'gpt-3.5-turbo-16k', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-4', - 'name': 'gpt-4', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-4-32k', - 'name': 'gpt-4-32k', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-4-1106-preview', - 'name': 'gpt-4-1106-preview', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-4-vision-preview', - 'name': 'gpt-4-vision-preview', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.VISION.value - ] - }, - { - 'id': 'text-davinci-003', - 'name': 'text-davinci-003', - 'mode': ModelMode.COMPLETION.value, - } - ] - - if self.provider.provider_type == ProviderType.SYSTEM.value \ - and self.provider.quota_type == ProviderQuotaType.TRIAL.value: - models = [item for item in models if item['id'] not in ['gpt-4', 'gpt-4-32k']] - - return models - elif model_type == ModelType.EMBEDDINGS: - return [ - { - 'id': 'text-embedding-ada-002', - 'name': 'text-embedding-ada-002' - } - ] - else: - return [] - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = AzureOpenAIModel - elif model_type == ModelType.EMBEDDINGS: - model_class = AzureOpenAIEmbedding - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - base_model_max_tokens = { - 'gpt-4': 8192, - 'gpt-4-32k': 32768, - 'gpt-4-1106-preview': 4096, - 'gpt-4-vision-preview': 4096, - 'gpt-35-turbo': 4096, - 'gpt-35-turbo-16k': 16384, - 'text-davinci-003': 4097, - } - - model_credentials = self.get_model_credentials(model_name, model_type) - - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=2, default=1, precision=2), - top_p=KwargRule[float](min=0, max=1, default=1, precision=2), - presence_penalty=KwargRule[float](min=-2, max=2, default=0, precision=2), - frequency_penalty=KwargRule[float](min=-2, max=2, default=0, precision=2), - max_tokens=KwargRule[int](min=10, max=base_model_max_tokens.get( - model_credentials['base_model_name'], - 4097 - ), default=16, precision=0), - ) - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - if 'openai_api_key' not in credentials: - raise CredentialsValidateFailedError('Azure OpenAI API key is required') - - if 'openai_api_base' not in credentials: - raise CredentialsValidateFailedError('Azure OpenAI API Base Endpoint is required') - - if 'base_model_name' not in credentials: - raise CredentialsValidateFailedError('Base Model Name is required') - - if credentials['base_model_name'] not in BASE_MODELS: - raise CredentialsValidateFailedError('Base Model Name is invalid') - - if model_type == ModelType.TEXT_GENERATION: - try: - client = EnhanceAzureChatOpenAI( - deployment_name=model_name, - temperature=0, - max_tokens=15, - request_timeout=10, - openai_api_type='azure', - openai_api_version='2023-07-01-preview', - openai_api_key=credentials['openai_api_key'], - openai_api_base=credentials['openai_api_base'], - ) - - client.generate([[HumanMessage(content='hi!')]]) - except openai.error.OpenAIError as e: - raise CredentialsValidateFailedError( - f"Azure OpenAI deployment {model_name} not exists, cause: {e.__class__.__name__}:{str(e)}") - except Exception as e: - logging.exception("Azure OpenAI Model retrieve failed.") - raise e - elif model_type == ModelType.EMBEDDINGS: - try: - client = OpenAIEmbeddings( - openai_api_type='azure', - openai_api_version=AZURE_OPENAI_API_VERSION, - deployment=model_name, - chunk_size=16, - max_retries=1, - openai_api_key=credentials['openai_api_key'], - openai_api_base=credentials['openai_api_base'] - ) - - client.embed_query('hi') - except openai.error.OpenAIError as e: - logging.exception("Azure OpenAI Model check error.") - raise CredentialsValidateFailedError( - f"Azure OpenAI deployment {model_name} not exists, cause: {e.__class__.__name__}:{str(e)}") - except Exception as e: - logging.exception("Azure OpenAI Model retrieve failed.") - raise e - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - credentials['openai_api_key'] = encrypter.encrypt_token(tenant_id, credentials['openai_api_key']) - return credentials - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - if self.provider.provider_type == ProviderType.CUSTOM.value: - # convert old provider config to provider models - self._convert_provider_config_to_model_config() - - provider_model = self._get_provider_model(model_name, model_type) - - if not provider_model.encrypted_config: - return { - 'openai_api_base': '', - 'openai_api_key': '', - 'base_model_name': '' - } - - credentials = json.loads(provider_model.encrypted_config) - if credentials['openai_api_key']: - credentials['openai_api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['openai_api_key'] - ) - - if obfuscated: - credentials['openai_api_key'] = encrypter.obfuscated_token(credentials['openai_api_key']) - - return { - 'openai_api_base': credentials['openai_api_base'], - 'openai_api_key': credentials['openai_api_key'], - 'base_model_name': credentials['base_model_name'] - } - else: - if hosted_model_providers.azure_openai: - return { - 'openai_api_base': hosted_model_providers.azure_openai.api_base, - 'openai_api_key': hosted_model_providers.azure_openai.api_key, - 'base_model_name': model_name - } - else: - return { - 'openai_api_base': None, - 'openai_api_key': None, - 'base_model_name': None - } - - @classmethod - def is_provider_type_system_supported(cls) -> bool: - if current_app.config['EDITION'] != 'CLOUD': - return False - - if hosted_model_providers.azure_openai: - return True - - return False - - def should_deduct_quota(self): - if hosted_model_providers.azure_openai \ - and hosted_model_providers.azure_openai.quota_limit and hosted_model_providers.azure_openai.quota_limit > -1: - return True - - return False - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - return - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - return {} - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - return {} - - def _convert_provider_config_to_model_config(self): - if self.provider.provider_type == ProviderType.CUSTOM.value \ - and self.provider.is_valid \ - and self.provider.encrypted_config: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'openai_api_base': '', - 'openai_api_key': '', - 'base_model_name': '' - } - - self._add_provider_model( - model_name='gpt-35-turbo', - model_type=ModelType.TEXT_GENERATION, - provider_credentials=credentials - ) - - self._add_provider_model( - model_name='gpt-35-turbo-16k', - model_type=ModelType.TEXT_GENERATION, - provider_credentials=credentials - ) - - self._add_provider_model( - model_name='gpt-4', - model_type=ModelType.TEXT_GENERATION, - provider_credentials=credentials - ) - - self._add_provider_model( - model_name='gpt-4-1106-preview', - model_type=ModelType.TEXT_GENERATION, - provider_credentials=credentials - ) - - self._add_provider_model( - model_name='gpt-4-vision-preview', - model_type=ModelType.TEXT_GENERATION, - provider_credentials=credentials - ) - - self._add_provider_model( - model_name='text-davinci-003', - model_type=ModelType.TEXT_GENERATION, - provider_credentials=credentials - ) - - self._add_provider_model( - model_name='text-embedding-ada-002', - model_type=ModelType.EMBEDDINGS, - provider_credentials=credentials - ) - - self.provider.encrypted_config = None - db.session.commit() - - def _add_provider_model(self, model_name: str, model_type: ModelType, provider_credentials: dict): - credentials = provider_credentials.copy() - credentials['base_model_name'] = model_name - provider_model = ProviderModel( - tenant_id=self.provider.tenant_id, - provider_name=self.provider.provider_name, - model_name=model_name, - model_type=model_type.value, - encrypted_config=json.dumps(credentials), - is_valid=True - ) - db.session.add(provider_model) - db.session.commit() diff --git a/api/core/model_providers/providers/baichuan_provider.py b/api/core/model_providers/providers/baichuan_provider.py deleted file mode 100644 index 784c9df2c6582b..00000000000000 --- a/api/core/model_providers/providers/baichuan_provider.py +++ /dev/null @@ -1,171 +0,0 @@ -import json -from json import JSONDecodeError -from typing import Type - -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.llm.baichuan_model import BaichuanModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.third_party.langchain.llms.baichuan_llm import BaichuanChatLLM -from models.provider import ProviderType - - -class BaichuanProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'baichuan' - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.CHAT.value - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - return [ - { - 'id': 'baichuan2-53b', - 'name': 'Baichuan2-53B', - 'mode': ModelMode.CHAT.value, - } - ] - else: - return [] - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = BaichuanModel - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=1, default=0.3, precision=2), - top_p=KwargRule[float](min=0, max=0.99, default=0.85, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](enabled=False), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'api_key' not in credentials: - raise CredentialsValidateFailedError('Baichuan api_key must be provided.') - - if 'secret_key' not in credentials: - raise CredentialsValidateFailedError('Baichuan secret_key must be provided.') - - try: - credential_kwargs = { - 'api_key': credentials['api_key'], - 'secret_key': credentials['secret_key'], - } - - llm = BaichuanChatLLM( - temperature=0, - **credential_kwargs - ) - - llm([HumanMessage(content='ping')]) - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['api_key'] = encrypter.encrypt_token(tenant_id, credentials['api_key']) - credentials['secret_key'] = encrypter.encrypt_token(tenant_id, credentials['secret_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'api_key': None, - 'secret_key': None, - } - - if credentials['api_key']: - credentials['api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['api_key'] - ) - - if obfuscated: - credentials['api_key'] = encrypter.obfuscated_token(credentials['api_key']) - - if credentials['secret_key']: - credentials['secret_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['secret_key'] - ) - - if obfuscated: - credentials['secret_key'] = encrypter.obfuscated_token(credentials['secret_key']) - - return credentials - else: - return {} - - def should_deduct_quota(self): - return True - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/base.py b/api/core/model_providers/providers/base.py deleted file mode 100644 index 1ff03f286de64b..00000000000000 --- a/api/core/model_providers/providers/base.py +++ /dev/null @@ -1,294 +0,0 @@ -from abc import ABC, abstractmethod -from datetime import datetime -from typing import Type, Optional - -from flask import current_app -from pydantic import BaseModel - -from core.model_providers.error import QuotaExceededError, LLMBadRequestError -from extensions.ext_database import db -from core.model_providers.models.entity.model_params import ModelType, ModelKwargsRules -from core.model_providers.models.entity.provider import ProviderQuotaUnit -from core.model_providers.rules import provider_rules -from models.provider import Provider, ProviderType, ProviderModel - - -class BaseModelProvider(BaseModel, ABC): - - provider: Provider - - class Config: - """Configuration for this pydantic object.""" - - arbitrary_types_allowed = True - - @property - @abstractmethod - def provider_name(self): - """ - Returns the name of a provider. - """ - raise NotImplementedError - - def get_rules(self): - """ - Returns the rules of a provider. - """ - return provider_rules[self.provider_name] - - def get_supported_model_list(self, model_type: ModelType) -> list[dict]: - """ - get supported model object list for use. - - :param model_type: - :return: - """ - rules = self.get_rules() - if 'custom' not in rules['support_provider_types']: - return self._get_fixed_model_list(model_type) - - if 'model_flexibility' not in rules: - return self._get_fixed_model_list(model_type) - - if rules['model_flexibility'] == 'fixed': - return self._get_fixed_model_list(model_type) - - # get configurable provider models - provider_models = db.session.query(ProviderModel).filter( - ProviderModel.tenant_id == self.provider.tenant_id, - ProviderModel.provider_name == self.provider.provider_name, - ProviderModel.model_type == model_type.value, - ProviderModel.is_valid == True - ).order_by(ProviderModel.created_at.asc()).all() - - provider_model_list = [] - for provider_model in provider_models: - provider_model_dict = { - 'id': provider_model.model_name, - 'name': provider_model.model_name - } - - if model_type == ModelType.TEXT_GENERATION: - provider_model_dict['mode'] = self._get_text_generation_model_mode(provider_model.model_name) - - provider_model_list.append(provider_model_dict) - - return provider_model_list - - @abstractmethod - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - """ - get supported model object list for use. - - :param model_type: - :return: - """ - raise NotImplementedError - - @abstractmethod - def _get_text_generation_model_mode(self, model_name) -> str: - """ - get text generation model mode. - - :param model_name: - :return: - """ - raise NotImplementedError - - @abstractmethod - def get_model_class(self, model_type: ModelType) -> Type: - """ - get specific model class. - - :param model_type: - :return: - """ - raise NotImplementedError - - @classmethod - @abstractmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - check provider credentials valid. - - :param credentials: - """ - raise NotImplementedError - - @classmethod - @abstractmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - """ - encrypt provider credentials for save. - - :param tenant_id: - :param credentials: - :return: - """ - raise NotImplementedError - - @abstractmethod - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param obfuscated: - :return: - """ - raise NotImplementedError - - @classmethod - @abstractmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - raise NotImplementedError - - @classmethod - @abstractmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - raise NotImplementedError - - @abstractmethod - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - raise NotImplementedError - - @abstractmethod - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - raise NotImplementedError - - @classmethod - def is_provider_type_system_supported(cls) -> bool: - return current_app.config['EDITION'] == 'CLOUD' - - def check_quota_over_limit(self): - """ - check provider quota over limit. - - :return: - """ - if self.provider.provider_type != ProviderType.SYSTEM.value: - return - - rules = self.get_rules() - if 'system' not in rules['support_provider_types']: - return - - provider = db.session.query(Provider).filter( - db.and_( - Provider.id == self.provider.id, - Provider.is_valid == True, - Provider.quota_limit > Provider.quota_used - ) - ).first() - - if not provider: - raise QuotaExceededError() - - def deduct_quota(self, used_tokens: int = 0) -> None: - """ - deduct available quota when provider type is system or paid. - - :return: - """ - if self.provider.provider_type != ProviderType.SYSTEM.value: - return - - rules = self.get_rules() - if 'system' not in rules['support_provider_types']: - return - - if not self.should_deduct_quota(): - return - - if 'system_config' not in rules: - quota_unit = ProviderQuotaUnit.TIMES.value - elif 'quota_unit' not in rules['system_config']: - quota_unit = ProviderQuotaUnit.TIMES.value - else: - quota_unit = rules['system_config']['quota_unit'] - - if quota_unit == ProviderQuotaUnit.TOKENS.value: - used_quota = used_tokens - else: - used_quota = 1 - - db.session.query(Provider).filter( - Provider.tenant_id == self.provider.tenant_id, - Provider.provider_name == self.provider.provider_name, - Provider.provider_type == self.provider.provider_type, - Provider.quota_type == self.provider.quota_type, - Provider.quota_limit > Provider.quota_used - ).update({'quota_used': Provider.quota_used + used_quota}) - db.session.commit() - - def should_deduct_quota(self): - return False - - def update_last_used(self) -> None: - """ - update last used time. - - :return: - """ - db.session.query(Provider).filter( - Provider.tenant_id == self.provider.tenant_id, - Provider.provider_name == self.provider.provider_name - ).update({'last_used': datetime.utcnow()}) - db.session.commit() - - def _get_provider_model(self, model_name: str, model_type: ModelType) -> ProviderModel: - """ - get provider model. - - :param model_name: - :param model_type: - :return: - """ - provider_model = db.session.query(ProviderModel).filter( - ProviderModel.tenant_id == self.provider.tenant_id, - ProviderModel.provider_name == self.provider.provider_name, - ProviderModel.model_name == model_name, - ProviderModel.model_type == model_type.value, - ProviderModel.is_valid == True - ).first() - - if not provider_model: - raise LLMBadRequestError(f"The model {model_name} does not exist. " - f"Please check the configuration.") - - return provider_model - - -class CredentialsValidateFailedError(Exception): - pass diff --git a/api/core/model_providers/providers/chatglm_provider.py b/api/core/model_providers/providers/chatglm_provider.py deleted file mode 100644 index e3db27b2d2441e..00000000000000 --- a/api/core/model_providers/providers/chatglm_provider.py +++ /dev/null @@ -1,165 +0,0 @@ -import json -from json import JSONDecodeError -from typing import Type - -import requests -from langchain.llms import ChatGLM - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.llm.chatglm_model import ChatGLMModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from models.provider import ProviderType - - -class ChatGLMProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'chatglm' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - return [ - { - 'id': 'chatglm3-6b', - 'name': 'ChatGLM3-6B', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'chatglm3-6b-32k', - 'name': 'ChatGLM3-6B-32K', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'chatglm2-6b', - 'name': 'ChatGLM2-6B', - 'mode': ModelMode.CHAT.value, - } - ] - else: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.CHAT.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = ChatGLMModel - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - model_max_tokens = { - 'chatglm3-6b-32k': 32000, - 'chatglm3-6b': 8000, - 'chatglm2-6b': 8000, - } - - max_tokens_alias = 'max_length' if model_name == 'chatglm2-6b' else 'max_tokens' - - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=2, default=1, precision=2), - top_p=KwargRule[float](min=0, max=1, default=0.7, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](alias=max_tokens_alias, min=10, max=model_max_tokens.get(model_name), default=2048, precision=0), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'api_base' not in credentials: - raise CredentialsValidateFailedError('ChatGLM Endpoint URL must be provided.') - - try: - response = requests.get(f"{credentials['api_base']}/v1/models", timeout=5) - - if response.status_code != 200: - raise Exception('ChatGLM Endpoint URL is invalid.') - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['api_base'] = encrypter.encrypt_token(tenant_id, credentials['api_base']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'api_base': None - } - - if credentials['api_base']: - credentials['api_base'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['api_base'] - ) - - if obfuscated: - credentials['api_base'] = encrypter.obfuscated_token(credentials['api_base']) - - return credentials - - return {} - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/cohere_provider.py b/api/core/model_providers/providers/cohere_provider.py deleted file mode 100644 index 9fa77dfff2a5c4..00000000000000 --- a/api/core/model_providers/providers/cohere_provider.py +++ /dev/null @@ -1,152 +0,0 @@ -import json -from json import JSONDecodeError -from typing import Type - -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.reranking.cohere_reranking import CohereReranking -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from models.provider import ProviderType - - -class CohereProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'cohere' - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.CHAT.value - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.RERANKING: - return [ - { - 'id': 'rerank-english-v2.0', - 'name': 'rerank-english-v2.0' - }, - { - 'id': 'rerank-multilingual-v2.0', - 'name': 'rerank-multilingual-v2.0' - } - ] - else: - return [] - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.RERANKING: - model_class = CohereReranking - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=1, default=0.3, precision=2), - top_p=KwargRule[float](min=0, max=0.99, default=0.85, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](enabled=False), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'api_key' not in credentials: - raise CredentialsValidateFailedError('Cohere api_key must be provided.') - - try: - credential_kwargs = { - 'api_key': credentials['api_key'], - } - # todo validate - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['api_key'] = encrypter.encrypt_token(tenant_id, credentials['api_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'api_key': None, - } - - if credentials['api_key']: - credentials['api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['api_key'] - ) - - if obfuscated: - credentials['api_key'] = encrypter.obfuscated_token(credentials['api_key']) - - return credentials - else: - return {} - - def should_deduct_quota(self): - return True - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/hosted.py b/api/core/model_providers/providers/hosted.py deleted file mode 100644 index df8a769acbfe36..00000000000000 --- a/api/core/model_providers/providers/hosted.py +++ /dev/null @@ -1,86 +0,0 @@ -import os -from typing import Optional - -import langchain -from flask import Flask -from pydantic import BaseModel - - -class HostedOpenAI(BaseModel): - api_base: str = None - api_organization: str = None - api_key: str - quota_limit: int = 0 - """Quota limit for the openai hosted model. -1 means unlimited.""" - paid_enabled: bool = False - - -class HostedAzureOpenAI(BaseModel): - api_base: str - api_key: str - quota_limit: int = 0 - """Quota limit for the azure openai hosted model. -1 means unlimited.""" - - -class HostedAnthropic(BaseModel): - api_base: str = None - api_key: str - quota_limit: int = 0 - """Quota limit for the anthropic hosted model. -1 means unlimited.""" - paid_enabled: bool = False - - -class HostedModelProviders(BaseModel): - openai: Optional[HostedOpenAI] = None - azure_openai: Optional[HostedAzureOpenAI] = None - anthropic: Optional[HostedAnthropic] = None - - -hosted_model_providers = HostedModelProviders() - - -class HostedModerationConfig(BaseModel): - enabled: bool = False - providers: list[str] = [] - - -class HostedConfig(BaseModel): - moderation = HostedModerationConfig() - - -hosted_config = HostedConfig() - - -def init_app(app: Flask): - if os.environ.get("DEBUG") and os.environ.get("DEBUG").lower() == 'true': - langchain.verbose = True - - if app.config.get("HOSTED_OPENAI_ENABLED"): - hosted_model_providers.openai = HostedOpenAI( - api_base=app.config.get("HOSTED_OPENAI_API_BASE"), - api_organization=app.config.get("HOSTED_OPENAI_API_ORGANIZATION"), - api_key=app.config.get("HOSTED_OPENAI_API_KEY"), - quota_limit=app.config.get("HOSTED_OPENAI_QUOTA_LIMIT"), - paid_enabled=app.config.get("HOSTED_OPENAI_PAID_ENABLED"), - ) - - if app.config.get("HOSTED_AZURE_OPENAI_ENABLED"): - hosted_model_providers.azure_openai = HostedAzureOpenAI( - api_base=app.config.get("HOSTED_AZURE_OPENAI_API_BASE"), - api_key=app.config.get("HOSTED_AZURE_OPENAI_API_KEY"), - quota_limit=app.config.get("HOSTED_AZURE_OPENAI_QUOTA_LIMIT"), - ) - - if app.config.get("HOSTED_ANTHROPIC_ENABLED"): - hosted_model_providers.anthropic = HostedAnthropic( - api_base=app.config.get("HOSTED_ANTHROPIC_API_BASE"), - api_key=app.config.get("HOSTED_ANTHROPIC_API_KEY"), - quota_limit=app.config.get("HOSTED_ANTHROPIC_QUOTA_LIMIT"), - paid_enabled=app.config.get("HOSTED_ANTHROPIC_PAID_ENABLED"), - ) - - if app.config.get("HOSTED_MODERATION_ENABLED") and app.config.get("HOSTED_MODERATION_PROVIDERS"): - hosted_config.moderation = HostedModerationConfig( - enabled=app.config.get("HOSTED_MODERATION_ENABLED"), - providers=app.config.get("HOSTED_MODERATION_PROVIDERS").split(',') - ) diff --git a/api/core/model_providers/providers/huggingface_hub_provider.py b/api/core/model_providers/providers/huggingface_hub_provider.py deleted file mode 100644 index 2cb7ff120a84c8..00000000000000 --- a/api/core/model_providers/providers/huggingface_hub_provider.py +++ /dev/null @@ -1,251 +0,0 @@ -import json -from typing import Type -import requests - -from huggingface_hub import HfApi - -from core.helper import encrypter -from core.model_providers.models.entity.model_params import KwargRule, ModelKwargsRules, ModelType, ModelMode -from core.model_providers.models.llm.huggingface_hub_model import HuggingfaceHubModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError - -from core.model_providers.models.base import BaseProviderModel -from core.third_party.langchain.llms.huggingface_endpoint_llm import HuggingFaceEndpointLLM -from core.third_party.langchain.embeddings.huggingface_hub_embedding import HuggingfaceHubEmbeddings -from core.model_providers.models.embedding.huggingface_embedding import HuggingfaceEmbedding -from models.provider import ProviderType - -HUGGINGFACE_ENDPOINT_API = 'https://api.endpoints.huggingface.cloud/v2/endpoint/' - - -class HuggingfaceHubProvider(BaseModelProvider): - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'huggingface_hub' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.COMPLETION.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = HuggingfaceHubModel - elif model_type == ModelType.EMBEDDINGS: - model_class = HuggingfaceEmbedding - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=2, default=1, precision=2), - top_p=KwargRule[float](min=0.01, max=0.99, default=0.7, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](alias='max_new_tokens', min=10, max=4000, default=200, precision=0), - ) - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - if model_type not in [ModelType.TEXT_GENERATION, ModelType.EMBEDDINGS]: - raise NotImplementedError - - if 'huggingfacehub_api_type' not in credentials \ - or credentials['huggingfacehub_api_type'] not in ['hosted_inference_api', 'inference_endpoints']: - raise CredentialsValidateFailedError('Hugging Face Hub API Type invalid, ' - 'must be hosted_inference_api or inference_endpoints.') - - if 'huggingfacehub_api_token' not in credentials: - raise CredentialsValidateFailedError('Hugging Face Hub API Token must be provided.') - - hfapi = HfApi(token=credentials['huggingfacehub_api_token']) - - try: - hfapi.whoami() - except Exception: - raise CredentialsValidateFailedError("Invalid API Token.") - - if credentials['huggingfacehub_api_type'] == 'inference_endpoints': - if 'huggingfacehub_endpoint_url' not in credentials: - raise CredentialsValidateFailedError('Hugging Face Hub Endpoint URL must be provided.') - - if 'task_type' not in credentials: - raise CredentialsValidateFailedError('Task Type must be provided.') - - if credentials['task_type'] not in ("text2text-generation", "text-generation", 'feature-extraction'): - raise CredentialsValidateFailedError('Task Type must be one of text2text-generation, ' - 'text-generation, feature-extraction.') - - try: - if credentials['task_type'] == 'feature-extraction': - cls.check_embedding_valid(credentials, model_name) - else: - cls.check_llm_valid(credentials) - except Exception as e: - raise CredentialsValidateFailedError(f"{e.__class__.__name__}:{str(e)}") - else: - try: - model_info = hfapi.model_info(repo_id=model_name) - if not model_info: - raise ValueError(f'Model {model_name} not found.') - - if 'inference' in model_info.cardData and not model_info.cardData['inference']: - raise ValueError(f'Inference API has been turned off for this model {model_name}.') - - VALID_TASKS = ("text2text-generation", "text-generation", "feature-extraction") - if model_info.pipeline_tag not in VALID_TASKS: - raise ValueError(f"Model {model_name} is not a valid task, " - f"must be one of {VALID_TASKS}.") - except Exception as e: - raise CredentialsValidateFailedError(f"{e.__class__.__name__}:{str(e)}") - - @classmethod - def check_llm_valid(cls, credentials: dict): - llm = HuggingFaceEndpointLLM( - endpoint_url=credentials['huggingfacehub_endpoint_url'], - task=credentials['task_type'], - model_kwargs={"temperature": 0.5, "max_new_tokens": 200}, - huggingfacehub_api_token=credentials['huggingfacehub_api_token'] - ) - - llm("ping") - - @classmethod - def check_embedding_valid(cls, credentials: dict, model_name: str): - - cls.check_endpoint_url_model_repository_name(credentials, model_name) - - embedding_model = HuggingfaceHubEmbeddings( - model=model_name, - **credentials - ) - - embedding_model.embed_query("ping") - - @classmethod - def check_endpoint_url_model_repository_name(cls, credentials: dict, model_name: str): - try: - url = f'{HUGGINGFACE_ENDPOINT_API}{credentials["huggingface_namespace"]}' - headers = { - 'Authorization': f'Bearer {credentials["huggingfacehub_api_token"]}', - 'Content-Type': 'application/json' - } - - response =requests.get(url=url, headers=headers) - - if response.status_code != 200: - raise ValueError('User Name or Organization Name is invalid.') - - model_repository_name = '' - - for item in response.json().get("items", []): - if item.get("status", {}).get("url") == credentials['huggingfacehub_endpoint_url']: - model_repository_name = item.get("model", {}).get("repository") - break - - if model_repository_name != model_name: - raise ValueError(f'Model Name {model_name} is invalid. Please check it on the inference endpoints console.') - - except Exception as e: - raise ValueError(str(e)) - - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - credentials['huggingfacehub_api_token'] = encrypter.encrypt_token(tenant_id, credentials['huggingfacehub_api_token']) - - if credentials['huggingfacehub_api_type'] == 'hosted_inference_api': - hfapi = HfApi(token=credentials['huggingfacehub_api_token']) - model_info = hfapi.model_info(repo_id=model_name) - if not model_info: - raise ValueError(f'Model {model_name} not found.') - - if 'inference' in model_info.cardData and not model_info.cardData['inference']: - raise ValueError(f'Inference API has been turned off for this model {model_name}.') - - credentials['task_type'] = model_info.pipeline_tag - - return credentials - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - if self.provider.provider_type != ProviderType.CUSTOM.value: - raise NotImplementedError - - provider_model = self._get_provider_model(model_name, model_type) - - if not provider_model.encrypted_config: - return { - 'huggingfacehub_api_token': None, - 'task_type': None - } - - credentials = json.loads(provider_model.encrypted_config) - - if 'task_type' not in credentials: - credentials['task_type'] = 'text-generation' - - if credentials['huggingfacehub_api_token']: - credentials['huggingfacehub_api_token'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['huggingfacehub_api_token'] - ) - - if obfuscated: - credentials['huggingfacehub_api_token'] = encrypter.obfuscated_token(credentials['huggingfacehub_api_token']) - - return credentials - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - return - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - return {} - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - return {} diff --git a/api/core/model_providers/providers/jina_provider.py b/api/core/model_providers/providers/jina_provider.py deleted file mode 100644 index fd3402582bf219..00000000000000 --- a/api/core/model_providers/providers/jina_provider.py +++ /dev/null @@ -1,141 +0,0 @@ -import json -from json import JSONDecodeError -from typing import Type - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.embedding.jina_embedding import JinaEmbedding -from core.model_providers.models.entity.model_params import ModelType, ModelKwargsRules -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.third_party.langchain.embeddings.jina_embedding import JinaEmbeddings -from models.provider import ProviderType - - -class JinaProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'jina' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.EMBEDDINGS: - return [ - { - 'id': 'jina-embeddings-v2-base-en', - 'name': 'jina-embeddings-v2-base-en', - }, - { - 'id': 'jina-embeddings-v2-small-en', - 'name': 'jina-embeddings-v2-small-en', - } - ] - else: - return [] - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.EMBEDDINGS: - model_class = JinaEmbedding - else: - raise NotImplementedError - - return model_class - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'api_key' not in credentials: - raise CredentialsValidateFailedError('Jina API Key must be provided.') - - try: - credential_kwargs = { - 'api_key': credentials['api_key'], - } - - embedding = JinaEmbeddings( - model='jina-embeddings-v2-small-en', - **credential_kwargs - ) - - embedding.embed_query("ping") - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['api_key'] = encrypter.encrypt_token(tenant_id, credentials['api_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'api_key': None, - } - - if credentials['api_key']: - credentials['api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['api_key'] - ) - - if obfuscated: - credentials['api_key'] = encrypter.obfuscated_token(credentials['api_key']) - - return credentials - - return {} - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) - - def _get_text_generation_model_mode(self, model_name) -> str: - raise NotImplementedError - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - raise NotImplementedError diff --git a/api/core/model_providers/providers/localai_provider.py b/api/core/model_providers/providers/localai_provider.py deleted file mode 100644 index 89279996f8a50f..00000000000000 --- a/api/core/model_providers/providers/localai_provider.py +++ /dev/null @@ -1,171 +0,0 @@ -import json -from typing import Type - -from langchain.embeddings import LocalAIEmbeddings -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.embedding.localai_embedding import LocalAIEmbedding -from core.model_providers.models.entity.model_params import ModelKwargsRules, ModelType, KwargRule, ModelMode -from core.model_providers.models.llm.localai_model import LocalAIModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError - -from core.model_providers.models.base import BaseProviderModel -from core.third_party.langchain.llms.chat_open_ai import EnhanceChatOpenAI -from core.third_party.langchain.llms.open_ai import EnhanceOpenAI -from models.provider import ProviderType - - -class LocalAIProvider(BaseModelProvider): - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'localai' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - credentials = self.get_model_credentials(model_name, ModelType.TEXT_GENERATION) - if credentials['completion_type'] == 'chat_completion': - return ModelMode.CHAT.value - else: - return ModelMode.COMPLETION.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = LocalAIModel - elif model_type == ModelType.EMBEDDINGS: - model_class = LocalAIEmbedding - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=2, default=0.7, precision=2), - top_p=KwargRule[float](min=0, max=1, default=1, precision=2), - max_tokens=KwargRule[int](min=10, max=4097, default=16, precision=0), - ) - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - if 'server_url' not in credentials: - raise CredentialsValidateFailedError('LocalAI Server URL must be provided.') - - try: - if model_type == ModelType.EMBEDDINGS: - model = LocalAIEmbeddings( - model=model_name, - openai_api_key='1', - openai_api_base=credentials['server_url'] - ) - - model.embed_query("ping") - else: - if ('completion_type' not in credentials - or credentials['completion_type'] not in ['completion', 'chat_completion']): - raise CredentialsValidateFailedError('LocalAI Completion Type must be provided.') - - if credentials['completion_type'] == 'chat_completion': - model = EnhanceChatOpenAI( - model_name=model_name, - openai_api_key='1', - openai_api_base=credentials['server_url'] + '/v1', - max_tokens=10, - request_timeout=60, - ) - - model([HumanMessage(content='ping')]) - else: - model = EnhanceOpenAI( - model_name=model_name, - openai_api_key='1', - openai_api_base=credentials['server_url'] + '/v1', - max_tokens=10, - request_timeout=60, - ) - - model('ping') - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - credentials['server_url'] = encrypter.encrypt_token(tenant_id, credentials['server_url']) - return credentials - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - if self.provider.provider_type != ProviderType.CUSTOM.value: - raise NotImplementedError - - provider_model = self._get_provider_model(model_name, model_type) - - if not provider_model.encrypted_config: - return { - 'server_url': None, - } - - credentials = json.loads(provider_model.encrypted_config) - if credentials['server_url']: - credentials['server_url'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['server_url'] - ) - - if obfuscated: - credentials['server_url'] = encrypter.obfuscated_token(credentials['server_url']) - - return credentials - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - return - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - return {} - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - return {} diff --git a/api/core/model_providers/providers/minimax_provider.py b/api/core/model_providers/providers/minimax_provider.py deleted file mode 100644 index f643e1e805d262..00000000000000 --- a/api/core/model_providers/providers/minimax_provider.py +++ /dev/null @@ -1,185 +0,0 @@ -import json -from json import JSONDecodeError -from typing import Type - -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.embedding.minimax_embedding import MinimaxEmbedding -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.llm.minimax_model import MinimaxModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.third_party.langchain.llms.minimax_llm import MinimaxChatLLM -from models.provider import ProviderType, ProviderQuotaType - - -class MinimaxProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'minimax' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - return [ - { - 'id': 'abab5.5-chat', - 'name': 'abab5.5-chat', - 'mode': ModelMode.COMPLETION.value, - }, - { - 'id': 'abab5-chat', - 'name': 'abab5-chat', - 'mode': ModelMode.COMPLETION.value, - } - ] - elif model_type == ModelType.EMBEDDINGS: - return [ - { - 'id': 'embo-01', - 'name': 'embo-01', - } - ] - else: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.COMPLETION.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = MinimaxModel - elif model_type == ModelType.EMBEDDINGS: - model_class = MinimaxEmbedding - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - model_max_tokens = { - 'abab5.5-chat': 16384, - 'abab5-chat': 6144, - } - - return ModelKwargsRules( - temperature=KwargRule[float](min=0.01, max=1, default=0.9, precision=2), - top_p=KwargRule[float](min=0, max=1, default=0.95, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](min=10, max=model_max_tokens.get(model_name, 6144), default=1024, precision=0), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'minimax_group_id' not in credentials: - raise CredentialsValidateFailedError('MiniMax Group ID must be provided.') - - if 'minimax_api_key' not in credentials: - raise CredentialsValidateFailedError('MiniMax API Key must be provided.') - - try: - credential_kwargs = { - 'minimax_group_id': credentials['minimax_group_id'], - 'minimax_api_key': credentials['minimax_api_key'], - } - - llm = MinimaxChatLLM( - model='abab5.5-chat', - max_tokens=10, - temperature=0.01, - **credential_kwargs - ) - - llm([HumanMessage(content='ping')]) - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['minimax_api_key'] = encrypter.encrypt_token(tenant_id, credentials['minimax_api_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value \ - or (self.provider.provider_type == ProviderType.SYSTEM.value - and self.provider.quota_type == ProviderQuotaType.FREE.value): - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'minimax_group_id': None, - 'minimax_api_key': None, - } - - if credentials['minimax_api_key']: - credentials['minimax_api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['minimax_api_key'] - ) - - if obfuscated: - credentials['minimax_api_key'] = encrypter.obfuscated_token(credentials['minimax_api_key']) - - return credentials - - return {} - - def should_deduct_quota(self): - return True - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/openai_provider.py b/api/core/model_providers/providers/openai_provider.py deleted file mode 100644 index 0e890529c633c4..00000000000000 --- a/api/core/model_providers/providers/openai_provider.py +++ /dev/null @@ -1,318 +0,0 @@ -import json -import logging -from json import JSONDecodeError -from typing import Type, Optional - -from flask import current_app -from openai.error import AuthenticationError, OpenAIError - -import openai - -from core.helper import encrypter -from core.model_providers.models.entity.provider import ModelFeature -from core.model_providers.models.speech2text.openai_whisper import OpenAIWhisper -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.embedding.openai_embedding import OpenAIEmbedding -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.llm.openai_model import OpenAIModel, COMPLETION_MODELS -from core.model_providers.models.moderation.openai_moderation import OpenAIModeration -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.model_providers.providers.hosted import hosted_model_providers -from models.provider import ProviderType, ProviderQuotaType - - -class OpenAIProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'openai' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - models = [ - { - 'id': 'gpt-3.5-turbo', - 'name': 'gpt-3.5-turbo', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-3.5-turbo-1106', - 'name': 'gpt-3.5-turbo-1106', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-3.5-turbo-instruct', - 'name': 'gpt-3.5-turbo-instruct', - 'mode': ModelMode.COMPLETION.value, - }, - { - 'id': 'gpt-3.5-turbo-16k', - 'name': 'gpt-3.5-turbo-16k', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-4', - 'name': 'gpt-4', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-4-1106-preview', - 'name': 'gpt-4-1106-preview', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'gpt-4-vision-preview', - 'name': 'gpt-4-vision-preview', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.VISION.value - ] - }, - { - 'id': 'gpt-4-32k', - 'name': 'gpt-4-32k', - 'mode': ModelMode.CHAT.value, - 'features': [ - ModelFeature.AGENT_THOUGHT.value - ] - }, - { - 'id': 'text-davinci-003', - 'name': 'text-davinci-003', - 'mode': ModelMode.COMPLETION.value, - } - ] - - if self.provider.provider_type == ProviderType.SYSTEM.value \ - and self.provider.quota_type == ProviderQuotaType.TRIAL.value: - models = [item for item in models if not item['id'].startswith('gpt-4')] - - return models - elif model_type == ModelType.EMBEDDINGS: - return [ - { - 'id': 'text-embedding-ada-002', - 'name': 'text-embedding-ada-002' - } - ] - elif model_type == ModelType.SPEECH_TO_TEXT: - return [ - { - 'id': 'whisper-1', - 'name': 'whisper-1' - } - ] - elif model_type == ModelType.MODERATION: - return [ - { - 'id': 'text-moderation-stable', - 'name': 'text-moderation-stable' - } - ] - else: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - if model_name in COMPLETION_MODELS: - return ModelMode.COMPLETION.value - else: - return ModelMode.CHAT.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = OpenAIModel - elif model_type == ModelType.EMBEDDINGS: - model_class = OpenAIEmbedding - elif model_type == ModelType.MODERATION: - model_class = OpenAIModeration - elif model_type == ModelType.SPEECH_TO_TEXT: - model_class = OpenAIWhisper - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - model_max_tokens = { - 'gpt-4-1106-preview': 128000, - 'gpt-4-vision-preview': 128000, - 'gpt-4': 8192, - 'gpt-4-32k': 32768, - 'gpt-3.5-turbo-1106': 16384, - 'gpt-3.5-turbo': 4096, - 'gpt-3.5-turbo-instruct': 4097, - 'gpt-3.5-turbo-16k': 16384, - 'text-davinci-003': 4097, - } - - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=2, default=1, precision=2), - top_p=KwargRule[float](min=0, max=1, default=1, precision=2), - presence_penalty=KwargRule[float](min=-2, max=2, default=0, precision=2), - frequency_penalty=KwargRule[float](min=-2, max=2, default=0, precision=2), - max_tokens=KwargRule[int](min=10, max=model_max_tokens.get(model_name, 4097), default=16, precision=0), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'openai_api_key' not in credentials: - raise CredentialsValidateFailedError('OpenAI API key is required') - - try: - credentials_kwargs = { - "api_key": credentials['openai_api_key'] - } - - if 'openai_api_base' in credentials and credentials['openai_api_base']: - credentials_kwargs['api_base'] = credentials['openai_api_base'] + '/v1' - - if 'openai_organization' in credentials: - credentials_kwargs['organization'] = credentials['openai_organization'] - - openai.ChatCompletion.create( - messages=[{"role": "user", "content": 'ping'}], - model='gpt-3.5-turbo', - timeout=10, - request_timeout=(5, 30), - max_tokens=20, - **credentials_kwargs - ) - except (AuthenticationError, OpenAIError) as ex: - raise CredentialsValidateFailedError(str(ex)) - except Exception as ex: - logging.exception('OpenAI config validation failed') - raise ex - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['openai_api_key'] = encrypter.encrypt_token(tenant_id, credentials['openai_api_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'openai_api_base': None, - 'openai_api_key': self.provider.encrypted_config, - 'openai_organization': None - } - - if credentials['openai_api_key']: - credentials['openai_api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['openai_api_key'] - ) - - if obfuscated: - credentials['openai_api_key'] = encrypter.obfuscated_token(credentials['openai_api_key']) - - if 'openai_api_base' not in credentials or not credentials['openai_api_base']: - credentials['openai_api_base'] = None - else: - credentials['openai_api_base'] = credentials['openai_api_base'] + '/v1' - - if 'openai_organization' not in credentials: - credentials['openai_organization'] = None - - return credentials - else: - if hosted_model_providers.openai: - return { - 'openai_api_base': hosted_model_providers.openai.api_base, - 'openai_api_key': hosted_model_providers.openai.api_key, - 'openai_organization': hosted_model_providers.openai.api_organization - } - else: - return { - 'openai_api_base': None, - 'openai_api_key': None, - 'openai_organization': None - } - - @classmethod - def is_provider_type_system_supported(cls) -> bool: - if current_app.config['EDITION'] != 'CLOUD': - return False - - if hosted_model_providers.openai: - return True - - return False - - def should_deduct_quota(self): - if hosted_model_providers.openai \ - and hosted_model_providers.openai.quota_limit and hosted_model_providers.openai.quota_limit > -1: - return True - - return False - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/openllm_provider.py b/api/core/model_providers/providers/openllm_provider.py deleted file mode 100644 index ea0e0b860d9f3e..00000000000000 --- a/api/core/model_providers/providers/openllm_provider.py +++ /dev/null @@ -1,152 +0,0 @@ -import json -from typing import Type - -from core.helper import encrypter -from core.model_providers.models.embedding.openllm_embedding import OpenLLMEmbedding -from core.model_providers.models.entity.model_params import KwargRule, ModelKwargsRules, ModelType, ModelMode -from core.model_providers.models.llm.openllm_model import OpenLLMModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError - -from core.model_providers.models.base import BaseProviderModel -from core.third_party.langchain.embeddings.openllm_embedding import OpenLLMEmbeddings -from core.third_party.langchain.llms.openllm import OpenLLM -from models.provider import ProviderType - - -class OpenLLMProvider(BaseModelProvider): - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'openllm' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.COMPLETION.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = OpenLLMModel - elif model_type== ModelType.EMBEDDINGS: - model_class = OpenLLMEmbedding - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - return ModelKwargsRules( - temperature=KwargRule[float](min=0.01, max=2, default=1, precision=2), - top_p=KwargRule[float](min=0, max=1, default=0.7, precision=2), - presence_penalty=KwargRule[float](min=-2, max=2, default=0, precision=2), - frequency_penalty=KwargRule[float](min=-2, max=2, default=0, precision=2), - max_tokens=KwargRule[int](alias='max_new_tokens', min=10, max=4000, default=128, precision=0), - ) - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - if 'server_url' not in credentials: - raise CredentialsValidateFailedError('OpenLLM Server URL must be provided.') - - try: - credential_kwargs = { - 'server_url': credentials['server_url'] - } - - if model_type == ModelType.TEXT_GENERATION: - llm = OpenLLM( - llm_kwargs={ - 'max_new_tokens': 10 - }, - **credential_kwargs - ) - - llm("ping") - elif model_type == ModelType.EMBEDDINGS: - embedding = OpenLLMEmbeddings( - **credential_kwargs - ) - - embedding.embed_query("ping") - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - credentials['server_url'] = encrypter.encrypt_token(tenant_id, credentials['server_url']) - return credentials - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - if self.provider.provider_type != ProviderType.CUSTOM.value: - raise NotImplementedError - - provider_model = self._get_provider_model(model_name, model_type) - - if not provider_model.encrypted_config: - return { - 'server_url': None - } - - credentials = json.loads(provider_model.encrypted_config) - if credentials['server_url']: - credentials['server_url'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['server_url'] - ) - - if obfuscated: - credentials['server_url'] = encrypter.obfuscated_token(credentials['server_url']) - - return credentials - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - return - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - return {} - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - return {} diff --git a/api/core/model_providers/providers/replicate_provider.py b/api/core/model_providers/providers/replicate_provider.py deleted file mode 100644 index be9a7aa7aebe3c..00000000000000 --- a/api/core/model_providers/providers/replicate_provider.py +++ /dev/null @@ -1,191 +0,0 @@ -import json -import logging -from typing import Type - -import replicate -from replicate.exceptions import ReplicateError - -from core.helper import encrypter -from core.model_providers.models.entity.model_params import KwargRule, KwargRuleType, ModelKwargsRules, ModelType, \ - ModelMode -from core.model_providers.models.llm.replicate_model import ReplicateModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError - -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.embedding.replicate_embedding import ReplicateEmbedding -from models.provider import ProviderType - - -class ReplicateProvider(BaseModelProvider): - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'replicate' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.CHAT.value if model_name.endswith('-chat') else ModelMode.COMPLETION.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = ReplicateModel - elif model_type == ModelType.EMBEDDINGS: - model_class = ReplicateEmbedding - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - model_credentials = self.get_model_credentials(model_name, model_type) - - model = replicate.Client(api_token=model_credentials.get("replicate_api_token")).models.get(model_name) - - try: - version = model.versions.get(model_credentials['model_version']) - except ReplicateError as e: - raise CredentialsValidateFailedError(f"Model {model_name}:{model_credentials['model_version']} not exists, " - f"cause: {e.__class__.__name__}:{str(e)}") - except Exception as e: - logging.exception("Model validate failed.") - raise e - - model_kwargs_rules = ModelKwargsRules() - for key, value in version.openapi_schema['components']['schemas']['Input']['properties'].items(): - if key not in ['debug', 'prompt'] and value['type'] in ['number', 'integer']: - if key == ['temperature', 'top_p']: - kwarg_rule = KwargRule[float]( - type=KwargRuleType.FLOAT.value if value['type'] == 'number' else KwargRuleType.INTEGER.value, - min=float(value.get('minimum')) if value.get('minimum') is not None else None, - max=float(value.get('maximum')) if value.get('maximum') is not None else None, - default=float(value.get('default')) if value.get('default') is not None else None, - precision = 2 - ) - if key == 'temperature': - model_kwargs_rules.temperature = kwarg_rule - else: - model_kwargs_rules.top_p = kwarg_rule - elif key in ['max_length', 'max_new_tokens']: - model_kwargs_rules.max_tokens = KwargRule[int]( - alias=key, - type=KwargRuleType.INTEGER.value, - min=int(value.get('minimum')) if value.get('minimum') is not None else 1, - max=int(value.get('maximum')) if value.get('maximum') is not None else 8000, - default=int(value.get('default')) if value.get('default') is not None else 500, - precision = 0 - ) - - return model_kwargs_rules - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - if 'replicate_api_token' not in credentials: - raise CredentialsValidateFailedError('Replicate API Key must be provided.') - - if 'model_version' not in credentials: - raise CredentialsValidateFailedError('Replicate Model Version must be provided.') - - if model_name.count("/") != 1: - raise CredentialsValidateFailedError('Replicate Model Name must be provided, ' - 'format: {user_name}/{model_name}') - - version = credentials['model_version'] - try: - model = replicate.Client(api_token=credentials.get("replicate_api_token")).models.get(model_name) - rst = model.versions.get(version) - - if model_type == ModelType.EMBEDDINGS \ - and 'Embedding' not in rst.openapi_schema['components']['schemas']: - raise CredentialsValidateFailedError(f"Model {model_name}:{version} is not a Embedding model.") - elif model_type == ModelType.TEXT_GENERATION \ - and ('items' not in rst.openapi_schema['components']['schemas']['Output'] - or 'type' not in rst.openapi_schema['components']['schemas']['Output']['items'] - or rst.openapi_schema['components']['schemas']['Output']['items']['type'] != 'string'): - raise CredentialsValidateFailedError(f"Model {model_name}:{version} is not a Text Generation model.") - except ReplicateError as e: - raise CredentialsValidateFailedError( - f"Model {model_name}:{version} not exists, cause: {e.__class__.__name__}:{str(e)}") - except Exception as e: - logging.exception("Replicate config validation failed.") - raise e - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - credentials['replicate_api_token'] = encrypter.encrypt_token(tenant_id, credentials['replicate_api_token']) - return credentials - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - if self.provider.provider_type != ProviderType.CUSTOM.value: - raise NotImplementedError - - provider_model = self._get_provider_model(model_name, model_type) - - if not provider_model.encrypted_config: - return { - 'replicate_api_token': None, - } - - credentials = json.loads(provider_model.encrypted_config) - if credentials['replicate_api_token']: - credentials['replicate_api_token'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['replicate_api_token'] - ) - - if obfuscated: - credentials['replicate_api_token'] = encrypter.obfuscated_token(credentials['replicate_api_token']) - - return credentials - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - return - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - return {} - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - return {} diff --git a/api/core/model_providers/providers/spark_provider.py b/api/core/model_providers/providers/spark_provider.py deleted file mode 100644 index bd95db4890ea88..00000000000000 --- a/api/core/model_providers/providers/spark_provider.py +++ /dev/null @@ -1,242 +0,0 @@ -import json -import logging -from json import JSONDecodeError -from typing import Type - -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.llm.spark_model import SparkModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.third_party.langchain.llms.spark import ChatSpark -from core.third_party.spark.spark_llm import SparkError -from models.provider import ProviderType, ProviderQuotaType - - -class SparkProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'spark' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - return [ - { - 'id': 'spark-v3', - 'name': 'Spark V3.0', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'spark-v2', - 'name': 'Spark V2.0', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'spark', - 'name': 'Spark V1.5', - 'mode': ModelMode.CHAT.value, - } - ] - else: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.CHAT.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = SparkModel - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - return ModelKwargsRules( - temperature=KwargRule[float](min=0, max=1, default=0.5, precision=2), - top_p=KwargRule[float](enabled=False), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](min=10, max=4096, default=2048, precision=0), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'app_id' not in credentials: - raise CredentialsValidateFailedError('Spark app_id must be provided.') - - if 'api_key' not in credentials: - raise CredentialsValidateFailedError('Spark api_key must be provided.') - - if 'api_secret' not in credentials: - raise CredentialsValidateFailedError('Spark api_secret must be provided.') - - credential_kwargs = { - 'app_id': credentials['app_id'], - 'api_key': credentials['api_key'], - 'api_secret': credentials['api_secret'], - } - - try: - chat_llm = ChatSpark( - model_name='spark-v3', - max_tokens=10, - temperature=0.01, - **credential_kwargs - ) - - messages = [ - HumanMessage( - content="ping" - ) - ] - - chat_llm(messages) - except SparkError as ex: - # try spark v2.1 if v3.1 failed - try: - chat_llm = ChatSpark( - model_name='spark-v2', - max_tokens=10, - temperature=0.01, - **credential_kwargs - ) - - messages = [ - HumanMessage( - content="ping" - ) - ] - - chat_llm(messages) - except SparkError as ex: - # try spark v1.5 if v2.1 failed - try: - chat_llm = ChatSpark( - model_name='spark', - max_tokens=10, - temperature=0.01, - **credential_kwargs - ) - - messages = [ - HumanMessage( - content="ping" - ) - ] - - chat_llm(messages) - except SparkError as ex: - raise CredentialsValidateFailedError(str(ex)) - except Exception as ex: - logging.exception('Spark config validation failed') - raise ex - except Exception as ex: - logging.exception('Spark config validation failed') - raise ex - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['api_key'] = encrypter.encrypt_token(tenant_id, credentials['api_key']) - credentials['api_secret'] = encrypter.encrypt_token(tenant_id, credentials['api_secret']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value \ - or (self.provider.provider_type == ProviderType.SYSTEM.value - and self.provider.quota_type == ProviderQuotaType.FREE.value): - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'app_id': None, - 'api_key': None, - 'api_secret': None, - } - - if credentials['api_key']: - credentials['api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['api_key'] - ) - - if obfuscated: - credentials['api_key'] = encrypter.obfuscated_token(credentials['api_key']) - - if credentials['api_secret']: - credentials['api_secret'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['api_secret'] - ) - - if obfuscated: - credentials['api_secret'] = encrypter.obfuscated_token(credentials['api_secret']) - - return credentials - else: - return { - 'app_id': None, - 'api_key': None, - 'api_secret': None, - } - - def should_deduct_quota(self): - return True - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/tongyi_provider.py b/api/core/model_providers/providers/tongyi_provider.py deleted file mode 100644 index 49ff731ac5cb5a..00000000000000 --- a/api/core/model_providers/providers/tongyi_provider.py +++ /dev/null @@ -1,162 +0,0 @@ -import json -from json import JSONDecodeError -from typing import Type - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.llm.tongyi_model import TongyiModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.third_party.langchain.llms.tongyi_llm import EnhanceTongyi -from models.provider import ProviderType - - -class TongyiProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'tongyi' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - return [ - { - 'id': 'qwen-turbo', - 'name': 'qwen-turbo', - 'mode': ModelMode.COMPLETION.value, - }, - { - 'id': 'qwen-plus', - 'name': 'qwen-plus', - 'mode': ModelMode.COMPLETION.value, - } - ] - else: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.COMPLETION.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = TongyiModel - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - model_max_tokens = { - 'qwen-turbo': 6000, - 'qwen-plus': 6000 - } - - return ModelKwargsRules( - temperature=KwargRule[float](min=0.01, max=1, default=1, precision=2), - top_p=KwargRule[float](min=0.01, max=0.99, default=0.5, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](enabled=False, max=model_max_tokens.get(model_name)), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'dashscope_api_key' not in credentials: - raise CredentialsValidateFailedError('Dashscope API Key must be provided.') - - try: - credential_kwargs = { - 'dashscope_api_key': credentials['dashscope_api_key'] - } - - llm = EnhanceTongyi( - model_name='qwen-turbo', - max_retries=1, - **credential_kwargs - ) - - llm("ping") - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['dashscope_api_key'] = encrypter.encrypt_token(tenant_id, credentials['dashscope_api_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'dashscope_api_key': None - } - - if credentials['dashscope_api_key']: - credentials['dashscope_api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['dashscope_api_key'] - ) - - if obfuscated: - credentials['dashscope_api_key'] = encrypter.obfuscated_token(credentials['dashscope_api_key']) - - return credentials - - return {} - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/wenxin_provider.py b/api/core/model_providers/providers/wenxin_provider.py deleted file mode 100644 index 650acffcc4567c..00000000000000 --- a/api/core/model_providers/providers/wenxin_provider.py +++ /dev/null @@ -1,201 +0,0 @@ -import json -from json import JSONDecodeError -from typing import Type - -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.llm.wenxin_model import WenxinModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.third_party.langchain.llms.wenxin import Wenxin -from models.provider import ProviderType - - -class WenxinProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'wenxin' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - return [ - { - 'id': 'ernie-bot-4', - 'name': 'ERNIE-Bot-4', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'ernie-bot', - 'name': 'ERNIE-Bot', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'ernie-bot-turbo', - 'name': 'ERNIE-Bot-turbo', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'bloomz-7b', - 'name': 'BLOOMZ-7B', - 'mode': ModelMode.CHAT.value, - } - ] - else: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.COMPLETION.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = WenxinModel - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - model_max_tokens = { - 'ernie-bot-4': 4800, - 'ernie-bot': 4800, - 'ernie-bot-turbo': 11200, - } - - if model_name in ['ernie-bot-4', 'ernie-bot', 'ernie-bot-turbo']: - return ModelKwargsRules( - temperature=KwargRule[float](min=0.01, max=1, default=0.95, precision=2), - top_p=KwargRule[float](min=0.01, max=1, default=0.8, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](enabled=False, max=model_max_tokens.get(model_name)), - ) - else: - return ModelKwargsRules( - temperature=KwargRule[float](enabled=False), - top_p=KwargRule[float](enabled=False), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](enabled=False), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'api_key' not in credentials: - raise CredentialsValidateFailedError('Wenxin api_key must be provided.') - - if 'secret_key' not in credentials: - raise CredentialsValidateFailedError('Wenxin secret_key must be provided.') - - try: - credential_kwargs = { - 'api_key': credentials['api_key'], - 'secret_key': credentials['secret_key'], - } - - llm = Wenxin( - temperature=0.01, - **credential_kwargs - ) - - llm([HumanMessage(content='ping')]) - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['api_key'] = encrypter.encrypt_token(tenant_id, credentials['api_key']) - credentials['secret_key'] = encrypter.encrypt_token(tenant_id, credentials['secret_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value: - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'api_key': None, - 'secret_key': None, - } - - if credentials['api_key']: - credentials['api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['api_key'] - ) - - if obfuscated: - credentials['api_key'] = encrypter.obfuscated_token(credentials['api_key']) - - if credentials['secret_key']: - credentials['secret_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['secret_key'] - ) - - if obfuscated: - credentials['secret_key'] = encrypter.obfuscated_token(credentials['secret_key']) - - return credentials - else: - return { - 'api_key': None, - 'secret_key': None, - } - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/providers/xinference_provider.py b/api/core/model_providers/providers/xinference_provider.py deleted file mode 100644 index 133c5e7cf8bd9f..00000000000000 --- a/api/core/model_providers/providers/xinference_provider.py +++ /dev/null @@ -1,212 +0,0 @@ -import json -from typing import Type - -import requests -from xinference_client.client.restful.restful_client import Client - -from core.helper import encrypter -from core.model_providers.models.embedding.xinference_embedding import XinferenceEmbedding -from core.model_providers.models.entity.model_params import KwargRule, ModelKwargsRules, ModelType, ModelMode -from core.model_providers.models.llm.xinference_model import XinferenceModel -from core.model_providers.models.reranking.xinference_reranking import XinferenceReranking -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError - -from core.model_providers.models.base import BaseProviderModel -from core.third_party.langchain.embeddings.xinference_embedding import XinferenceEmbeddings -from core.third_party.langchain.llms.xinference_llm import XinferenceLLM -from models.provider import ProviderType - - -class XinferenceProvider(BaseModelProvider): - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'xinference' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.COMPLETION.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = XinferenceModel - elif model_type == ModelType.EMBEDDINGS: - model_class = XinferenceEmbedding - elif model_type == ModelType.RERANKING: - model_class = XinferenceReranking - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - credentials = self.get_model_credentials(model_name, model_type) - if credentials['model_format'] == "ggmlv3" and credentials["model_handle_type"] == "chatglm": - return ModelKwargsRules( - temperature=KwargRule[float](min=0.01, max=2, default=1, precision=2), - top_p=KwargRule[float](min=0, max=1, default=0.7, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](min=10, max=4000, default=256, precision=0), - ) - elif credentials['model_format'] == "ggmlv3": - return ModelKwargsRules( - temperature=KwargRule[float](min=0.01, max=2, default=1, precision=2), - top_p=KwargRule[float](min=0, max=1, default=0.7, precision=2), - presence_penalty=KwargRule[float](min=-2, max=2, default=0, precision=2), - frequency_penalty=KwargRule[float](min=-2, max=2, default=0, precision=2), - max_tokens=KwargRule[int](min=10, max=4000, default=256, precision=0), - ) - else: - return ModelKwargsRules( - temperature=KwargRule[float](min=0.01, max=2, default=1, precision=2), - top_p=KwargRule[float](min=0, max=1, default=0.7, precision=2), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](min=10, max=4000, default=256, precision=0), - ) - - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - if 'server_url' not in credentials: - raise CredentialsValidateFailedError('Xinference Server URL must be provided.') - - if 'model_uid' not in credentials: - raise CredentialsValidateFailedError('Xinference Model UID must be provided.') - - try: - credential_kwargs = { - 'server_url': credentials['server_url'], - 'model_uid': credentials['model_uid'], - } - - if model_type == ModelType.TEXT_GENERATION: - llm = XinferenceLLM( - **credential_kwargs - ) - - llm("ping") - elif model_type == ModelType.EMBEDDINGS: - embedding = XinferenceEmbeddings( - **credential_kwargs - ) - - embedding.embed_query("ping") - elif model_type == ModelType.RERANKING: - rerank_client = Client(credential_kwargs['server_url']) - model = rerank_client.get_model(credential_kwargs['model_uid']) - model.rerank(query="ping", documents=["ping", "pong"], top_n=2) - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - extra_credentials = cls._get_extra_credentials(credentials) - credentials.update(extra_credentials) - - credentials['server_url'] = encrypter.encrypt_token(tenant_id, credentials['server_url']) - - return credentials - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - if self.provider.provider_type != ProviderType.CUSTOM.value: - raise NotImplementedError - - provider_model = self._get_provider_model(model_name, model_type) - - if not provider_model.encrypted_config: - return { - 'server_url': None, - 'model_uid': None, - } - - credentials = json.loads(provider_model.encrypted_config) - if credentials['server_url']: - credentials['server_url'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['server_url'] - ) - - if obfuscated: - credentials['server_url'] = encrypter.obfuscated_token(credentials['server_url']) - - return credentials - - @classmethod - def _get_extra_credentials(self, credentials: dict) -> dict: - url = f"{credentials['server_url']}/v1/models/{credentials['model_uid']}" - response = requests.get(url) - if response.status_code != 200: - raise RuntimeError( - f"Failed to get the model description, detail: {response.json()['detail']}" - ) - desc = response.json() - - extra_credentials = { - 'model_format': desc['model_format'], - } - if desc["model_format"] == "ggmlv3" and "chatglm" in desc["model_name"]: - extra_credentials['model_handle_type'] = 'chatglm' - elif "generate" in desc["model_ability"]: - extra_credentials['model_handle_type'] = 'generate' - elif "chat" in desc["model_ability"]: - extra_credentials['model_handle_type'] = 'chat' - else: - raise NotImplementedError(f"Model handle type not supported.") - - return extra_credentials - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - return - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - return {} - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - return {} diff --git a/api/core/model_providers/providers/zhipuai_provider.py b/api/core/model_providers/providers/zhipuai_provider.py deleted file mode 100644 index 2a7a0f65e04835..00000000000000 --- a/api/core/model_providers/providers/zhipuai_provider.py +++ /dev/null @@ -1,188 +0,0 @@ -import json -from json import JSONDecodeError -from typing import Type - -from langchain.schema import HumanMessage - -from core.helper import encrypter -from core.model_providers.models.base import BaseProviderModel -from core.model_providers.models.embedding.zhipuai_embedding import ZhipuAIEmbedding -from core.model_providers.models.entity.model_params import ModelKwargsRules, KwargRule, ModelType, ModelMode -from core.model_providers.models.llm.zhipuai_model import ZhipuAIModel -from core.model_providers.providers.base import BaseModelProvider, CredentialsValidateFailedError -from core.third_party.langchain.llms.zhipuai_llm import ZhipuAIChatLLM -from models.provider import ProviderType, ProviderQuotaType - - -class ZhipuAIProvider(BaseModelProvider): - - @property - def provider_name(self): - """ - Returns the name of a provider. - """ - return 'zhipuai' - - def _get_fixed_model_list(self, model_type: ModelType) -> list[dict]: - if model_type == ModelType.TEXT_GENERATION: - return [ - { - 'id': 'chatglm_turbo', - 'name': 'chatglm_turbo', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'chatglm_pro', - 'name': 'chatglm_pro', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'chatglm_std', - 'name': 'chatglm_std', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'chatglm_lite', - 'name': 'chatglm_lite', - 'mode': ModelMode.CHAT.value, - }, - { - 'id': 'chatglm_lite_32k', - 'name': 'chatglm_lite_32k', - 'mode': ModelMode.CHAT.value, - } - ] - elif model_type == ModelType.EMBEDDINGS: - return [ - { - 'id': 'text_embedding', - 'name': 'text_embedding', - } - ] - else: - return [] - - def _get_text_generation_model_mode(self, model_name) -> str: - return ModelMode.CHAT.value - - def get_model_class(self, model_type: ModelType) -> Type[BaseProviderModel]: - """ - Returns the model class. - - :param model_type: - :return: - """ - if model_type == ModelType.TEXT_GENERATION: - model_class = ZhipuAIModel - elif model_type == ModelType.EMBEDDINGS: - model_class = ZhipuAIEmbedding - else: - raise NotImplementedError - - return model_class - - def get_model_parameter_rules(self, model_name: str, model_type: ModelType) -> ModelKwargsRules: - """ - get model parameter rules. - - :param model_name: - :param model_type: - :return: - """ - return ModelKwargsRules( - temperature=KwargRule[float](min=0.01, max=1, default=0.95, precision=2), - top_p=KwargRule[float](min=0.1, max=0.9, default=0.8, precision=1), - presence_penalty=KwargRule[float](enabled=False), - frequency_penalty=KwargRule[float](enabled=False), - max_tokens=KwargRule[int](enabled=False), - ) - - @classmethod - def is_provider_credentials_valid_or_raise(cls, credentials: dict): - """ - Validates the given credentials. - """ - if 'api_key' not in credentials: - raise CredentialsValidateFailedError('ZhipuAI api_key must be provided.') - - try: - credential_kwargs = { - 'api_key': credentials['api_key'] - } - - llm = ZhipuAIChatLLM( - temperature=0.01, - **credential_kwargs - ) - - llm([HumanMessage(content='ping')]) - except Exception as ex: - raise CredentialsValidateFailedError(str(ex)) - - @classmethod - def encrypt_provider_credentials(cls, tenant_id: str, credentials: dict) -> dict: - credentials['api_key'] = encrypter.encrypt_token(tenant_id, credentials['api_key']) - return credentials - - def get_provider_credentials(self, obfuscated: bool = False) -> dict: - if self.provider.provider_type == ProviderType.CUSTOM.value \ - or (self.provider.provider_type == ProviderType.SYSTEM.value - and self.provider.quota_type == ProviderQuotaType.FREE.value): - try: - credentials = json.loads(self.provider.encrypted_config) - except JSONDecodeError: - credentials = { - 'api_key': None, - } - - if credentials['api_key']: - credentials['api_key'] = encrypter.decrypt_token( - self.provider.tenant_id, - credentials['api_key'] - ) - - if obfuscated: - credentials['api_key'] = encrypter.obfuscated_token(credentials['api_key']) - - return credentials - else: - return {} - - def should_deduct_quota(self): - return True - - @classmethod - def is_model_credentials_valid_or_raise(cls, model_name: str, model_type: ModelType, credentials: dict): - """ - check model credentials valid. - - :param model_name: - :param model_type: - :param credentials: - """ - return - - @classmethod - def encrypt_model_credentials(cls, tenant_id: str, model_name: str, model_type: ModelType, - credentials: dict) -> dict: - """ - encrypt model credentials for save. - - :param tenant_id: - :param model_name: - :param model_type: - :param credentials: - :return: - """ - return {} - - def get_model_credentials(self, model_name: str, model_type: ModelType, obfuscated: bool = False) -> dict: - """ - get credentials for llm use. - - :param model_name: - :param model_type: - :param obfuscated: - :return: - """ - return self.get_provider_credentials(obfuscated) diff --git a/api/core/model_providers/rules.py b/api/core/model_providers/rules.py deleted file mode 100644 index 5a911500deee10..00000000000000 --- a/api/core/model_providers/rules.py +++ /dev/null @@ -1,47 +0,0 @@ -import json -import os - - -def init_provider_rules(): - # Get the absolute path of the subdirectory - subdirectory_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'rules') - - # Path to the providers.json file - providers_json_file_path = os.path.join(subdirectory_path, '_providers.json') - - try: - # Open the JSON file and read its content - with open(providers_json_file_path, 'r') as json_file: - data = json.load(json_file) - # Store the content in a dictionary with the key as the file name (without extension) - provider_names = data - except FileNotFoundError: - return "JSON file not found or path error" - except json.JSONDecodeError: - return "JSON file decoding error" - - # Dictionary to store the content of all JSON files - json_data = {} - - try: - # Loop through all files in the directory - for provider_name in provider_names: - filename = provider_name + '.json' - - # Path to each JSON file - json_file_path = os.path.join(subdirectory_path, filename) - - # Open each JSON file and read its content - with open(json_file_path, 'r') as json_file: - data = json.load(json_file) - # Store the content in the dictionary with the key as the file name (without extension) - json_data[os.path.splitext(filename)[0]] = data - - return json_data - except FileNotFoundError: - return "JSON file not found or path error" - except json.JSONDecodeError: - return "JSON file decoding error" - - -provider_rules = init_provider_rules() diff --git a/api/core/model_providers/rules/_providers.json b/api/core/model_providers/rules/_providers.json deleted file mode 100644 index 8c500e9ddad5e9..00000000000000 --- a/api/core/model_providers/rules/_providers.json +++ /dev/null @@ -1,19 +0,0 @@ -[ - "openai", - "azure_openai", - "anthropic", - "minimax", - "tongyi", - "spark", - "wenxin", - "zhipuai", - "baichuan", - "chatglm", - "replicate", - "huggingface_hub", - "xinference", - "openllm", - "localai", - "cohere", - "jina" -] diff --git a/api/core/model_providers/rules/anthropic.json b/api/core/model_providers/rules/anthropic.json deleted file mode 100644 index bb02ce845be4dd..00000000000000 --- a/api/core/model_providers/rules/anthropic.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "support_provider_types": [ - "system", - "custom" - ], - "system_config": { - "supported_quota_types": [ - "paid", - "trial" - ], - "quota_unit": "tokens", - "quota_limit": 0 - }, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation" - ], - "price_config": { - "claude-instant-1": { - "prompt": "1.63", - "completion": "5.51", - "unit": "0.000001", - "currency": "USD" - }, - "claude-2": { - "prompt": "8.00", - "completion": "24.00", - "unit": "0.000001", - "currency": "USD" - }, - "claude-2.1": { - "prompt": "8.00", - "completion": "24.00", - "unit": "0.000001", - "currency": "USD" - } - } -} \ No newline at end of file diff --git a/api/core/model_providers/rules/azure_openai.json b/api/core/model_providers/rules/azure_openai.json deleted file mode 100644 index 789abd4d437602..00000000000000 --- a/api/core/model_providers/rules/azure_openai.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "configurable", - "supported_model_types": [ - "text-generation", - "embeddings" - ], - "price_config":{ - "gpt-4": { - "prompt": "0.03", - "completion": "0.06", - "unit": "0.001", - "currency": "USD" - }, - "gpt-4-32k": { - "prompt": "0.06", - "completion": "0.12", - "unit": "0.001", - "currency": "USD" - }, - "gpt-4-1106-preview": { - "prompt": "0.01", - "completion": "0.03", - "unit": "0.001", - "currency": "USD" - }, - "gpt-4-vision-preview": { - "prompt": "0.01", - "completion": "0.03", - "unit": "0.001", - "currency": "USD" - }, - "gpt-35-turbo": { - "prompt": "0.002", - "completion": "0.0015", - "unit": "0.001", - "currency": "USD" - }, - "gpt-35-turbo-16k": { - "prompt": "0.003", - "completion": "0.004", - "unit": "0.001", - "currency": "USD" - }, - "text-davinci-002": { - "prompt": "0.02", - "completion": "0.02", - "unit": "0.001", - "currency": "USD" - }, - "text-davinci-003": { - "prompt": "0.02", - "completion": "0.02", - "unit": "0.001", - "currency": "USD" - }, - "text-embedding-ada-002":{ - "completion": "0.0001", - "unit": "0.001", - "currency": "USD" - } - } -} \ No newline at end of file diff --git a/api/core/model_providers/rules/baichuan.json b/api/core/model_providers/rules/baichuan.json deleted file mode 100644 index 70b847cd8ad245..00000000000000 --- a/api/core/model_providers/rules/baichuan.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation" - ], - "price_config": { - "baichuan2-53b": { - "prompt": "0.01", - "completion": "0.01", - "unit": "0.001", - "currency": "RMB" - } - } -} \ No newline at end of file diff --git a/api/core/model_providers/rules/chatglm.json b/api/core/model_providers/rules/chatglm.json deleted file mode 100644 index 3ddfb8cf53b047..00000000000000 --- a/api/core/model_providers/rules/chatglm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation" - ] -} \ No newline at end of file diff --git a/api/core/model_providers/rules/cohere.json b/api/core/model_providers/rules/cohere.json deleted file mode 100644 index 5ce0c9cc5b8177..00000000000000 --- a/api/core/model_providers/rules/cohere.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "fixed", - "supported_model_types": [ - "reranking" - ] -} \ No newline at end of file diff --git a/api/core/model_providers/rules/huggingface_hub.json b/api/core/model_providers/rules/huggingface_hub.json deleted file mode 100644 index 3f1ee225f16b3c..00000000000000 --- a/api/core/model_providers/rules/huggingface_hub.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "configurable", - "supported_model_types": [ - "text-generation", - "embeddings" - ] -} \ No newline at end of file diff --git a/api/core/model_providers/rules/jina.json b/api/core/model_providers/rules/jina.json deleted file mode 100644 index e63bf3975a4425..00000000000000 --- a/api/core/model_providers/rules/jina.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "fixed", - "supported_model_types": [ - "embeddings" - ] -} \ No newline at end of file diff --git a/api/core/model_providers/rules/localai.json b/api/core/model_providers/rules/localai.json deleted file mode 100644 index 3f1ee225f16b3c..00000000000000 --- a/api/core/model_providers/rules/localai.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "configurable", - "supported_model_types": [ - "text-generation", - "embeddings" - ] -} \ No newline at end of file diff --git a/api/core/model_providers/rules/minimax.json b/api/core/model_providers/rules/minimax.json deleted file mode 100644 index 0348ec3dfbc92d..00000000000000 --- a/api/core/model_providers/rules/minimax.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "support_provider_types": [ - "system", - "custom" - ], - "system_config": { - "supported_quota_types": [ - "free" - ], - "quota_unit": "tokens" - }, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation", - "embeddings" - ], - "price_config": { - "abab5.5-chat": { - "prompt": "0.015", - "completion": "0.015", - "unit": "0.001", - "currency": "RMB" - }, - "abab5-chat": { - "prompt": "0.015", - "completion": "0.015", - "unit": "0.001", - "currency": "RMB" - }, - "embo-01": { - "completion": "0", - "unit": "0.0001", - "currency": "RMB" - } - } -} \ No newline at end of file diff --git a/api/core/model_providers/rules/openai.json b/api/core/model_providers/rules/openai.json deleted file mode 100644 index 4f1f39b792fdbc..00000000000000 --- a/api/core/model_providers/rules/openai.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "support_provider_types": [ - "system", - "custom" - ], - "system_config": { - "supported_quota_types": [ - "trial" - ], - "quota_unit": "times", - "quota_limit": 200 - }, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation", - "embeddings", - "speech2text", - "moderation" - ], - "price_config": { - "gpt-4": { - "prompt": "0.03", - "completion": "0.06", - "unit": "0.001", - "currency": "USD" - }, - "gpt-4-32k": { - "prompt": "0.06", - "completion": "0.12", - "unit": "0.001", - "currency": "USD" - }, - "gpt-4-1106-preview": { - "prompt": "0.01", - "completion": "0.03", - "unit": "0.001", - "currency": "USD" - }, - "gpt-4-vision-preview": { - "prompt": "0.01", - "completion": "0.03", - "unit": "0.001", - "currency": "USD" - }, - "gpt-3.5-turbo": { - "prompt": "0.0015", - "completion": "0.002", - "unit": "0.001", - "currency": "USD" - }, - "gpt-3.5-turbo-1106": { - "prompt": "0.0010", - "completion": "0.002", - "unit": "0.001", - "currency": "USD" - }, - "gpt-3.5-turbo-instruct": { - "prompt": "0.0015", - "completion": "0.002", - "unit": "0.001", - "currency": "USD" - }, - "gpt-3.5-turbo-16k": { - "prompt": "0.003", - "completion": "0.004", - "unit": "0.001", - "currency": "USD" - }, - "text-davinci-003": { - "prompt": "0.02", - "completion": "0.02", - "unit": "0.001", - "currency": "USD" - }, - "text-embedding-ada-002":{ - "completion": "0.0001", - "unit": "0.001", - "currency": "USD" - } - } -} \ No newline at end of file diff --git a/api/core/model_providers/rules/openllm.json b/api/core/model_providers/rules/openllm.json deleted file mode 100644 index 3f1ee225f16b3c..00000000000000 --- a/api/core/model_providers/rules/openllm.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "configurable", - "supported_model_types": [ - "text-generation", - "embeddings" - ] -} \ No newline at end of file diff --git a/api/core/model_providers/rules/replicate.json b/api/core/model_providers/rules/replicate.json deleted file mode 100644 index 3f1ee225f16b3c..00000000000000 --- a/api/core/model_providers/rules/replicate.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "configurable", - "supported_model_types": [ - "text-generation", - "embeddings" - ] -} \ No newline at end of file diff --git a/api/core/model_providers/rules/spark.json b/api/core/model_providers/rules/spark.json deleted file mode 100644 index 4fa4d9a5698c8e..00000000000000 --- a/api/core/model_providers/rules/spark.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "support_provider_types": [ - "system", - "custom" - ], - "system_config": { - "supported_quota_types": [ - "free" - ], - "quota_unit": "tokens" - }, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation" - ], - "price_config": { - "spark": { - "prompt": "0.18", - "completion": "0.18", - "unit": "0.0001", - "currency": "RMB" - }, - "spark-v2": { - "prompt": "0.36", - "completion": "0.36", - "unit": "0.0001", - "currency": "RMB" - }, - "spark-v3": { - "prompt": "0.36", - "completion": "0.36", - "unit": "0.0001", - "currency": "RMB" - } - } -} \ No newline at end of file diff --git a/api/core/model_providers/rules/tongyi.json b/api/core/model_providers/rules/tongyi.json deleted file mode 100644 index 319fbcaf9f7a92..00000000000000 --- a/api/core/model_providers/rules/tongyi.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation" - ], - "price_config": { - "qwen-turbo": { - "prompt": "0.012", - "completion": "0.012", - "unit": "0.001", - "currency": "RMB" - }, - "qwen-plus": { - "prompt": "0.14", - "completion": "0.14", - "unit": "0.001", - "currency": "RMB" - } - } -} \ No newline at end of file diff --git a/api/core/model_providers/rules/wenxin.json b/api/core/model_providers/rules/wenxin.json deleted file mode 100644 index 193dccc411a6d5..00000000000000 --- a/api/core/model_providers/rules/wenxin.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation" - ], - "price_config": { - "ernie-bot-4": { - "prompt": "0", - "completion": "0", - "unit": "0.001", - "currency": "RMB" - }, - "ernie-bot": { - "prompt": "0.012", - "completion": "0.012", - "unit": "0.001", - "currency": "RMB" - }, - "ernie-bot-turbo": { - "prompt": "0.008", - "completion": "0.008", - "unit": "0.001", - "currency": "RMB" - }, - "bloomz-7b": { - "prompt": "0.006", - "completion": "0.006", - "unit": "0.001", - "currency": "RMB" - } - } -} \ No newline at end of file diff --git a/api/core/model_providers/rules/xinference.json b/api/core/model_providers/rules/xinference.json deleted file mode 100644 index 3e426a927b502c..00000000000000 --- a/api/core/model_providers/rules/xinference.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "support_provider_types": [ - "custom" - ], - "system_config": null, - "model_flexibility": "configurable", - "supported_model_types": [ - "text-generation", - "embeddings", - "reranking" - ] -} \ No newline at end of file diff --git a/api/core/model_providers/rules/zhipuai.json b/api/core/model_providers/rules/zhipuai.json deleted file mode 100644 index 07badcc31312ff..00000000000000 --- a/api/core/model_providers/rules/zhipuai.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "support_provider_types": [ - "system", - "custom" - ], - "system_config": { - "supported_quota_types": [ - "free" - ], - "quota_unit": "tokens" - }, - "model_flexibility": "fixed", - "supported_model_types": [ - "text-generation", - "embeddings" - ], - "price_config": { - "chatglm_turbo": { - "prompt": "0.005", - "completion": "0.005", - "unit": "0.001", - "currency": "RMB" - }, - "chatglm_pro": { - "prompt": "0.01", - "completion": "0.01", - "unit": "0.001", - "currency": "RMB" - }, - "chatglm_std": { - "prompt": "0.005", - "completion": "0.005", - "unit": "0.001", - "currency": "RMB" - }, - "chatglm_lite": { - "prompt": "0.002", - "completion": "0.002", - "unit": "0.001", - "currency": "RMB" - }, - "chatglm_lite_32k": { - "prompt": "0.0004", - "completion": "0.0004", - "unit": "0.001", - "currency": "RMB" - }, - "text_embedding": { - "completion": "0", - "unit": "0.001", - "currency": "RMB" - } - } -} \ No newline at end of file diff --git a/api/core/model_runtime/README.md b/api/core/model_runtime/README.md new file mode 100644 index 00000000000000..eba1f3f2d05c51 --- /dev/null +++ b/api/core/model_runtime/README.md @@ -0,0 +1,69 @@ +# Model Runtime + +This module provides the interface for invoking and authenticating various models, and offers Dify a unified information and credentials form rule for model providers. + +- On one hand, it decouples models from upstream and downstream processes, facilitating horizontal expansion for developers, +- On the other hand, it allows for direct display of providers and models in the frontend interface by simply defining them in the backend, eliminating the need to modify frontend logic. + +## Features + +- Supports capability invocation for 5 types of models + + - `LLM` - LLM text completion, dialogue, pre-computed tokens capability + - `Text Embedding Model` - Text Embedding, pre-computed tokens capability + - `Rerank Model` - Segment Rerank capability + - `Speech-to-text Model` - Speech to text capability + - `Moderation` - Moderation capability + +- Model provider display + + ![image-20231210143654461](./docs/en_US/images/index/image-20231210143654461.png) + + Displays a list of all supported providers, including provider names, icons, supported model types list, predefined model list, configuration method, and credentials form rules, etc. For detailed rule design, see: [Schema](./schema.md). + +- Selectable model list display + + ![image-20231210144229650](./docs/en_US/images/index/image-20231210144229650.png) + + After configuring provider/model credentials, the dropdown (application orchestration interface/default model) allows viewing of the available LLM list. Greyed out items represent predefined model lists from providers without configured credentials, facilitating user review of supported models. + + In addition, this list also returns configurable parameter information and rules for LLM, as shown below: + + ![image-20231210144814617](./docs/en_US/images/index/image-20231210144814617.png) + + These parameters are all defined in the backend, allowing different settings for various parameters supported by different models, as detailed in: [Schema](./docs/en_US/schema.md#ParameterRule). + +- Provider/model credential authentication + + ![image-20231210151548521](./docs/en_US/images/index/image-20231210151548521.png) + + ![image-20231210151628992](./docs/en_US/images/index/image-20231210151628992.png) + + The provider list returns configuration information for the credentials form, which can be authenticated through Runtime's interface. The first image above is a provider credential DEMO, and the second is a model credential DEMO. + +## Structure + +![](./docs/en_US/images/index/image-20231210165243632.png) + +Model Runtime is divided into three layers: + +- The outermost layer is the factory method + + It provides methods for obtaining all providers, all model lists, getting provider instances, and authenticating provider/model credentials. + +- The second layer is the provider layer + + It provides the current provider's model list, model instance obtaining, provider credential authentication, and provider configuration rule information, **allowing horizontal expansion** to support different providers. + +- The bottom layer is the model layer + + It offers direct invocation of various model types, predefined model configuration information, getting predefined/remote model lists, model credential authentication methods. Different models provide additional special methods, like LLM's pre-computed tokens method, cost information obtaining method, etc., **allowing horizontal expansion** for different models under the same provider (within supported model types). + + + +## Next Steps + +- Add new provider configuration: [Link](./docs/en_US/provider_scale_out.md) +- Add new models for existing providers: [Link](./docs/en_US/provider_scale_out.md#AddModel) +- View YAML configuration rules: [Link](./docs/en_US/schema.md) +- Implement interface methods: [Link](./docs/en_US/interfaces.md) diff --git a/api/core/model_runtime/README_CN.md b/api/core/model_runtime/README_CN.md new file mode 100644 index 00000000000000..d9000845c69c71 --- /dev/null +++ b/api/core/model_runtime/README_CN.md @@ -0,0 +1,88 @@ +# Model Runtime + +该模块提供了各模型的调用、鉴权接口,并为 Dify 提供了统一的模型供应商的信息和凭据表单规则。 + +- 一方面将模型和上下游解耦,方便开发者对模型横向扩展, +- 另一方面提供了只需在后端定义供应商和模型,即可在前端页面直接展示,无需修改前端逻辑。 + +## 功能介绍 + +- 支持 5 种模型类型的能力调用 + + - `LLM` - LLM 文本补全、对话,预计算 tokens 能力 + - `Text Embedidng Model` - 文本 Embedding ,预计算 tokens 能力 + - `Rerank Model` - 分段 Rerank 能力 + - `Speech-to-text Model` - 语音转文本能力 + - `Moderation` - Moderation 能力 + +- 模型供应商展示 + + ![image-20231210143654461](./docs/zh_Hans/images/index/image-20231210143654461.png) + +​ 展示所有已支持的供应商列表,除了返回供应商名称、图标之外,还提供了支持的模型类型列表,预定义模型列表、配置方式以及配置凭据的表单规则等等,规则设计详见:[Schema](./schema.md)。 + +- 可选择的模型列表展示 + + ![image-20231210144229650](./docs/zh_Hans/images/index/image-20231210144229650.png) + +​ 配置供应商/模型凭据后,可在此下拉(应用编排界面/默认模型)查看可用的 LLM 列表,其中灰色的为未配置凭据供应商的预定义模型列表,方便用户查看已支持的模型。 + +​ 除此之外,该列表还返回了 LLM 可配置的参数信息和规则,如下图: + +​ ![image-20231210144814617](./docs/zh_Hans/images/index/image-20231210144814617.png) + +​ 这里的参数均为后端定义,相比之前只有 5 种固定参数,这里可为不同模型设置所支持的各种参数,详见:[Schema](./docs/zh_Hans/schema.md#ParameterRule)。 + +- 供应商/模型凭据鉴权 + + ![image-20231210151548521](./docs/zh_Hans/images/index/image-20231210151548521.png) + +![image-20231210151628992](./docs/zh_Hans/images/index/image-20231210151628992.png) + +​ 供应商列表返回了凭据表单的配置信息,可通过 Runtime 提供的接口对凭据进行鉴权,上图 1 为供应商凭据 DEMO,上图 2 为模型凭据 DEMO。 + +## 结构 + +![](./docs/zh_Hans/images/index/image-20231210165243632.png) + +Model Runtime 分三层: + +- 最外层为工厂方法 + + 提供获取所有供应商、所有模型列表、获取供应商实例、供应商/模型凭据鉴权方法。 + +- 第二层为供应商层 + + 提供获取当前供应商模型列表、获取模型实例、供应商凭据鉴权、供应商配置规则信息,**可横向扩展**以支持不同的供应商。 + + 对于供应商/模型凭据,有两种情况 + - 如OpenAI这类中心化供应商,需要定义如**api_key**这类的鉴权凭据 + - 如[**Xinference**](https://github.com/xorbitsai/inference)这类本地部署的供应商,需要定义如**server_url**这类的地址凭据,有时候还需要定义**model_uid**之类的模型类型凭据,就像下面这样,当在供应商层定义了这些凭据后,就可以在前端页面上直接展示,无需修改前端逻辑。 + ![Alt text](docs/zh_Hans/images/index/image.png) + + 当配置好凭据后,就可以通过DifyRuntime的外部接口直接获取到对应供应商所需要的**Schema**(凭据表单规则),从而在可以在不修改前端逻辑的情况下,提供新的供应商/模型的支持。 + +- 最底层为模型层 + + 提供各种模型类型的直接调用、预定义模型配置信息、获取预定义/远程模型列表、模型凭据鉴权方法,不同模型额外提供了特殊方法,如 LLM 提供预计算 tokens 方法、获取费用信息方法等,**可横向扩展**同供应商下不同的模型(支持的模型类型下)。 + + 在这里我们需要先区分模型参数与模型凭据。 + + - 模型参数(**在本层定义**):这是一类经常需要变动,随时调整的参数,如 LLM 的 **max_tokens**、**temperature** 等,这些参数是由用户在前端页面上进行调整的,因此需要在后端定义参数的规则,以便前端页面进行展示和调整。在DifyRuntime中,他们的参数名一般为**model_parameters: dict[str, any]**。 + + - 模型凭据(**在供应商层定义**):这是一类不经常变动,一般在配置好后就不会再变动的参数,如 **api_key**、**server_url** 等。在DifyRuntime中,他们的参数名一般为**credentials: dict[str, any]**,Provider层的credentials会直接被传递到这一层,不需要再单独定义。 + +## 下一步 + +### [增加新的供应商配置 👈🏻](./docs/zh_Hans/provider_scale_out.md) +当添加后,这里将会出现一个新的供应商 + +![Alt text](docs/zh_Hans/images/index/image-1.png) + +### [为已存在的供应商新增模型 👈🏻](./docs/zh_Hans/provider_scale_out.md#增加模型) +当添加后,对应供应商的模型列表中将会出现一个新的预定义模型供用户选择,如GPT-3.5 GPT-4 ChatGLM3-6b等,而对于支持自定义模型的供应商,则不需要新增模型。 + +![Alt text](docs/zh_Hans/images/index/image-2.png) + +### [接口的具体实现 👈🏻](./docs/zh_Hans/interfaces.md) +你可以在这里找到你想要查看的接口的具体实现,以及接口的参数和返回值的具体含义。 \ No newline at end of file diff --git a/api/core/model_providers/models/reranking/__init__.py b/api/core/model_runtime/__init__.py similarity index 100% rename from api/core/model_providers/models/reranking/__init__.py rename to api/core/model_runtime/__init__.py diff --git a/api/core/model_providers/models/speech2text/__init__.py b/api/core/model_runtime/callbacks/__init__.py similarity index 100% rename from api/core/model_providers/models/speech2text/__init__.py rename to api/core/model_runtime/callbacks/__init__.py diff --git a/api/core/model_runtime/callbacks/base_callback.py b/api/core/model_runtime/callbacks/base_callback.py new file mode 100644 index 00000000000000..144b779540fc4a --- /dev/null +++ b/api/core/model_runtime/callbacks/base_callback.py @@ -0,0 +1,113 @@ +from abc import ABC +from typing import Optional, List + +from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk +from core.model_runtime.entities.message_entities import PromptMessageTool, PromptMessage +from core.model_runtime.model_providers.__base.ai_model import AIModel + +_TEXT_COLOR_MAPPING = { + "blue": "36;1", + "yellow": "33;1", + "pink": "38;5;200", + "green": "32;1", + "red": "31;1", +} + + +class Callback(ABC): + """ + Base class for callbacks. + Only for LLM. + """ + raise_error: bool = False + + def on_before_invoke(self, llm_instance: AIModel, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + Before invoke callback + + :param llm_instance: LLM instance + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + raise NotImplementedError() + + def on_new_chunk(self, llm_instance: AIModel, chunk: LLMResultChunk, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None): + """ + On new chunk callback + + :param llm_instance: LLM instance + :param chunk: chunk + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + raise NotImplementedError() + + def on_after_invoke(self, llm_instance: AIModel, result: LLMResult, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + After invoke callback + + :param llm_instance: LLM instance + :param result: result + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + raise NotImplementedError() + + def on_invoke_error(self, llm_instance: AIModel, ex: Exception, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + Invoke error callback + + :param llm_instance: LLM instance + :param ex: exception + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + raise NotImplementedError() + + def print_text( + self, text: str, color: Optional[str] = None, end: str = "" + ) -> None: + """Print text with highlighting and no end characters.""" + text_to_print = self._get_colored_text(text, color) if color else text + print(text_to_print, end=end) + + def _get_colored_text(self, text: str, color: str) -> str: + """Get colored text.""" + color_str = _TEXT_COLOR_MAPPING[color] + return f"\u001b[{color_str}m\033[1;3m{text}\u001b[0m" diff --git a/api/core/model_runtime/callbacks/logging_callback.py b/api/core/model_runtime/callbacks/logging_callback.py new file mode 100644 index 00000000000000..4bd86e81dc4023 --- /dev/null +++ b/api/core/model_runtime/callbacks/logging_callback.py @@ -0,0 +1,133 @@ +import json +import logging +import sys +from typing import Optional, List + +from core.model_runtime.callbacks.base_callback import Callback +from core.model_runtime.entities.llm_entities import LLMResultChunk, LLMResult +from core.model_runtime.entities.message_entities import PromptMessageTool, PromptMessage +from core.model_runtime.model_providers.__base.ai_model import AIModel + +logger = logging.getLogger(__name__) + +class LoggingCallback(Callback): + def on_before_invoke(self, llm_instance: AIModel, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + Before invoke callback + + :param llm_instance: LLM instance + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + self.print_text("\n[on_llm_before_invoke]\n", color='blue') + self.print_text(f"Model: {model}\n", color='blue') + self.print_text(f"Parameters:\n", color='blue') + for key, value in model_parameters.items(): + self.print_text(f"\t{key}: {value}\n", color='blue') + + if stop: + self.print_text(f"\tstop: {stop}\n", color='blue') + + if tools: + self.print_text(f"\tTools:\n", color='blue') + for tool in tools: + self.print_text(f"\t\t{tool.name}\n", color='blue') + + self.print_text(f"Stream: {stream}\n", color='blue') + + if user: + self.print_text(f"User: {user}\n", color='blue') + + self.print_text(f"Prompt messages:\n", color='blue') + for prompt_message in prompt_messages: + if prompt_message.name: + self.print_text(f"\tname: {prompt_message.name}\n", color='blue') + + self.print_text(f"\trole: {prompt_message.role.value}\n", color='blue') + self.print_text(f"\tcontent: {prompt_message.content}\n", color='blue') + + if stream: + self.print_text("\n[on_llm_new_chunk]") + + def on_new_chunk(self, llm_instance: AIModel, chunk: LLMResultChunk, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None): + """ + On new chunk callback + + :param llm_instance: LLM instance + :param chunk: chunk + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + sys.stdout.write(chunk.delta.message.content) + sys.stdout.flush() + + def on_after_invoke(self, llm_instance: AIModel, result: LLMResult, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + After invoke callback + + :param llm_instance: LLM instance + :param result: result + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + self.print_text("\n[on_llm_after_invoke]\n", color='yellow') + self.print_text(f"Content: {result.message.content}\n", color='yellow') + + if result.message.tool_calls: + self.print_text(f"Tool calls:\n", color='yellow') + for tool_call in result.message.tool_calls: + self.print_text(f"\t{tool_call.id}\n", color='yellow') + self.print_text(f"\t{tool_call.function.name}\n", color='yellow') + self.print_text(f"\t{json.dumps(tool_call.function.arguments)}\n", color='yellow') + + self.print_text(f"Model: {result.model}\n", color='yellow') + self.print_text(f"Usage: {result.usage}\n", color='yellow') + self.print_text(f"System Fingerprint: {result.system_fingerprint}\n", color='yellow') + + def on_invoke_error(self, llm_instance: AIModel, ex: Exception, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) -> None: + """ + Invoke error callback + + :param llm_instance: LLM instance + :param ex: exception + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + self.print_text("\n[on_llm_invoke_error]\n", color='red') + logger.exception(ex) diff --git a/api/core/model_runtime/docs/en_US/images/index/image-20231210143654461.png b/api/core/model_runtime/docs/en_US/images/index/image-20231210143654461.png new file mode 100644 index 00000000000000..2e234f6c21807e Binary files /dev/null and b/api/core/model_runtime/docs/en_US/images/index/image-20231210143654461.png differ diff --git a/api/core/model_runtime/docs/en_US/images/index/image-20231210144229650.png b/api/core/model_runtime/docs/en_US/images/index/image-20231210144229650.png new file mode 100644 index 00000000000000..742c1ba8088e45 Binary files /dev/null and b/api/core/model_runtime/docs/en_US/images/index/image-20231210144229650.png differ diff --git a/api/core/model_runtime/docs/en_US/images/index/image-20231210144814617.png b/api/core/model_runtime/docs/en_US/images/index/image-20231210144814617.png new file mode 100644 index 00000000000000..b28aba83c9beb9 Binary files /dev/null and b/api/core/model_runtime/docs/en_US/images/index/image-20231210144814617.png differ diff --git a/api/core/model_runtime/docs/en_US/images/index/image-20231210151548521.png b/api/core/model_runtime/docs/en_US/images/index/image-20231210151548521.png new file mode 100644 index 00000000000000..0d88bf4bda84fd Binary files /dev/null and b/api/core/model_runtime/docs/en_US/images/index/image-20231210151548521.png differ diff --git a/api/core/model_runtime/docs/en_US/images/index/image-20231210151628992.png b/api/core/model_runtime/docs/en_US/images/index/image-20231210151628992.png new file mode 100644 index 00000000000000..a07aaebd2fa3ab Binary files /dev/null and b/api/core/model_runtime/docs/en_US/images/index/image-20231210151628992.png differ diff --git a/api/core/model_runtime/docs/en_US/images/index/image-20231210165243632.png b/api/core/model_runtime/docs/en_US/images/index/image-20231210165243632.png new file mode 100644 index 00000000000000..18ec605e83f783 Binary files /dev/null and b/api/core/model_runtime/docs/en_US/images/index/image-20231210165243632.png differ diff --git a/api/core/model_runtime/docs/en_US/interfaces.md b/api/core/model_runtime/docs/en_US/interfaces.md new file mode 100644 index 00000000000000..3f6463a4ef2d63 --- /dev/null +++ b/api/core/model_runtime/docs/en_US/interfaces.md @@ -0,0 +1,668 @@ +# Interface Methods + +This section describes the interface methods and parameter explanations that need to be implemented by providers and various model types. + +## Provider + +Inherit the `__base.model_provider.ModelProvider` base class and implement the following interfaces: + +```python +def validate_provider_credentials(self, credentials: dict) -> None: + """ + Validate provider credentials + You can choose any validate_credentials method of model type or implement validate method by yourself, + such as: get model list api + + if validate failed, raise exception + + :param credentials: provider credentials, credentials form defined in `provider_credential_schema`. + """ +``` + +- `credentials` (object) Credential information + + The parameters of credential information are defined by the `provider_credential_schema` in the provider's YAML configuration file. Inputs such as `api_key` are included. + +If verification fails, throw the `errors.validate.CredentialsValidateFailedError` error. + +## Model + +Models are divided into 5 different types, each inheriting from different base classes and requiring the implementation of different methods. + +All models need to uniformly implement the following 2 methods: + +- Model Credential Verification + + Similar to provider credential verification, this step involves verification for an individual model. + + + ```python + def validate_credentials(self, model: str, credentials: dict) -> None: + """ + Validate model credentials + + :param model: model name + :param credentials: model credentials + :return: + """ + ``` + + Parameters: + + - `model` (string) Model name + + - `credentials` (object) Credential information + + The parameters of credential information are defined by either the `provider_credential_schema` or `model_credential_schema` in the provider's YAML configuration file. Inputs such as `api_key` are included. + + If verification fails, throw the `errors.validate.CredentialsValidateFailedError` error. + +- Invocation Error Mapping Table + + When there is an exception in model invocation, it needs to be mapped to the `InvokeError` type specified by Runtime. This facilitates Dify's ability to handle different errors with appropriate follow-up actions. + + Runtime Errors: + + - `InvokeConnectionError` Invocation connection error + - `InvokeServerUnavailableError` Invocation service provider unavailable + - `InvokeRateLimitError` Invocation reached rate limit + - `InvokeAuthorizationError` Invocation authorization failure + - `InvokeBadRequestError` Invocation parameter error + + ```python + @property + def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: + """ + Map model invoke error to unified error + The key is the error type thrown to the caller + The value is the error type thrown by the model, + which needs to be converted into a unified error type for the caller. + + :return: Invoke error mapping + """ + ``` + +​ You can refer to OpenAI's `_invoke_error_mapping` for an example. + +### LLM + +Inherit the `__base.large_language_model.LargeLanguageModel` base class and implement the following interfaces: + +- LLM Invocation + + Implement the core method for LLM invocation, which can support both streaming and synchronous returns. + + + ```python + def _invoke(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) \ + -> Union[LLMResult, Generator]: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :return: full response or stream response chunk generator result + """ + ``` + + - Parameters: + + - `model` (string) Model name + + - `credentials` (object) Credential information + + The parameters of credential information are defined by either the `provider_credential_schema` or `model_credential_schema` in the provider's YAML configuration file. Inputs such as `api_key` are included. + + - `prompt_messages` (array[[PromptMessage](#PromptMessage)]) List of prompts + + If the model is of the `Completion` type, the list only needs to include one [UserPromptMessage](#UserPromptMessage) element; + + If the model is of the `Chat` type, it requires a list of elements such as [SystemPromptMessage](#SystemPromptMessage), [UserPromptMessage](#UserPromptMessage), [AssistantPromptMessage](#AssistantPromptMessage), [ToolPromptMessage](#ToolPromptMessage) depending on the message. + + - `model_parameters` (object) Model parameters + + The model parameters are defined by the `parameter_rules` in the model's YAML configuration. + + - `tools` (array[[PromptMessageTool](#PromptMessageTool)]) [optional] List of tools, equivalent to the `function` in `function calling`. + + That is, the tool list for tool calling. + + - `stop` (array[string]) [optional] Stop sequences + + The model output will stop before the string defined by the stop sequence. + + - `stream` (bool) Whether to output in a streaming manner, default is True + + Streaming output returns Generator[[LLMResultChunk](#LLMResultChunk)], non-streaming output returns [LLMResult](#LLMResult). + + - `user` (string) [optional] Unique identifier of the user + + This can help the provider monitor and detect abusive behavior. + + - Returns + + Streaming output returns Generator[[LLMResultChunk](#LLMResultChunk)], non-streaming output returns [LLMResult](#LLMResult). + +- Pre-calculating Input Tokens + + If the model does not provide a pre-calculated tokens interface, you can directly return 0. + + ```python + def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], + tools: Optional[list[PromptMessageTool]] = None) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param tools: tools for tool calling + :return: + """ + ``` + + For parameter explanations, refer to the above section on `LLM Invocation`. + +- Fetch Custom Model Schema [Optional] + + ```python + def get_customizable_model_schema(self, model: str, credentials: dict) -> Optional[AIModelEntity]: + """ + Get customizable model schema + + :param model: model name + :param credentials: model credentials + :return: model schema + """ + ``` + + When the provider supports adding custom LLMs, this method can be implemented to allow custom models to fetch model schema. The default return null. + + +### TextEmbedding + +Inherit the `__base.text_embedding_model.TextEmbeddingModel` base class and implement the following interfaces: + +- Embedding Invocation + + ```python + def _invoke(self, model: str, credentials: dict, + texts: list[str], user: Optional[str] = None) \ + -> TextEmbeddingResult: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param texts: texts to embed + :param user: unique user id + :return: embeddings result + """ + ``` + + - Parameters: + + - `model` (string) Model name + + - `credentials` (object) Credential information + + The parameters of credential information are defined by either the `provider_credential_schema` or `model_credential_schema` in the provider's YAML configuration file. Inputs such as `api_key` are included. + + - `texts` (array[string]) List of texts, capable of batch processing + + - `user` (string) [optional] Unique identifier of the user + + This can help the provider monitor and detect abusive behavior. + + - Returns: + + [TextEmbeddingResult](#TextEmbeddingResult) entity. + +- Pre-calculating Tokens + + ```python + def get_num_tokens(self, model: str, credentials: dict, texts: list[str]) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param texts: texts to embed + :return: + """ + ``` + + For parameter explanations, refer to the above section on `Embedding Invocation`. + +### Rerank + +Inherit the `__base.rerank_model.RerankModel` base class and implement the following interfaces: + +- Rerank Invocation + + ```python + def _invoke(self, model: str, credentials: dict, + query: str, docs: list[str], score_threshold: Optional[float] = None, top_n: Optional[int] = None, + user: Optional[str] = None) \ + -> RerankResult: + """ + Invoke rerank model + + :param model: model name + :param credentials: model credentials + :param query: search query + :param docs: docs for reranking + :param score_threshold: score threshold + :param top_n: top n + :param user: unique user id + :return: rerank result + """ + ``` + + - Parameters: + + - `model` (string) Model name + + - `credentials` (object) Credential information + + The parameters of credential information are defined by either the `provider_credential_schema` or `model_credential_schema` in the provider's YAML configuration file. Inputs such as `api_key` are included. + + - `query` (string) Query request content + + - `docs` (array[string]) List of segments to be reranked + + - `score_threshold` (float) [optional] Score threshold + + - `top_n` (int) [optional] Select the top n segments + + - `user` (string) [optional] Unique identifier of the user + + This can help the provider monitor and detect abusive behavior. + + - Returns: + + [RerankResult](#RerankResult) entity. + +### Speech2text + +Inherit the `__base.speech2text_model.Speech2TextModel` base class and implement the following interfaces: + +- Invoke Invocation + + ```python + def _invoke(self, model: str, credentials: dict, + file: IO[bytes], user: Optional[str] = None) \ + -> str: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param file: audio file + :param user: unique user id + :return: text for given audio file + """ + ``` + + - Parameters: + + - `model` (string) Model name + + - `credentials` (object) Credential information + + The parameters of credential information are defined by either the `provider_credential_schema` or `model_credential_schema` in the provider's YAML configuration file. Inputs such as `api_key` are included. + + - `file` (File) File stream + + - `user` (string) [optional] Unique identifier of the user + + This can help the provider monitor and detect abusive behavior. + + - Returns: + + The string after speech-to-text conversion. + +### Moderation + +Inherit the `__base.moderation_model.ModerationModel` base class and implement the following interfaces: + +- Invoke Invocation + + ```python + def _invoke(self, model: str, credentials: dict, + text: str, user: Optional[str] = None) \ + -> bool: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param text: text to moderate + :param user: unique user id + :return: false if text is safe, true otherwise + """ + ``` + + - Parameters: + + - `model` (string) Model name + + - `credentials` (object) Credential information + + The parameters of credential information are defined by either the `provider_credential_schema` or `model_credential_schema` in the provider's YAML configuration file. Inputs such as `api_key` are included. + + - `text` (string) Text content + + - `user` (string) [optional] Unique identifier of the user + + This can help the provider monitor and detect abusive behavior. + + - Returns: + + False indicates that the input text is safe, True indicates otherwise. + + + +## Entities + +### PromptMessageRole + +Message role + +```python +class PromptMessageRole(Enum): + """ + Enum class for prompt message. + """ + SYSTEM = "system" + USER = "user" + ASSISTANT = "assistant" + TOOL = "tool" +``` + +### PromptMessageContentType + +Message content types, divided into text and image. + +```python +class PromptMessageContentType(Enum): + """ + Enum class for prompt message content type. + """ + TEXT = 'text' + IMAGE = 'image' +``` + +### PromptMessageContent + +Message content base class, used only for parameter declaration and cannot be initialized. + +```python +class PromptMessageContent(BaseModel): + """ + Model class for prompt message content. + """ + type: PromptMessageContentType + data: str +``` + +Currently, two types are supported: text and image. It's possible to simultaneously input text and multiple images. + +You need to initialize `TextPromptMessageContent` and `ImagePromptMessageContent` separately for input. + +### TextPromptMessageContent + +```python +class TextPromptMessageContent(PromptMessageContent): + """ + Model class for text prompt message content. + """ + type: PromptMessageContentType = PromptMessageContentType.TEXT +``` + +If inputting a combination of text and images, the text needs to be constructed into this entity as part of the `content` list. + +### ImagePromptMessageContent + +```python +class ImagePromptMessageContent(PromptMessageContent): + """ + Model class for image prompt message content. + """ + class DETAIL(Enum): + LOW = 'low' + HIGH = 'high' + + type: PromptMessageContentType = PromptMessageContentType.IMAGE + detail: DETAIL = DETAIL.LOW # Resolution +``` + +If inputting a combination of text and images, the images need to be constructed into this entity as part of the `content` list. + +`data` can be either a `url` or a `base64` encoded string of the image. + +### PromptMessage + +The base class for all Role message bodies, used only for parameter declaration and cannot be initialized. + +```python +class PromptMessage(ABC, BaseModel): + """ + Model class for prompt message. + """ + role: PromptMessageRole + content: Optional[str | list[PromptMessageContent]] = None # Supports two types: string and content list. The content list is designed to meet the needs of multimodal inputs. For more details, see the PromptMessageContent explanation. + name: Optional[str] = None +``` + +### UserPromptMessage + +UserMessage message body, representing a user's message. + +```python +class UserPromptMessage(PromptMessage): + """ + Model class for user prompt message. + """ + role: PromptMessageRole = PromptMessageRole.USER +``` + +### AssistantPromptMessage + +Represents a message returned by the model, typically used for `few-shots` or inputting chat history. + +```python +class AssistantPromptMessage(PromptMessage): + """ + Model class for assistant prompt message. + """ + class ToolCall(BaseModel): + """ + Model class for assistant prompt message tool call. + """ + class ToolCallFunction(BaseModel): + """ + Model class for assistant prompt message tool call function. + """ + name: str # tool name + arguments: str # tool arguments + + id: str # Tool ID, effective only in OpenAI tool calls. It's the unique ID for tool invocation and the same tool can be called multiple times. + type: str # default: function + function: ToolCallFunction # tool call information + + role: PromptMessageRole = PromptMessageRole.ASSISTANT + tool_calls: list[ToolCall] = [] # The result of tool invocation in response from the model (returned only when tools are input and the model deems it necessary to invoke a tool). +``` + +Where `tool_calls` are the list of `tool calls` returned by the model after invoking the model with the `tools` input. + +### SystemPromptMessage + +Represents system messages, usually used for setting system commands given to the model. + +```python +class SystemPromptMessage(PromptMessage): + """ + Model class for system prompt message. + """ + role: PromptMessageRole = PromptMessageRole.SYSTEM +``` + +### ToolPromptMessage + +Represents tool messages, used for conveying the results of a tool execution to the model for the next step of processing. + +```python +class ToolPromptMessage(PromptMessage): + """ + Model class for tool prompt message. + """ + role: PromptMessageRole = PromptMessageRole.TOOL + tool_call_id: str # Tool invocation ID. If OpenAI tool call is not supported, the name of the tool can also be inputted. +``` + +The base class's `content` takes in the results of tool execution. + +### PromptMessageTool + +```python +class PromptMessageTool(BaseModel): + """ + Model class for prompt message tool. + """ + name: str + description: str + parameters: dict +``` + +--- + +### LLMResult + +```python +class LLMResult(BaseModel): + """ + Model class for llm result. + """ + model: str # Actual used modele + prompt_messages: list[PromptMessage] # prompt messages + message: AssistantPromptMessage # response message + usage: LLMUsage # usage info + system_fingerprint: Optional[str] = None # request fingerprint, refer to OpenAI definition +``` + +### LLMResultChunkDelta + +In streaming returns, each iteration contains the `delta` entity. + +```python +class LLMResultChunkDelta(BaseModel): + """ + Model class for llm result chunk delta. + """ + index: int + message: AssistantPromptMessage # response message + usage: Optional[LLMUsage] = None # usage info + finish_reason: Optional[str] = None # finish reason, only the last one returns +``` + +### LLMResultChunk + +Each iteration entity in streaming returns. + +```python +class LLMResultChunk(BaseModel): + """ + Model class for llm result chunk. + """ + model: str # Actual used modele + prompt_messages: list[PromptMessage] # prompt messages + system_fingerprint: Optional[str] = None # request fingerprint, refer to OpenAI definition + delta: LLMResultChunkDelta +``` + +### LLMUsage + +```python +class LLMUsage(ModelUsage): + """ + Model class for LLM usage. + """ + prompt_tokens: int # Tokens used for prompt + prompt_unit_price: Decimal # Unit price for prompt + prompt_price_unit: Decimal # Price unit for prompt, i.e., the unit price based on how many tokens + prompt_price: Decimal # Cost for prompt + completion_tokens: int # Tokens used for response + completion_unit_price: Decimal # Unit price for response + completion_price_unit: Decimal # Price unit for response, i.e., the unit price based on how many tokens + completion_price: Decimal # Cost for response + total_tokens: int # Total number of tokens used + total_price: Decimal # Total cost + currency: str # Currency unit + latency: float # Request latency (s) +``` + +--- + +### TextEmbeddingResult + +```python +class TextEmbeddingResult(BaseModel): + """ + Model class for text embedding result. + """ + model: str # Actual model used + embeddings: list[list[float]] # List of embedding vectors, corresponding to the input texts list + usage: EmbeddingUsage # Usage information +``` + +### EmbeddingUsage + +```python +class EmbeddingUsage(ModelUsage): + """ + Model class for embedding usage. + """ + tokens: int # Number of tokens used + total_tokens: int # Total number of tokens used + unit_price: Decimal # Unit price + price_unit: Decimal # Price unit, i.e., the unit price based on how many tokens + total_price: Decimal # Total cost + currency: str # Currency unit + latency: float # Request latency (s) +``` + +--- + +### RerankResult + +```python +class RerankResult(BaseModel): + """ + Model class for rerank result. + """ + model: str # Actual model used + docs: list[RerankDocument] # Reranked document list +``` + +### RerankDocument + +```python +class RerankDocument(BaseModel): + """ + Model class for rerank document. + """ + index: int # original index + text: str + score: float +``` diff --git a/api/core/model_runtime/docs/en_US/provider_scale_out.md b/api/core/model_runtime/docs/en_US/provider_scale_out.md new file mode 100644 index 00000000000000..1d012c5a29660d --- /dev/null +++ b/api/core/model_runtime/docs/en_US/provider_scale_out.md @@ -0,0 +1,264 @@ +## Adding a New Provider + +Providers support three types of model configuration methods: + +- `predefined-model` Predefined model + + This indicates that users only need to configure the unified provider credentials to use the predefined models under the provider. + +- `customizable-model` Customizable model + + Users need to add credential configurations for each model. + +- `fetch-from-remote` Fetch from remote + + This is consistent with the `predefined-model` configuration method. Only unified provider credentials need to be configured, and models are obtained from the provider through credential information. + +These three configuration methods **can coexist**, meaning a provider can support `predefined-model` + `customizable-model` or `predefined-model` + `fetch-from-remote`, etc. In other words, configuring the unified provider credentials allows the use of predefined and remotely fetched models, and if new models are added, they can be used in addition to the custom models. + +## Getting Started + +Adding a new provider starts with determining the English identifier of the provider, such as `anthropic`, and using this identifier to create a `module` in `model_providers`. + +Under this `module`, we first need to prepare the provider's YAML configuration. + +### Preparing Provider YAML + +Here, using `Anthropic` as an example, we preset the provider's basic information, supported model types, configuration methods, and credential rules. + +```YAML +provider: anthropic # Provider identifier +label: # Provider display name, can be set in en_US English and zh_Hans Chinese, zh_Hans will default to en_US if not set. + en_US: Anthropic +icon_small: # Small provider icon, stored in the _assets directory under the corresponding provider implementation directory, same language strategy as label + en_US: icon_s_en.png +icon_large: # Large provider icon, stored in the _assets directory under the corresponding provider implementation directory, same language strategy as label + en_US: icon_l_en.png +supported_model_types: # Supported model types, Anthropic only supports LLM +- llm +configurate_methods: # Supported configuration methods, Anthropic only supports predefined models +- predefined-model +provider_credential_schema: # Provider credential rules, as Anthropic only supports predefined models, unified provider credential rules need to be defined + credential_form_schemas: # List of credential form items + - variable: anthropic_api_key # Credential parameter variable name + label: # Display name + en_US: API Key + type: secret-input # Form type, here secret-input represents an encrypted information input box, showing masked information when editing. + required: true # Whether required + placeholder: # Placeholder information + zh_Hans: Enter your API Key here + en_US: Enter your API Key + - variable: anthropic_api_url + label: + en_US: API URL + type: text-input # Form type, here text-input represents a text input box + required: false + placeholder: + zh_Hans: Enter your API URL here + en_US: Enter your API URL +``` + +You can also refer to the YAML configuration information under other provider directories in `model_providers`. The complete YAML rules are available at: [Schema](schema.md#Provider). + +### Implementing Provider Code + +Providers need to inherit the `__base.model_provider.ModelProvider` base class and implement the `validate_provider_credentials` method for unified provider credential verification. For reference, see [AnthropicProvider](https://github.com/langgenius/dify-runtime/blob/main/lib/model_providers/anthropic/anthropic.py). +> If the provider is the type of `customizable-model`, there is no need to implement the `validate_provider_credentials` method. + +```python +def validate_provider_credentials(self, credentials: dict) -> None: + """ + Validate provider credentials + You can choose any validate_credentials method of model type or implement validate method by yourself, + such as: get model list api + + if validate failed, raise exception + + :param credentials: provider credentials, credentials form defined in `provider_credential_schema`. + """ +``` + +Of course, you can also preliminarily reserve the implementation of `validate_provider_credentials` and directly reuse it after the model credential verification method is implemented. + +--- + +### Adding Models + +After the provider integration is complete, the next step is to integrate models under the provider. + +First, we need to determine the type of the model to be integrated and create a `module` for the corresponding model type in the provider's directory. + +The currently supported model types are as follows: + +- `llm` Text generation model +- `text_embedding` Text Embedding model +- `rerank` Rerank model +- `speech2text` Speech to text +- `moderation` Moderation + +Continuing with `Anthropic` as an example, since `Anthropic` only supports LLM, we create a `module` named `llm` in `model_providers.anthropic`. + +For predefined models, we first need to create a YAML file named after the model, such as `claude-2.1.yaml`, under the `llm` `module`. + +#### Preparing Model YAML + +```yaml +model: claude-2.1 # Model identifier +# Model display name, can be set in en_US English and zh_Hans Chinese, zh_Hans will default to en_US if not set. +# Alternatively, if the label is not set, use the model identifier content. +label: + en_US: claude-2.1 +model_type: llm # Model type, claude-2.1 is an LLM +features: # Supported features, agent-thought for Agent reasoning, vision for image understanding +- agent-thought +model_properties: # Model properties + mode: chat # LLM mode, complete for text completion model, chat for dialogue model + context_size: 200000 # Maximum supported context size +parameter_rules: # Model invocation parameter rules, only required for LLM +- name: temperature # Invocation parameter variable name + # Default preset with 5 variable content configuration templates: temperature/top_p/max_tokens/presence_penalty/frequency_penalty + # Directly set the template variable name in use_template, which will use the default configuration in entities.defaults.PARAMETER_RULE_TEMPLATE + # If additional configuration parameters are set, they will override the default configuration + use_template: temperature +- name: top_p + use_template: top_p +- name: top_k + label: # Invocation parameter display name + zh_Hans: Sampling quantity + en_US: Top k + type: int # Parameter type, supports float/int/string/boolean + help: # Help information, describing the role of the parameter + zh_Hans: Only sample from the top K options for each subsequent token. + en_US: Only sample from the top K options for each subsequent token. + required: false # Whether required, can be left unset +- name: max_tokens_to_sample + use_template: max_tokens + default: 4096 # Default parameter value + min: 1 # Minimum parameter value, only applicable for float/int + max: 4096 # Maximum parameter value, only applicable for float/int +pricing: # Pricing information + input: '8.00' # Input price, i.e., Prompt price + output: '24.00' # Output price, i.e., returned content price + unit: '0.000001' # Pricing unit, i.e., the above prices are per 100K + currency: USD # Currency +``` + +It is recommended to prepare all model configurations before starting the implementation of the model code. + +Similarly, you can also refer to the YAML configuration information for corresponding model types of other providers in the `model_providers` directory. The complete YAML rules can be found at: [Schema](schema.md#AIModel). + +#### Implementing Model Invocation Code + +Next, you need to create a python file named `llm.py` under the `llm` `module` to write the implementation code. + +In `llm.py`, create an Anthropic LLM class, which we name `AnthropicLargeLanguageModel` (arbitrarily), inheriting the `__base.large_language_model.LargeLanguageModel` base class, and implement the following methods: + +- LLM Invocation + + Implement the core method for LLM invocation, which can support both streaming and synchronous returns. + + ```python + def _invoke(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) \ + -> Union[LLMResult, Generator]: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :return: full response or stream response chunk generator result + """ + ``` + +- Pre-calculating Input Tokens + + If the model does not provide a pre-calculated tokens interface, you can directly return 0. + + ```python + def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], + tools: Optional[list[PromptMessageTool]] = None) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param tools: tools for tool calling + :return: + """ + ``` + +- Model Credential Verification + + Similar to provider credential verification, this step involves verification for an individual model. + + ```python + def validate_credentials(self, model: str, credentials: dict) -> None: + """ + Validate model credentials + + :param model: model name + :param credentials: model credentials + :return: + """ + ``` + +- Invocation Error Mapping Table + + When there is an exception in model invocation, it needs to be mapped to the `InvokeError` type specified by Runtime. This facilitates Dify's ability to handle different errors with appropriate follow-up actions. + + Runtime Errors: + + - `InvokeConnectionError` Invocation connection error + - `InvokeServerUnavailableError` Invocation service provider unavailable + - `InvokeRateLimitError` Invocation reached rate limit + - `InvokeAuthorizationError` Invocation authorization failure + - `InvokeBadRequestError` Invocation parameter error + + ```python + @property + def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: + """ + Map model invoke error to unified error + The key is the error type thrown to the caller + The value is the error type thrown by the model, + which needs to be converted into a unified error type for the caller. + + :return: Invoke error mapping + """ + ``` + +For details on the interface methods, see: [Interfaces](interfaces.md). For specific implementations, refer to: [llm.py](https://github.com/langgenius/dify-runtime/blob/main/lib/model_providers/anthropic/llm/llm.py). + +### Testing + +To ensure the availability of integrated providers/models, each method written needs corresponding integration test code in the `tests` directory. + +Continuing with `Anthropic` as an example: + +Before writing test code, you need to first add the necessary credential environment variables for the test provider in `.env.example`, such as: `ANTHROPIC_API_KEY`. + +Before execution, copy `.env.example` to `.env` and then execute. + +#### Writing Test Code + +Create a `module` with the same name as the provider in the `tests` directory: `anthropic`, and continue to create `test_provider.py` and test py files for the corresponding model types within this module, as shown below: + +```shell +. +├── __init__.py +├── anthropic +│   ├── __init__.py +│   ├── test_llm.py # LLM Testing +│   └── test_provider.py # Provider Testing +``` + +Write test code for all the various cases implemented above and submit the code after passing the tests. diff --git a/api/core/model_runtime/docs/en_US/schema.md b/api/core/model_runtime/docs/en_US/schema.md new file mode 100644 index 00000000000000..1dfc93c3560f87 --- /dev/null +++ b/api/core/model_runtime/docs/en_US/schema.md @@ -0,0 +1,194 @@ +# Configuration Rules + +- Provider rules are based on the [Provider](#Provider) entity. +- Model rules are based on the [AIModelEntity](#AIModelEntity) entity. + +> All entities mentioned below are based on `Pydantic BaseModel` and can be found in the `entities` module. + +### Provider + +- `provider` (string) Provider identifier, e.g., `openai` +- `label` (object) Provider display name, i18n, with `en_US` English and `zh_Hans` Chinese language settings + - `zh_Hans` (string) [optional] Chinese label name, if `zh_Hans` is not set, `en_US` will be used by default. + - `en_US` (string) English label name +- `description` (object) Provider description, i18n + - `zh_Hans` (string) [optional] Chinese description + - `en_US` (string) English description +- `icon_small` (string) [optional] Small provider ICON, stored in the `_assets` directory under the corresponding provider implementation directory, with the same language strategy as `label` + - `zh_Hans` (string) Chinese ICON + - `en_US` (string) English ICON +- `icon_large` (string) [optional] Large provider ICON, stored in the `_assets` directory under the corresponding provider implementation directory, with the same language strategy as `label` + - `zh_Hans` (string) Chinese ICON + - `en_US` (string) English ICON +- `background` (string) [optional] Background color value, e.g., #FFFFFF, if empty, the default frontend color value will be displayed. +- `help` (object) [optional] help information + - `title` (object) help title, i18n + - `zh_Hans` (string) [optional] Chinese title + - `en_US` (string) English title + - `url` (object) help link, i18n + - `zh_Hans` (string) [optional] Chinese link + - `en_US` (string) English link +- `supported_model_types` (array[[ModelType](#ModelType)]) Supported model types +- `configurate_methods` (array[[ConfigurateMethod](#ConfigurateMethod)]) Configuration methods +- `provider_credential_schema` ([ProviderCredentialSchema](#ProviderCredentialSchema)) Provider credential specification +- `model_credential_schema` ([ModelCredentialSchema](#ModelCredentialSchema)) Model credential specification + +### AIModelEntity + +- `model` (string) Model identifier, e.g., `gpt-3.5-turbo` +- `label` (object) [optional] Model display name, i18n, with `en_US` English and `zh_Hans` Chinese language settings + - `zh_Hans` (string) [optional] Chinese label name + - `en_US` (string) English label name +- `model_type` ([ModelType](#ModelType)) Model type +- `features` (array[[ModelFeature](#ModelFeature)]) [optional] Supported feature list +- `model_properties` (object) Model properties + - `mode` ([LLMMode](#LLMMode)) Mode (available for model type `llm`) + - `context_size` (int) Context size (available for model types `llm`, `text-embedding`) + - `max_chunks` (int) Maximum number of chunks (available for model types `text-embedding`, `moderation`) + - `file_upload_limit` (int) Maximum file upload limit, in MB (available for model type `speech2text`) + - `supported_file_extensions` (string) Supported file extension formats, e.g., mp3, mp4 (available for model type `speech2text`) + - `max_characters_per_chunk` (int) Maximum characters per chunk (available for model type `moderation`) +- `parameter_rules` (array[[ParameterRule](#ParameterRule)]) [optional] Model invocation parameter rules +- `pricing` ([PriceConfig](#PriceConfig)) [optional] Pricing information +- `deprecated` (bool) Whether deprecated. If deprecated, the model will no longer be displayed in the list, but those already configured can continue to be used. Default False. + +### ModelType + +- `llm` Text generation model +- `text-embedding` Text Embedding model +- `rerank` Rerank model +- `speech2text` Speech to text +- `moderation` Moderation + +### ConfigurateMethod + +- `predefined-model` Predefined model + + Indicates that users can use the predefined models under the provider by configuring the unified provider credentials. +- `customizable-model` Customizable model + + Users need to add credential configuration for each model. + +- `fetch-from-remote` Fetch from remote + + Consistent with the `predefined-model` configuration method, only unified provider credentials need to be configured, and models are obtained from the provider through credential information. + +### ModelFeature + +- `agent-thought` Agent reasoning, generally over 70B with thought chain capability. +- `vision` Vision, i.e., image understanding. + +### FetchFrom + +- `predefined-model` Predefined model +- `fetch-from-remote` Remote model + +### LLMMode + +- `complete` Text completion +- `chat` Dialogue + +### ParameterRule + +- `name` (string) Actual model invocation parameter name +- `use_template` (string) [optional] Using template + + By default, 5 variable content configuration templates are preset: + + - `temperature` + - `top_p` + - `frequency_penalty` + - `presence_penalty` + - `max_tokens` + + In use_template, you can directly set the template variable name, which will use the default configuration in entities.defaults.PARAMETER_RULE_TEMPLATE + No need to set any parameters other than `name` and `use_template`. If additional configuration parameters are set, they will override the default configuration. + Refer to `openai/llm/gpt-3.5-turbo.yaml`. + +- `label` (object) [optional] Label, i18n + + - `zh_Hans`(string) [optional] Chinese label name + - `en_US` (string) English label name + +- `type`(string) [optional] Parameter type + + - `int` Integer + - `float` Float + - `string` String + - `boolean` Boolean + +- `help` (string) [optional] Help information + + - `zh_Hans` (string) [optional] Chinese help information + - `en_US` (string) English help information + +- `required` (bool) Required, default False. + +- `default`(int/float/string/bool) [optional] Default value + +- `min`(int/float) [optional] Minimum value, applicable only to numeric types + +- `max`(int/float) [optional] Maximum value, applicable only to numeric types + +- `precision`(int) [optional] Precision, number of decimal places to keep, applicable only to numeric types + +- `options` (array[string]) [optional] Dropdown option values, applicable only when `type` is `string`, if not set or null, option values are not restricted + +### PriceConfig + +- `input` (float) Input price, i.e., Prompt price +- `output` (float) Output price, i.e., returned content price +- `unit` (float) Pricing unit, e.g., per 100K price is `0.000001` +- `currency` (string) Currency unit + +### ProviderCredentialSchema + +- `credential_form_schemas` (array[[CredentialFormSchema](#CredentialFormSchema)]) Credential form standard + +### ModelCredentialSchema + +- `model` (object) Model identifier, variable name defaults to `model` + - `label` (object) Model form item display name + - `en_US` (string) English + - `zh_Hans`(string) [optional] Chinese + - `placeholder` (object) Model prompt content + - `en_US`(string) English + - `zh_Hans`(string) [optional] Chinese +- `credential_form_schemas` (array[[CredentialFormSchema](#CredentialFormSchema)]) Credential form standard + +### CredentialFormSchema + +- `variable` (string) Form item variable name +- `label` (object) Form item label name + - `en_US`(string) English + - `zh_Hans` (string) [optional] Chinese +- `type` ([FormType](#FormType)) Form item type +- `required` (bool) Whether required +- `default`(string) Default value +- `options` (array[[FormOption](#FormOption)]) Specific property of form items of type `select` or `radio`, defining dropdown content +- `placeholder`(object) Specific property of form items of type `text-input`, placeholder content + - `en_US`(string) English + - `zh_Hans` (string) [optional] Chinese +- `max_length` (int) Specific property of form items of type `text-input`, defining maximum input length, 0 for no limit. +- `show_on` (array[[FormShowOnObject](#FormShowOnObject)]) Displayed when other form item values meet certain conditions, displayed always if empty. + +### FormType + +- `text-input` Text input component +- `secret-input` Password input component +- `select` Single-choice dropdown +- `radio` Radio component +- `switch` Switch component, only supports `true` and `false` values + +### FormOption + +- `label` (object) Label + - `en_US`(string) English + - `zh_Hans`(string) [optional] Chinese +- `value` (string) Dropdown option value +- `show_on` (array[[FormShowOnObject](#FormShowOnObject)]) Displayed when other form item values meet certain conditions, displayed always if empty. + +### FormShowOnObject + +- `variable` (string) Variable name of other form items +- `value` (string) Variable value of other form items diff --git a/api/core/model_runtime/docs/zh_Hans/customizable_model_scale_out.md b/api/core/model_runtime/docs/zh_Hans/customizable_model_scale_out.md new file mode 100644 index 00000000000000..daab6cedb9fe9d --- /dev/null +++ b/api/core/model_runtime/docs/zh_Hans/customizable_model_scale_out.md @@ -0,0 +1,296 @@ +## 自定义预定义模型接入 + +### 介绍 + +供应商集成完成后,接下来为供应商下模型的接入,为了帮助理解整个接入过程,我们以`Xinference`为例,逐步完成一个完整的供应商接入。 + +需要注意的是,对于自定义模型,每一个模型的接入都需要填写一个完整的供应商凭据。 + +而不同于预定义模型,自定义供应商接入时永远会拥有如下两个参数,不需要在供应商yaml中定义。 + +![Alt text](images/index/image-3.png) + + +在前文中,我们已经知道了供应商无需实现`validate_provider_credential`,Runtime会自行根据用户在此选择的模型类型和模型名称调用对应的模型层的`validate_credentials`来进行验证。 + +### 编写供应商yaml + +我们首先要确定,接入的这个供应商支持哪些类型的模型。 + +当前支持模型类型如下: + +- `llm` 文本生成模型 +- `text_embedding` 文本 Embedding 模型 +- `rerank` Rerank 模型 +- `speech2text` 语音转文字 +- `moderation` 审查 + +`Xinference`支持`LLM`和`Text Embedding`和Rerank,那么我们开始编写`xinference.yaml`。 + +```yaml +provider: xinference #确定供应商标识 +label: # 供应商展示名称,可设置 en_US 英文、zh_Hans 中文两种语言,zh_Hans 不设置将默认使用 en_US。 + en_US: Xorbots Inference +icon_small: # 小图标,可以参考其他供应商的图标,存储在对应供应商实现目录下的 _assets 目录,中英文策略同 label + en_US: icon_s_en.svg +icon_large: # 大图标 + en_US: icon_l_en.svg +help: # 帮助 + title: + en_US: How to deploy Xinference + zh_Hans: 如何部署 Xinference + url: + en_US: https://github.com/xorbitsai/inference +supported_model_types: # 支持的模型类型,Xinference同时支持LLM/Text Embedding/Rerank +- llm +- text-embedding +- rerank +configurate_methods: # 因为Xinference为本地部署的供应商,并且没有预定义模型,需要用什么模型需要根据Xinference的文档自己部署,所以这里只支持自定义模型 +- customizable-model +provider_credential_schema: + credential_form_schemas: +``` + +随后,我们需要思考在Xinference中定义一个模型需要哪些凭据 + +- 它支持三种不同的模型,因此,我们需要有`model_type`来指定这个模型的类型,它有三种类型,所以我们这么编写 +```yaml +provider_credential_schema: + credential_form_schemas: + - variable: model_type + type: select + label: + en_US: Model type + zh_Hans: 模型类型 + required: true + options: + - value: text-generation + label: + en_US: Language Model + zh_Hans: 语言模型 + - value: embeddings + label: + en_US: Text Embedding + - value: reranking + label: + en_US: Rerank +``` +- 每一个模型都有自己的名称`model_name`,因此需要在这里定义 +```yaml + - variable: model_name + type: text-input + label: + en_US: Model name + zh_Hans: 模型名称 + required: true + placeholder: + zh_Hans: 填写模型名称 + en_US: Input model name +``` +- 填写Xinference本地部署的地址 +```yaml + - variable: server_url + label: + zh_Hans: 服务器URL + en_US: Server url + type: text-input + required: true + placeholder: + zh_Hans: 在此输入Xinference的服务器地址,如 https://example.com/xxx + en_US: Enter the url of your Xinference, for example https://example.com/xxx +``` +- 每个模型都有唯一的model_uid,因此需要在这里定义 +```yaml + - variable: model_uid + label: + zh_Hans: 模型UID + en_US: Model uid + type: text-input + required: true + placeholder: + zh_Hans: 在此输入您的Model UID + en_US: Enter the model uid +``` +现在,我们就完成了供应商的基础定义。 + +### 编写模型代码 + +然后我们以`llm`类型为例,编写`xinference.llm.llm.py` + +在 `llm.py` 中创建一个 Xinference LLM 类,我们取名为 `XinferenceAILargeLanguageModel`(随意),继承 `__base.large_language_model.LargeLanguageModel` 基类,实现以下几个方法: + +- LLM 调用 + + 实现 LLM 调用的核心方法,可同时支持流式和同步返回。 + + ```python + def _invoke(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) \ + -> Union[LLMResult, Generator]: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :return: full response or stream response chunk generator result + """ + ``` + + 在实现时,需要注意使用两个函数来返回数据,分别用于处理同步返回和流式返回,因为Python会将函数中包含 `yield` 关键字的函数识别为生成器函数,返回的数据类型固定为 `Generator`,因此同步和流式返回需要分别实现,就像下面这样(注意下面例子使用了简化参数,实际实现时需要按照上面的参数列表进行实现): + + ```python + def _invoke(self, stream: bool, **kwargs) \ + -> Union[LLMResult, Generator]: + if stream: + return self._handle_stream_response(**kwargs) + return self._handle_sync_response(**kwargs) + + def _handle_stream_response(self, **kwargs) -> Generator: + for chunk in response: + yield chunk + def _handle_sync_response(self, **kwargs) -> LLMResult: + return LLMResult(**response) + ``` + +- 预计算输入 tokens + + 若模型未提供预计算 tokens 接口,可直接返回 0。 + + ```python + def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], + tools: Optional[list[PromptMessageTool]] = None) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param tools: tools for tool calling + :return: + """ + ``` + + 有时候,也许你不需要直接返回0,所以你可以使用`self._get_num_tokens_by_gpt2(text: str)`来获取预计算的tokens,这个方法位于`AIModel`基类中,它会使用GPT2的Tokenizer进行计算,但是只能作为替代方法,并不完全准确。 + +- 模型凭据校验 + + 与供应商凭据校验类似,这里针对单个模型进行校验。 + + ```python + def validate_credentials(self, model: str, credentials: dict) -> None: + """ + Validate model credentials + + :param model: model name + :param credentials: model credentials + :return: + """ + ``` + +- 模型参数Schema + + 与自定义类型不同,由于没有在yaml文件中定义一个模型支持哪些参数,因此,我们需要动态时间模型参数的Schema。 + + 如Xinference支持`max_tokens` `temperature` `top_p` 这三个模型参数。 + + 但是有的供应商根据不同的模型支持不同的参数,如供应商`OpenLLM`支持`top_k`,但是并不是这个供应商提供的所有模型都支持`top_k`,我们这里举例A模型支持`top_k`,B模型不支持`top_k`,那么我们需要在这里动态生成模型参数的Schema,如下所示: + + ```python + def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity | None: + """ + used to define customizable model schema + """ + rules = [ + ParameterRule( + name='temperature', type=ParameterType.FLOAT, + use_template='temperature', + label=I18nObject( + zh_Hans='温度', en_US='Temperature' + ) + ), + ParameterRule( + name='top_p', type=ParameterType.FLOAT, + use_template='top_p', + label=I18nObject( + zh_Hans='Top P', en_US='Top P' + ) + ), + ParameterRule( + name='max_tokens', type=ParameterType.INT, + use_template='max_tokens', + min=1, + default=512, + label=I18nObject( + zh_Hans='最大生成长度', en_US='Max Tokens' + ) + ) + ] + + # if model is A, add top_k to rules + if model == 'A': + rules.append( + ParameterRule( + name='top_k', type=ParameterType.INT, + use_template='top_k', + min=1, + default=50, + label=I18nObject( + zh_Hans='Top K', en_US='Top K' + ) + ) + ) + + """ + some NOT IMPORTANT code here + """ + + entity = AIModelEntity( + model=model, + label=I18nObject( + en_US=model + ), + fetch_from=FetchFrom.CUSTOMIZABLE_MODEL, + model_type=model_type, + model_properties={ + 'mode': ModelType.LLM, + }, + parameter_rules=rules + ) + + return entity + ``` + +- 调用异常错误映射表 + + 当模型调用异常时需要映射到 Runtime 指定的 `InvokeError` 类型,方便 Dify 针对不同错误做不同后续处理。 + + Runtime Errors: + + - `InvokeConnectionError` 调用连接错误 + - `InvokeServerUnavailableError ` 调用服务方不可用 + - `InvokeRateLimitError ` 调用达到限额 + - `InvokeAuthorizationError` 调用鉴权失败 + - `InvokeBadRequestError ` 调用传参有误 + + ```python + @property + def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: + """ + Map model invoke error to unified error + The key is the error type thrown to the caller + The value is the error type thrown by the model, + which needs to be converted into a unified error type for the caller. + + :return: Invoke error mapping + """ + ``` + +接口方法说明见:[Interfaces](./interfaces.md),具体实现可参考:[llm.py](https://github.com/langgenius/dify-runtime/blob/main/lib/model_providers/anthropic/llm/llm.py)。 \ No newline at end of file diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-1.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-1.png new file mode 100644 index 00000000000000..b158d44b29dcc2 Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-1.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-2.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-2.png new file mode 100644 index 00000000000000..c70cd3da5eea19 Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-2.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210143654461.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210143654461.png new file mode 100644 index 00000000000000..f1c30158dd452b Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210143654461.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210144229650.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210144229650.png new file mode 100644 index 00000000000000..742c1ba8088e45 Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210144229650.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210144814617.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210144814617.png new file mode 100644 index 00000000000000..b28aba83c9beb9 Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210144814617.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210151548521.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210151548521.png new file mode 100644 index 00000000000000..0d88bf4bda84fd Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210151548521.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210151628992.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210151628992.png new file mode 100644 index 00000000000000..a07aaebd2fa3ab Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210151628992.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210165243632.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210165243632.png new file mode 100644 index 00000000000000..18ec605e83f783 Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-20231210165243632.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image-3.png b/api/core/model_runtime/docs/zh_Hans/images/index/image-3.png new file mode 100644 index 00000000000000..bf0b9a7f47fddf Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image-3.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/images/index/image.png b/api/core/model_runtime/docs/zh_Hans/images/index/image.png new file mode 100644 index 00000000000000..eb63d107e1c385 Binary files /dev/null and b/api/core/model_runtime/docs/zh_Hans/images/index/image.png differ diff --git a/api/core/model_runtime/docs/zh_Hans/interfaces.md b/api/core/model_runtime/docs/zh_Hans/interfaces.md new file mode 100644 index 00000000000000..ce70da1859db51 --- /dev/null +++ b/api/core/model_runtime/docs/zh_Hans/interfaces.md @@ -0,0 +1,706 @@ +# 接口方法 + +这里介绍供应商和各模型类型需要实现的接口方法和参数说明。 + +## 供应商 + +继承 `__base.model_provider.ModelProvider` 基类,实现以下接口: + +```python +def validate_provider_credentials(self, credentials: dict) -> None: + """ + Validate provider credentials + You can choose any validate_credentials method of model type or implement validate method by yourself, + such as: get model list api + + if validate failed, raise exception + + :param credentials: provider credentials, credentials form defined in `provider_credential_schema`. + """ +``` + +- `credentials` (object) 凭据信息 + + 凭据信息的参数由供应商 YAML 配置文件的 `provider_credential_schema` 定义,传入如:`api_key` 等。 + +验证失败请抛出 `errors.validate.CredentialsValidateFailedError` 错误。 + +**注:预定义模型需完整实现该接口,自定义模型供应商只需要如下简单实现即可** + +```python +class XinferenceProvider(Provider): + def validate_provider_credentials(self, credentials: dict) -> None: + pass +``` + +## 模型 + +模型分为 5 种不同的模型类型,不同模型类型继承的基类不同,需要实现的方法也不同。 + +### 通用接口 + +所有模型均需要统一实现下面 2 个方法: + +- 模型凭据校验 + + 与供应商凭据校验类似,这里针对单个模型进行校验。 + + ```python + def validate_credentials(self, model: str, credentials: dict) -> None: + """ + Validate model credentials + + :param model: model name + :param credentials: model credentials + :return: + """ + ``` + + 参数: + + - `model` (string) 模型名称 + + - `credentials` (object) 凭据信息 + + 凭据信息的参数由供应商 YAML 配置文件的 `provider_credential_schema` 或 `model_credential_schema` 定义,传入如:`api_key` 等。 + + 验证失败请抛出 `errors.validate.CredentialsValidateFailedError` 错误。 + +- 调用异常错误映射表 + + 当模型调用异常时需要映射到 Runtime 指定的 `InvokeError` 类型,方便 Dify 针对不同错误做不同后续处理。 + + Runtime Errors: + + - `InvokeConnectionError` 调用连接错误 + - `InvokeServerUnavailableError ` 调用服务方不可用 + - `InvokeRateLimitError ` 调用达到限额 + - `InvokeAuthorizationError` 调用鉴权失败 + - `InvokeBadRequestError ` 调用传参有误 + + ```python + @property + def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: + """ + Map model invoke error to unified error + The key is the error type thrown to the caller + The value is the error type thrown by the model, + which needs to be converted into a unified error type for the caller. + + :return: Invoke error mapping + """ + ``` + + 也可以直接抛出对应Erros,并做如下定义,这样在之后的调用中可以直接抛出`InvokeConnectionError`等异常。 + + ```python + @property + def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: + return { + InvokeConnectionError: [ + InvokeConnectionError + ], + InvokeServerUnavailableError: [ + InvokeServerUnavailableError + ], + InvokeRateLimitError: [ + InvokeRateLimitError + ], + InvokeAuthorizationError: [ + InvokeAuthorizationError + ], + InvokeBadRequestError: [ + InvokeBadRequestError + ], + } + ``` + +​ 可参考 OpenAI `_invoke_error_mapping`。 + +### LLM + +继承 `__base.large_language_model.LargeLanguageModel` 基类,实现以下接口: + +- LLM 调用 + + 实现 LLM 调用的核心方法,可同时支持流式和同步返回。 + + ```python + def _invoke(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) \ + -> Union[LLMResult, Generator]: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :return: full response or stream response chunk generator result + """ + ``` + + - 参数: + + - `model` (string) 模型名称 + + - `credentials` (object) 凭据信息 + + 凭据信息的参数由供应商 YAML 配置文件的 `provider_credential_schema` 或 `model_credential_schema` 定义,传入如:`api_key` 等。 + + - `prompt_messages` (array[[PromptMessage](#PromptMessage)]) Prompt 列表 + + 若模型为 `Completion` 类型,则列表只需要传入一个 [UserPromptMessage](#UserPromptMessage) 元素即可; + + 若模型为 `Chat` 类型,需要根据消息不同传入 [SystemPromptMessage](#SystemPromptMessage), [UserPromptMessage](#UserPromptMessage), [AssistantPromptMessage](#AssistantPromptMessage), [ToolPromptMessage](#ToolPromptMessage) 元素列表 + + - `model_parameters` (object) 模型参数 + + 模型参数由模型 YAML 配置的 `parameter_rules` 定义。 + + - `tools` (array[[PromptMessageTool](#PromptMessageTool)]) [optional] 工具列表,等同于 `function calling` 中的 `function`。 + + 即传入 tool calling 的工具列表。 + + - `stop` (array[string]) [optional] 停止序列 + + 模型返回将在停止序列定义的字符串之前停止输出。 + + - `stream` (bool) 是否流式输出,默认 True + + 流式输出返回 Generator[[LLMResultChunk](#LLMResultChunk)],非流式输出返回 [LLMResult](#LLMResult)。 + + - `user` (string) [optional] 用户的唯一标识符 + + 可以帮助供应商监控和检测滥用行为。 + + - 返回 + + 流式输出返回 Generator[[LLMResultChunk](#LLMResultChunk)],非流式输出返回 [LLMResult](#LLMResult)。 + +- 预计算输入 tokens + + 若模型未提供预计算 tokens 接口,可直接返回 0。 + + ```python + def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], + tools: Optional[list[PromptMessageTool]] = None) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param tools: tools for tool calling + :return: + """ + ``` + + 参数说明见上述 `LLM 调用`。 + + 该接口需要根据对应`model`选择合适的`tokenizer`进行计算,如果对应模型没有提供`tokenizer`,可以使用`AIModel`基类中的`_get_num_tokens_by_gpt2(text: str)`方法进行计算。 + +- 获取自定义模型规则 [可选] + + ```python + def get_customizable_model_schema(self, model: str, credentials: dict) -> Optional[AIModelEntity]: + """ + Get customizable model schema + + :param model: model name + :param credentials: model credentials + :return: model schema + """ + ``` + +​当供应商支持增加自定义 LLM 时,可实现此方法让自定义模型可获取模型规则,默认返回 None。 + +对于`OpenAI`供应商下的大部分微调模型,可以通过其微调模型名称获取到其基类模型,如`gpt-3.5-turbo-1106`,然后返回基类模型的预定义参数规则,参考[openai](https://github.com/langgenius/dify/blob/feat/model-runtime/api/core/model_runtime/model_providers/openai/llm/llm.py#L801) +的具体实现 + +### TextEmbedding + +继承 `__base.text_embedding_model.TextEmbeddingModel` 基类,实现以下接口: + +- Embedding 调用 + + ```python + def _invoke(self, model: str, credentials: dict, + texts: list[str], user: Optional[str] = None) \ + -> TextEmbeddingResult: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param texts: texts to embed + :param user: unique user id + :return: embeddings result + """ + ``` + + - 参数: + + - `model` (string) 模型名称 + + - `credentials` (object) 凭据信息 + + 凭据信息的参数由供应商 YAML 配置文件的 `provider_credential_schema` 或 `model_credential_schema` 定义,传入如:`api_key` 等。 + + - `texts` (array[string]) 文本列表,可批量处理 + + - `user` (string) [optional] 用户的唯一标识符 + + 可以帮助供应商监控和检测滥用行为。 + + - 返回: + + [TextEmbeddingResult](#TextEmbeddingResult) 实体。 + +- 预计算 tokens + + ```python + def get_num_tokens(self, model: str, credentials: dict, texts: list[str]) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param texts: texts to embed + :return: + """ + ``` + + 参数说明见上述 `Embedding 调用`。 + + 同上述`LargeLanguageModel`,该接口需要根据对应`model`选择合适的`tokenizer`进行计算,如果对应模型没有提供`tokenizer`,可以使用`AIModel`基类中的`_get_num_tokens_by_gpt2(text: str)`方法进行计算。 + +### Rerank + +继承 `__base.rerank_model.RerankModel` 基类,实现以下接口: + +- rerank 调用 + + ```python + def _invoke(self, model: str, credentials: dict, + query: str, docs: list[str], score_threshold: Optional[float] = None, top_n: Optional[int] = None, + user: Optional[str] = None) \ + -> RerankResult: + """ + Invoke rerank model + + :param model: model name + :param credentials: model credentials + :param query: search query + :param docs: docs for reranking + :param score_threshold: score threshold + :param top_n: top n + :param user: unique user id + :return: rerank result + """ + ``` + + - 参数: + + - `model` (string) 模型名称 + + - `credentials` (object) 凭据信息 + + 凭据信息的参数由供应商 YAML 配置文件的 `provider_credential_schema` 或 `model_credential_schema` 定义,传入如:`api_key` 等。 + + - `query` (string) 查询请求内容 + + - `docs` (array[string]) 需要重排的分段列表 + + - `score_threshold` (float) [optional] Score 阈值 + + - `top_n` (int) [optional] 取前 n 个分段 + + - `user` (string) [optional] 用户的唯一标识符 + + 可以帮助供应商监控和检测滥用行为。 + + - 返回: + + [RerankResult](#RerankResult) 实体。 + +### Speech2text + +继承 `__base.speech2text_model.Speech2TextModel` 基类,实现以下接口: + +- Invoke 调用 + + ```python + def _invoke(self, model: str, credentials: dict, + file: IO[bytes], user: Optional[str] = None) \ + -> str: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param file: audio file + :param user: unique user id + :return: text for given audio file + """ + ``` + + - 参数: + + - `model` (string) 模型名称 + + - `credentials` (object) 凭据信息 + + 凭据信息的参数由供应商 YAML 配置文件的 `provider_credential_schema` 或 `model_credential_schema` 定义,传入如:`api_key` 等。 + + - `file` (File) 文件流 + + - `user` (string) [optional] 用户的唯一标识符 + + 可以帮助供应商监控和检测滥用行为。 + + - 返回: + + 语音转换后的字符串。 + +### Moderation + +继承 `__base.moderation_model.ModerationModel` 基类,实现以下接口: + +- Invoke 调用 + + ```python + def _invoke(self, model: str, credentials: dict, + text: str, user: Optional[str] = None) \ + -> bool: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param text: text to moderate + :param user: unique user id + :return: false if text is safe, true otherwise + """ + ``` + + - 参数: + + - `model` (string) 模型名称 + + - `credentials` (object) 凭据信息 + + 凭据信息的参数由供应商 YAML 配置文件的 `provider_credential_schema` 或 `model_credential_schema` 定义,传入如:`api_key` 等。 + + - `text` (string) 文本内容 + + - `user` (string) [optional] 用户的唯一标识符 + + 可以帮助供应商监控和检测滥用行为。 + + - 返回: + + False 代表传入的文本安全,True 则反之。 + + + +## 实体 + +### PromptMessageRole + +消息角色 + +```python +class PromptMessageRole(Enum): + """ + Enum class for prompt message. + """ + SYSTEM = "system" + USER = "user" + ASSISTANT = "assistant" + TOOL = "tool" +``` + +### PromptMessageContentType + +消息内容类型,分为纯文本和图片。 + +```python +class PromptMessageContentType(Enum): + """ + Enum class for prompt message content type. + """ + TEXT = 'text' + IMAGE = 'image' +``` + +### PromptMessageContent + +消息内容基类,仅作为参数声明用,不可初始化。 + +```python +class PromptMessageContent(BaseModel): + """ + Model class for prompt message content. + """ + type: PromptMessageContentType + data: str # 内容数据 +``` + +当前支持文本和图片两种类型,可支持同时传入文本和多图。 + +需要分别初始化 `TextPromptMessageContent` 和 `ImagePromptMessageContent` 传入。 + +### TextPromptMessageContent + +```python +class TextPromptMessageContent(PromptMessageContent): + """ + Model class for text prompt message content. + """ + type: PromptMessageContentType = PromptMessageContentType.TEXT +``` + +若传入图文,其中文字需要构造此实体作为 `content` 列表中的一部分。 + +### ImagePromptMessageContent + +```python +class ImagePromptMessageContent(PromptMessageContent): + """ + Model class for image prompt message content. + """ + class DETAIL(Enum): + LOW = 'low' + HIGH = 'high' + + type: PromptMessageContentType = PromptMessageContentType.IMAGE + detail: DETAIL = DETAIL.LOW # 分辨率 +``` + +若传入图文,其中图片需要构造此实体作为 `content` 列表中的一部分 + +`data` 可以为 `url` 或者图片 `base64` 加密后的字符串。 + +### PromptMessage + +所有 Role 消息体的基类,仅作为参数声明用,不可初始化。 + +```python +class PromptMessage(ABC, BaseModel): + """ + Model class for prompt message. + """ + role: PromptMessageRole # 消息角色 + content: Optional[str | list[PromptMessageContent]] = None # 支持两种类型,字符串和内容列表,内容列表是为了满足多模态的需要,可详见 PromptMessageContent 说明。 + name: Optional[str] = None # 名称,可选。 +``` + +### UserPromptMessage + +UserMessage 消息体,代表用户消息。 + +```python +class UserPromptMessage(PromptMessage): + """ + Model class for user prompt message. + """ + role: PromptMessageRole = PromptMessageRole.USER +``` + +### AssistantPromptMessage + +代表模型返回消息,通常用于 `few-shots` 或聊天历史传入。 + +```python +class AssistantPromptMessage(PromptMessage): + """ + Model class for assistant prompt message. + """ + class ToolCall(BaseModel): + """ + Model class for assistant prompt message tool call. + """ + class ToolCallFunction(BaseModel): + """ + Model class for assistant prompt message tool call function. + """ + name: str # 工具名称 + arguments: str # 工具参数 + + id: str # 工具 ID,仅在 OpenAI tool call 生效,为工具调用的唯一 ID,同一个工具可以调用多次 + type: str # 默认 function + function: ToolCallFunction # 工具调用信息 + + role: PromptMessageRole = PromptMessageRole.ASSISTANT + tool_calls: list[ToolCall] = [] # 模型回复的工具调用结果(仅当传入 tools,并且模型认为需要调用工具时返回) +``` + +其中 `tool_calls` 为调用模型传入 `tools` 后,由模型返回的 `tool call` 列表。 + +### SystemPromptMessage + +代表系统消息,通常用于设定给模型的系统指令。 + +```python +class SystemPromptMessage(PromptMessage): + """ + Model class for system prompt message. + """ + role: PromptMessageRole = PromptMessageRole.SYSTEM +``` + +### ToolPromptMessage + +代表工具消息,用于工具执行后将结果交给模型进行下一步计划。 + +```python +class ToolPromptMessage(PromptMessage): + """ + Model class for tool prompt message. + """ + role: PromptMessageRole = PromptMessageRole.TOOL + tool_call_id: str # 工具调用 ID,若不支持 OpenAI tool call,也可传入工具名称 +``` + +基类的 `content` 传入工具执行结果。 + +### PromptMessageTool + +```python +class PromptMessageTool(BaseModel): + """ + Model class for prompt message tool. + """ + name: str # 工具名称 + description: str # 工具描述 + parameters: dict # 工具参数 dict +``` + +--- + +### LLMResult + +```python +class LLMResult(BaseModel): + """ + Model class for llm result. + """ + model: str # 实际使用模型 + prompt_messages: list[PromptMessage] # prompt 消息列表 + message: AssistantPromptMessage # 回复消息 + usage: LLMUsage # 使用的 tokens 及费用信息 + system_fingerprint: Optional[str] = None # 请求指纹,可参考 OpenAI 该参数定义 +``` + +### LLMResultChunkDelta + +流式返回中每个迭代内部 `delta` 实体 + +```python +class LLMResultChunkDelta(BaseModel): + """ + Model class for llm result chunk delta. + """ + index: int # 序号 + message: AssistantPromptMessage # 回复消息 + usage: Optional[LLMUsage] = None # 使用的 tokens 及费用信息,仅最后一条返回 + finish_reason: Optional[str] = None # 结束原因,仅最后一条返回 +``` + +### LLMResultChunk + +流式返回中每个迭代实体 + +```python +class LLMResultChunk(BaseModel): + """ + Model class for llm result chunk. + """ + model: str # 实际使用模型 + prompt_messages: list[PromptMessage] # prompt 消息列表 + system_fingerprint: Optional[str] = None # 请求指纹,可参考 OpenAI 该参数定义 + delta: LLMResultChunkDelta # 每个迭代存在变化的内容 +``` + +### LLMUsage + +```python +class LLMUsage(ModelUsage): + """ + Model class for llm usage. + """ + prompt_tokens: int # prompt 使用 tokens + prompt_unit_price: Decimal # prompt 单价 + prompt_price_unit: Decimal # prompt 价格单位,即单价基于多少 tokens + prompt_price: Decimal # prompt 费用 + completion_tokens: int # 回复使用 tokens + completion_unit_price: Decimal # 回复单价 + completion_price_unit: Decimal # 回复价格单位,即单价基于多少 tokens + completion_price: Decimal # 回复费用 + total_tokens: int # 总使用 token 数 + total_price: Decimal # 总费用 + currency: str # 货币单位 + latency: float # 请求耗时(s) +``` + +--- + +### TextEmbeddingResult + +```python +class TextEmbeddingResult(BaseModel): + """ + Model class for text embedding result. + """ + model: str # 实际使用模型 + embeddings: list[list[float]] # embedding 向量列表,对应传入的 texts 列表 + usage: EmbeddingUsage # 使用信息 +``` + +### EmbeddingUsage + +```python +class EmbeddingUsage(ModelUsage): + """ + Model class for embedding usage. + """ + tokens: int # 使用 token 数 + total_tokens: int # 总使用 token 数 + unit_price: Decimal # 单价 + price_unit: Decimal # 价格单位,即单价基于多少 tokens + total_price: Decimal # 总费用 + currency: str # 货币单位 + latency: float # 请求耗时(s) +``` + +--- + +### RerankResult + +```python +class RerankResult(BaseModel): + """ + Model class for rerank result. + """ + model: str # 实际使用模型 + docs: list[RerankDocument] # 重排后的分段列表 +``` + +### RerankDocument + +```python +class RerankDocument(BaseModel): + """ + Model class for rerank document. + """ + index: int # 原序号 + text: str # 分段文本内容 + score: float # 分数 +``` diff --git a/api/core/model_runtime/docs/zh_Hans/predefined_model_scale_out.md b/api/core/model_runtime/docs/zh_Hans/predefined_model_scale_out.md new file mode 100644 index 00000000000000..5f4e84680da72a --- /dev/null +++ b/api/core/model_runtime/docs/zh_Hans/predefined_model_scale_out.md @@ -0,0 +1,171 @@ +## 预定义模型接入 + +供应商集成完成后,接下来为供应商下模型的接入。 + +我们首先需要确定接入模型的类型,并在对应供应商的目录下创建对应模型类型的 `module`。 + +当前支持模型类型如下: + +- `llm` 文本生成模型 +- `text_embedding` 文本 Embedding 模型 +- `rerank` Rerank 模型 +- `speech2text` 语音转文字 +- `moderation` 审查 + +依旧以 `Anthropic` 为例,`Anthropic` 仅支持 LLM,因此在 `model_providers.anthropic` 创建一个 `llm` 为名称的 `module`。 + +对于预定义的模型,我们首先需要在 `llm` `module` 下创建以模型名为文件名称的 YAML 文件,如:`claude-2.1.yaml`。 + +### 准备模型 YAML + +```yaml +model: claude-2.1 # 模型标识 +# 模型展示名称,可设置 en_US 英文、zh_Hans 中文两种语言,zh_Hans 不设置将默认使用 en_US。 +# 也可不设置 label,则使用 model 标识内容。 +label: + en_US: claude-2.1 +model_type: llm # 模型类型,claude-2.1 为 LLM +features: # 支持功能,agent-thought 为支持 Agent 推理,vision 为支持图片理解 +- agent-thought +model_properties: # 模型属性 + mode: chat # LLM 模式,complete 文本补全模型,chat 对话模型 + context_size: 200000 # 支持最大上下文大小 +parameter_rules: # 模型调用参数规则,仅 LLM 需要提供 +- name: temperature # 调用参数变量名 + # 默认预置了 5 种变量内容配置模板,temperature/top_p/max_tokens/presence_penalty/frequency_penalty + # 可在 use_template 中直接设置模板变量名,将会使用 entities.defaults.PARAMETER_RULE_TEMPLATE 中的默认配置 + # 若设置了额外的配置参数,将覆盖默认配置 + use_template: temperature +- name: top_p + use_template: top_p +- name: top_k + label: # 调用参数展示名称 + zh_Hans: 取样数量 + en_US: Top k + type: int # 参数类型,支持 float/int/string/boolean + help: # 帮助信息,描述参数作用 + zh_Hans: 仅从每个后续标记的前 K 个选项中采样。 + en_US: Only sample from the top K options for each subsequent token. + required: false # 是否必填,可不设置 +- name: max_tokens_to_sample + use_template: max_tokens + default: 4096 # 参数默认值 + min: 1 # 参数最小值,仅 float/int 可用 + max: 4096 # 参数最大值,仅 float/int 可用 +pricing: # 价格信息 + input: '8.00' # 输入单价,即 Prompt 单价 + output: '24.00' # 输出单价,即返回内容单价 + unit: '0.000001' # 价格单位,即上述价格为每 100K 的单价 + currency: USD # 价格货币 +``` + +建议将所有模型配置都准备完毕后再开始模型代码的实现。 + +同样,也可以参考 `model_providers` 目录下其他供应商对应模型类型目录下的 YAML 配置信息,完整的 YAML 规则见:[Schema](schema.md#AIModel)。 + +### 实现模型调用代码 + +接下来需要在 `llm` `module` 下创建一个同名的 python 文件 `llm.py` 来编写代码实现。 + +在 `llm.py` 中创建一个 Anthropic LLM 类,我们取名为 `AnthropicLargeLanguageModel`(随意),继承 `__base.large_language_model.LargeLanguageModel` 基类,实现以下几个方法: + +- LLM 调用 + + 实现 LLM 调用的核心方法,可同时支持流式和同步返回。 + + ```python + def _invoke(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) \ + -> Union[LLMResult, Generator]: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :return: full response or stream response chunk generator result + """ + ``` + + 在实现时,需要注意使用两个函数来返回数据,分别用于处理同步返回和流式返回,因为Python会将函数中包含 `yield` 关键字的函数识别为生成器函数,返回的数据类型固定为 `Generator`,因此同步和流式返回需要分别实现,就像下面这样(注意下面例子使用了简化参数,实际实现时需要按照上面的参数列表进行实现): + + ```python + def _invoke(self, stream: bool, **kwargs) \ + -> Union[LLMResult, Generator]: + if stream: + return self._handle_stream_response(**kwargs) + return self._handle_sync_response(**kwargs) + + def _handle_stream_response(self, **kwargs) -> Generator: + for chunk in response: + yield chunk + def _handle_sync_response(self, **kwargs) -> LLMResult: + return LLMResult(**response) + ``` + +- 预计算输入 tokens + + 若模型未提供预计算 tokens 接口,可直接返回 0。 + + ```python + def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], + tools: Optional[list[PromptMessageTool]] = None) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param tools: tools for tool calling + :return: + """ + ``` + +- 模型凭据校验 + + 与供应商凭据校验类似,这里针对单个模型进行校验。 + + ```python + def validate_credentials(self, model: str, credentials: dict) -> None: + """ + Validate model credentials + + :param model: model name + :param credentials: model credentials + :return: + """ + ``` + +- 调用异常错误映射表 + + 当模型调用异常时需要映射到 Runtime 指定的 `InvokeError` 类型,方便 Dify 针对不同错误做不同后续处理。 + + Runtime Errors: + + - `InvokeConnectionError` 调用连接错误 + - `InvokeServerUnavailableError ` 调用服务方不可用 + - `InvokeRateLimitError ` 调用达到限额 + - `InvokeAuthorizationError` 调用鉴权失败 + - `InvokeBadRequestError ` 调用传参有误 + + ```python + @property + def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: + """ + Map model invoke error to unified error + The key is the error type thrown to the caller + The value is the error type thrown by the model, + which needs to be converted into a unified error type for the caller. + + :return: Invoke error mapping + """ + ``` + +接口方法说明见:[Interfaces](./interfaces.md),具体实现可参考:[llm.py](https://github.com/langgenius/dify-runtime/blob/main/lib/model_providers/anthropic/llm/llm.py)。 \ No newline at end of file diff --git a/api/core/model_runtime/docs/zh_Hans/provider_scale_out.md b/api/core/model_runtime/docs/zh_Hans/provider_scale_out.md new file mode 100644 index 00000000000000..b34544c789fa76 --- /dev/null +++ b/api/core/model_runtime/docs/zh_Hans/provider_scale_out.md @@ -0,0 +1,188 @@ +## 增加新供应商 + +供应商支持三种模型配置方式: + +- `predefined-model ` 预定义模型 + + 表示用户只需要配置统一的供应商凭据即可使用供应商下的预定义模型。 + +- `customizable-model` 自定义模型 + + 用户需要新增每个模型的凭据配置,如Xinference,它同时支持 LLM 和 Text Embedding,但是每个模型都有唯一的**model_uid**,如果想要将两者同时接入,就需要为每个模型配置一个**model_uid**。 + +- `fetch-from-remote` 从远程获取 + + 与 `predefined-model` 配置方式一致,只需要配置统一的供应商凭据即可,模型通过凭据信息从供应商获取。 + + 如OpenAI,我们可以基于gpt-turbo-3.5来Fine Tune多个模型,而他们都位于同一个**api_key**下,当配置为 `fetch-from-remote` 时,开发者只需要配置统一的**api_key**即可让DifyRuntime获取到开发者所有的微调模型并接入Dify。 + +这三种配置方式**支持共存**,即存在供应商支持 `predefined-model` + `customizable-model` 或 `predefined-model` + `fetch-from-remote` 等,也就是配置了供应商统一凭据可以使用预定义模型和从远程获取的模型,若新增了模型,则可以在此基础上额外使用自定义的模型。 + +## 开始 + +### 介绍 + +#### 名词解释 + - `module`: 一个`module`即为一个Python Package,或者通俗一点,称为一个文件夹,里面包含了一个`__init__.py`文件,以及其他的`.py`文件。 + +#### 步骤 +新增一个供应商主要分为几步,这里简单列出,帮助大家有一个大概的认识,具体的步骤会在下面详细介绍。 + +- 创建供应商yaml文件,根据[ProviderSchema](./schema.md#provider)编写 +- 创建供应商代码,实现一个`class`。 +- 根据模型类型,在供应商`module`下创建对应的模型类型 `module`,如`llm`或`text_embedding`。 +- 根据模型类型,在对应的模型`module`下创建同名的代码文件,如`llm.py`,并实现一个`class`。 +- 如果有预定义模型,根据模型名称创建同名的yaml文件在模型`module`下,如`claude-2.1.yaml`,根据[AIModelEntity](./schema.md#aimodelentity)编写。 +- 编写测试代码,确保功能可用。 + +### 开始吧 + +增加一个新的供应商需要先确定供应商的英文标识,如 `anthropic`,使用该标识在 `model_providers` 创建以此为名称的 `module`。 + +在此 `module` 下,我们需要先准备供应商的 YAML 配置。 + +#### 准备供应商 YAML + +此处以 `Anthropic` 为例,预设了供应商基础信息、支持的模型类型、配置方式、凭据规则。 + +```YAML +provider: anthropic # 供应商标识 +label: # 供应商展示名称,可设置 en_US 英文、zh_Hans 中文两种语言,zh_Hans 不设置将默认使用 en_US。 + en_US: Anthropic +icon_small: # 供应商小图标,存储在对应供应商实现目录下的 _assets 目录,中英文策略同 label + en_US: icon_s_en.png +icon_large: # 供应商大图标,存储在对应供应商实现目录下的 _assets 目录,中英文策略同 label + en_US: icon_l_en.png +supported_model_types: # 支持的模型类型,Anthropic 仅支持 LLM +- llm +configurate_methods: # 支持的配置方式,Anthropic 仅支持预定义模型 +- predefined-model +provider_credential_schema: # 供应商凭据规则,由于 Anthropic 仅支持预定义模型,则需要定义统一供应商凭据规则 + credential_form_schemas: # 凭据表单项列表 + - variable: anthropic_api_key # 凭据参数变量名 + label: # 展示名称 + en_US: API Key + type: secret-input # 表单类型,此处 secret-input 代表加密信息输入框,编辑时只展示屏蔽后的信息。 + required: true # 是否必填 + placeholder: # PlaceHolder 信息 + zh_Hans: 在此输入您的 API Key + en_US: Enter your API Key + - variable: anthropic_api_url + label: + en_US: API URL + type: text-input # 表单类型,此处 text-input 代表文本输入框 + required: false + placeholder: + zh_Hans: 在此输入您的 API URL + en_US: Enter your API URL +``` + +如果接入的供应商提供自定义模型,比如`OpenAI`提供微调模型,那么我们就需要添加[`model_credential_schema`](./schema.md#modelcredentialschema),以`OpenAI`为例: + +```yaml +model_credential_schema: + model: # 微调模型名称 + label: + en_US: Model Name + zh_Hans: 模型名称 + placeholder: + en_US: Enter your model name + zh_Hans: 输入模型名称 + credential_form_schemas: + - variable: openai_api_key + label: + en_US: API Key + type: secret-input + required: true + placeholder: + zh_Hans: 在此输入您的 API Key + en_US: Enter your API Key + - variable: openai_organization + label: + zh_Hans: 组织 ID + en_US: Organization + type: text-input + required: false + placeholder: + zh_Hans: 在此输入您的组织 ID + en_US: Enter your Organization ID + - variable: openai_api_base + label: + zh_Hans: API Base + en_US: API Base + type: text-input + required: false + placeholder: + zh_Hans: 在此输入您的 API Base + en_US: Enter your API Base +``` + +也可以参考 `model_providers` 目录下其他供应商目录下的 YAML 配置信息,完整的 YAML 规则见:[Schema](schema.md#Provider)。 + +#### 实现供应商代码 + +我们需要在`model_providers`下创建一个同名的python文件,如`anthropic.py`,并实现一个`class`,继承`__base.provider.Provider`基类,如`AnthropicProvider`。 + +##### 自定义模型供应商 + +当供应商为Xinference等自定义模型供应商时,可跳过该步骤,仅创建一个空的`XinferenceProvider`类即可,并实现一个空的`validate_provider_credentials`方法,该方法并不会被实际使用,仅用作避免抽象类无法实例化。 + +```python +class XinferenceProvider(Provider): + def validate_provider_credentials(self, credentials: dict) -> None: + pass +``` + +##### 预定义模型供应商 + +供应商需要继承 `__base.model_provider.ModelProvider` 基类,实现 `validate_provider_credentials` 供应商统一凭据校验方法即可,可参考 [AnthropicProvider](https://github.com/langgenius/dify-runtime/blob/main/lib/model_providers/anthropic/anthropic.py)。 + +```python +def validate_provider_credentials(self, credentials: dict) -> None: + """ + Validate provider credentials + You can choose any validate_credentials method of model type or implement validate method by yourself, + such as: get model list api + + if validate failed, raise exception + + :param credentials: provider credentials, credentials form defined in `provider_credential_schema`. + """ +``` + +当然也可以先预留 `validate_provider_credentials` 实现,在模型凭据校验方法实现后直接复用。 + +#### 增加模型 + +#### [增加预定义模型 👈🏻](./predefined_model_scale_out.md) +对于预定义模型,我们可以通过简单定义一个yaml,并通过实现调用代码来接入。 + +#### [增加自定义模型 👈🏻](./customizable_model_scale_out.md) +对于自定义模型,我们只需要实现调用代码即可接入,但是它需要处理的参数可能会更加复杂。 + +--- + +### 测试 + +为了保证接入供应商/模型的可用性,编写后的每个方法均需要在 `tests` 目录中编写对应的集成测试代码。 + +依旧以 `Anthropic` 为例。 + +在编写测试代码前,需要先在 `.env.example` 新增测试供应商所需要的凭据环境变量,如:`ANTHROPIC_API_KEY`。 + +在执行前需要将 `.env.example` 复制为 `.env` 再执行。 + +#### 编写测试代码 + +在 `tests` 目录下创建供应商同名的 `module`: `anthropic`,继续在此模块中创建 `test_provider.py` 以及对应模型类型的 test py 文件,如下所示: + +```shell +. +├── __init__.py +├── anthropic +│   ├── __init__.py +│   ├── test_llm.py # LLM 测试 +│   └── test_provider.py # 供应商测试 +``` + +针对上面实现的代码的各种情况进行测试代码编写,并测试通过后提交代码。 diff --git a/api/core/model_runtime/docs/zh_Hans/schema.md b/api/core/model_runtime/docs/zh_Hans/schema.md new file mode 100644 index 00000000000000..155750c0675403 --- /dev/null +++ b/api/core/model_runtime/docs/zh_Hans/schema.md @@ -0,0 +1,196 @@ +# 配置规则 + +- 供应商规则基于 [Provider](#Provider) 实体。 + +- 模型规则基于 [AIModelEntity](#AIModelEntity) 实体。 + +> 以下所有实体均基于 `Pydantic BaseModel`,可在 `entities` 模块中找到对应实体。 + +### Provider + +- `provider` (string) 供应商标识,如:`openai` +- `label` (object) 供应商展示名称,i18n,可设置 `en_US` 英文、`zh_Hans` 中文两种语言 + - `zh_Hans ` (string) [optional] 中文标签名,`zh_Hans` 不设置将默认使用 `en_US`。 + - `en_US` (string) 英文标签名 +- `description` (object) [optional] 供应商描述,i18n + - `zh_Hans` (string) [optional] 中文描述 + - `en_US` (string) 英文描述 +- `icon_small` (string) [optional] 供应商小 ICON,存储在对应供应商实现目录下的 `_assets` 目录,中英文策略同 `label` + - `zh_Hans` (string) [optional] 中文 ICON + - `en_US` (string) 英文 ICON +- `icon_large` (string) [optional] 供应商大 ICON,存储在对应供应商实现目录下的 _assets 目录,中英文策略同 label + - `zh_Hans `(string) [optional] 中文 ICON + - `en_US` (string) 英文 ICON +- `background` (string) [optional] 背景颜色色值,例:#FFFFFF,为空则展示前端默认色值。 +- `help` (object) [optional] 帮助信息 + - `title` (object) 帮助标题,i18n + - `zh_Hans` (string) [optional] 中文标题 + - `en_US` (string) 英文标题 + - `url` (object) 帮助链接,i18n + - `zh_Hans` (string) [optional] 中文链接 + - `en_US` (string) 英文链接 +- `supported_model_types` (array[[ModelType](#ModelType)]) 支持的模型类型 +- `configurate_methods` (array[[ConfigurateMethod](#ConfigurateMethod)]) 配置方式 +- `provider_credential_schema` ([ProviderCredentialSchema](#ProviderCredentialSchema)) 供应商凭据规格 +- `model_credential_schema` ([ModelCredentialSchema](#ModelCredentialSchema)) 模型凭据规格 + +### AIModelEntity + +- `model` (string) 模型标识,如:`gpt-3.5-turbo` +- `label` (object) [optional] 模型展示名称,i18n,可设置 `en_US` 英文、`zh_Hans` 中文两种语言 + - `zh_Hans `(string) [optional] 中文标签名 + - `en_US` (string) 英文标签名 +- `model_type` ([ModelType](#ModelType)) 模型类型 +- `features` (array[[ModelFeature](#ModelFeature)]) [optional] 支持功能列表 +- `model_properties` (object) 模型属性 + - `mode` ([LLMMode](#LLMMode)) 模式 (模型类型 `llm` 可用) + - `context_size` (int) 上下文大小 (模型类型 `llm` `text-embedding` 可用) + - `max_chunks` (int) 最大分块数量 (模型类型 `text-embedding ` `moderation` 可用) + - `file_upload_limit` (int) 文件最大上传限制,单位:MB。(模型类型 `speech2text` 可用) + - `supported_file_extensions` (string) 支持文件扩展格式,如:mp3,mp4(模型类型 `speech2text` 可用) + - `max_characters_per_chunk` (int) 每块最大字符数 (模型类型 `moderation` 可用) +- `parameter_rules` (array[[ParameterRule](#ParameterRule)]) [optional] 模型调用参数规则 +- `pricing` ([PriceConfig](#PriceConfig)) [optional] 价格信息 +- `deprecated` (bool) 是否废弃。若废弃,模型列表将不再展示,但已经配置的可以继续使用,默认 False。 + +### ModelType + +- `llm` 文本生成模型 +- `text-embedding` 文本 Embedding 模型 +- `rerank` Rerank 模型 +- `speech2text` 语音转文字 +- `moderation` 审查 + +### ConfigurateMethod + +- `predefined-model ` 预定义模型 + + 表示用户只需要配置统一的供应商凭据即可使用供应商下的预定义模型。 +- `customizable-model` 自定义模型 + + 用户需要新增每个模型的凭据配置。 + +- `fetch-from-remote` 从远程获取 + + 与 `predefined-model` 配置方式一致,只需要配置统一的供应商凭据即可,模型通过凭据信息从供应商获取。 + +### ModelFeature + +- `agent-thought` Agent 推理,一般超过 70B 有思维链能力。 +- `vision` 视觉,即:图像理解。 + +### FetchFrom + +- `predefined-model` 预定义模型 +- `fetch-from-remote` 远程模型 + +### LLMMode + +- `completion` 文本补全 +- `chat` 对话 + +### ParameterRule + +- `name` (string) 调用模型实际参数名 + +- `use_template` (string) [optional] 使用模板 + + 默认预置了 5 种变量内容配置模板: + + - `temperature` + - `top_p` + - `frequency_penalty` + - `presence_penalty` + - `max_tokens` + + 可在 use_template 中直接设置模板变量名,将会使用 entities.defaults.PARAMETER_RULE_TEMPLATE 中的默认配置 + 不用设置除 `name` 和 `use_template` 之外的所有参数,若设置了额外的配置参数,将覆盖默认配置。 + 可参考 `openai/llm/gpt-3.5-turbo.yaml`。 + +- `label` (object) [optional] 标签,i18n + + - `zh_Hans`(string) [optional] 中文标签名 + - `en_US` (string) 英文标签名 + +- `type`(string) [optional] 参数类型 + + - `int` 整数 + - `float` 浮点数 + - `string` 字符串 + - `boolean` 布尔型 + +- `help` (string) [optional] 帮助信息 + + - `zh_Hans` (string) [optional] 中文帮助信息 + - `en_US` (string) 英文帮助信息 + +- `required` (bool) 是否必填,默认 False。 + +- `default`(int/float/string/bool) [optional] 默认值 + +- `min`(int/float) [optional] 最小值,仅数字类型适用 + +- `max`(int/float) [optional] 最大值,仅数字类型适用 + +- `precision`(int) [optional] 精度,保留小数位数,仅数字类型适用 + +- `options` (array[string]) [optional] 下拉选项值,仅当 `type` 为 `string` 时适用,若不设置或为 null 则不限制选项值 + +### PriceConfig + +- `input` (float) 输入单价,即 Prompt 单价 +- `output` (float) 输出单价,即返回内容单价 +- `unit` (float) 价格单位,如:每 100K 的单价为 `0.000001` +- `currency` (string) 货币单位 + +### ProviderCredentialSchema + +- `credential_form_schemas` (array[[CredentialFormSchema](#CredentialFormSchema)]) 凭据表单规范 + +### ModelCredentialSchema + +- `model` (object) 模型标识,变量名默认 `model` + - `label` (object) 模型表单项展示名称 + - `en_US` (string) 英文 + - `zh_Hans`(string) [optional] 中文 + - `placeholder` (object) 模型提示内容 + - `en_US`(string) 英文 + - `zh_Hans`(string) [optional] 中文 +- `credential_form_schemas` (array[[CredentialFormSchema](#CredentialFormSchema)]) 凭据表单规范 + +### CredentialFormSchema + +- `variable` (string) 表单项变量名 +- `label` (object) 表单项标签名 + - `en_US`(string) 英文 + - `zh_Hans` (string) [optional] 中文 +- `type` ([FormType](#FormType)) 表单项类型 +- `required` (bool) 是否必填 +- `default`(string) 默认值 +- `options` (array[[FormOption](#FormOption)]) 表单项为 `select` 或 `radio` 专有属性,定义下拉内容 +- `placeholder`(object) 表单项为 `text-input `专有属性,表单项 PlaceHolder + - `en_US`(string) 英文 + - `zh_Hans` (string) [optional] 中文 +- `max_length` (int) 表单项为`text-input`专有属性,定义输入最大长度,0 为不限制。 +- `show_on` (array[[FormShowOnObject](#FormShowOnObject)]) 当其他表单项值符合条件时显示,为空则始终显示。 + +### FormType + +- `text-input` 文本输入组件 +- `secret-input` 密码输入组件 +- `select` 单选下拉 +- `radio` Radio 组件 +- `switch` 开关组件,仅支持 `true` 和 `false` + +### FormOption + +- `label` (object) 标签 + - `en_US`(string) 英文 + - `zh_Hans`(string) [optional] 中文 +- `value` (string) 下拉选项值 +- `show_on` (array[[FormShowOnObject](#FormShowOnObject)]) 当其他表单项值符合条件时显示,为空则始终显示。 + +### FormShowOnObject + +- `variable` (string) 其他表单项变量名 +- `value` (string) 其他表单项变量值 diff --git a/api/core/model_providers/providers/__init__.py b/api/core/model_runtime/entities/__init__.py similarity index 100% rename from api/core/model_providers/providers/__init__.py rename to api/core/model_runtime/entities/__init__.py diff --git a/api/core/model_runtime/entities/common_entities.py b/api/core/model_runtime/entities/common_entities.py new file mode 100644 index 00000000000000..175c13cfdcc04c --- /dev/null +++ b/api/core/model_runtime/entities/common_entities.py @@ -0,0 +1,16 @@ +from typing import Optional + +from pydantic import BaseModel + + +class I18nObject(BaseModel): + """ + Model class for i18n object. + """ + zh_Hans: Optional[str] = None + en_US: str + + def __init__(self, **data): + super().__init__(**data) + if not self.zh_Hans: + self.zh_Hans = self.en_US diff --git a/api/core/model_runtime/entities/defaults.py b/api/core/model_runtime/entities/defaults.py new file mode 100644 index 00000000000000..02929710dc55bd --- /dev/null +++ b/api/core/model_runtime/entities/defaults.py @@ -0,0 +1,87 @@ +from typing import Dict + +from core.model_runtime.entities.model_entities import DefaultParameterName + + +PARAMETER_RULE_TEMPLATE: Dict[DefaultParameterName, dict] = { + DefaultParameterName.TEMPERATURE: { + 'label': { + 'en_US': 'Temperature', + 'zh_Hans': '温度', + }, + 'type': 'float', + 'help': { + 'en_US': 'Controls randomness. Lower temperature results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive. Higher temperature results in more random completions.', + 'zh_Hans': '温度控制随机性。较低的温度会导致较少的随机完成。随着温度接近零,模型将变得确定性和重复性。较高的温度会导致更多的随机完成。', + }, + 'required': False, + 'default': 0.0, + 'min': 0.0, + 'max': 1.0, + 'precision': 1, + }, + DefaultParameterName.TOP_P: { + 'label': { + 'en_US': 'Top P', + 'zh_Hans': 'Top P', + }, + 'type': 'float', + 'help': { + 'en_US': 'Controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered.', + 'zh_Hans': '通过核心采样控制多样性:0.5表示考虑了一半的所有可能性加权选项。', + }, + 'required': False, + 'default': 1.0, + 'min': 0.0, + 'max': 1.0, + 'precision': 1, + }, + DefaultParameterName.PRESENCE_PENALTY: { + 'label': { + 'en_US': 'Presence Penalty', + 'zh_Hans': '存在惩罚', + }, + 'type': 'float', + 'help': { + 'en_US': 'Applies a penalty to the log-probability of tokens already in the text.', + 'zh_Hans': '对文本中已有的标记的对数概率施加惩罚。', + }, + 'required': False, + 'default': 0.0, + 'min': 0.0, + 'max': 1.0, + 'precision': 1, + }, + DefaultParameterName.FREQUENCY_PENALTY: { + 'label': { + 'en_US': 'Frequency Penalty', + 'zh_Hans': '频率惩罚', + }, + 'type': 'float', + 'help': { + 'en_US': 'Applies a penalty to the log-probability of tokens that appear in the text.', + 'zh_Hans': '对文本中出现的标记的对数概率施加惩罚。', + }, + 'required': False, + 'default': 0.0, + 'min': 0.0, + 'max': 1.0, + 'precision': 1, + }, + DefaultParameterName.MAX_TOKENS: { + 'label': { + 'en_US': 'Max Tokens', + 'zh_Hans': '最大标记', + }, + 'type': 'int', + 'help': { + 'en_US': 'The maximum number of tokens to generate. Requests can use up to 2048 tokens shared between prompt and completion.', + 'zh_Hans': '要生成的标记的最大数量。请求可以使用最多2048个标记,这些标记在提示和完成之间共享。', + }, + 'required': False, + 'default': 64, + 'min': 1, + 'max': 2048, + 'precision': 0, + } +} \ No newline at end of file diff --git a/api/core/model_runtime/entities/llm_entities.py b/api/core/model_runtime/entities/llm_entities.py new file mode 100644 index 00000000000000..b5bd9e267a0573 --- /dev/null +++ b/api/core/model_runtime/entities/llm_entities.py @@ -0,0 +1,102 @@ +from decimal import Decimal +from enum import Enum +from typing import Optional + +from pydantic import BaseModel + +from core.model_runtime.entities.message_entities import AssistantPromptMessage, PromptMessage +from core.model_runtime.entities.model_entities import ModelUsage, PriceInfo + + +class LLMMode(Enum): + """ + Enum class for large language model mode. + """ + COMPLETION = "completion" + CHAT = "chat" + + @classmethod + def value_of(cls, value: str) -> 'LLMMode': + """ + Get value of given mode. + + :param value: mode value + :return: mode + """ + for mode in cls: + if mode.value == value: + return mode + raise ValueError(f'invalid mode value {value}') + + +class LLMUsage(ModelUsage): + """ + Model class for llm usage. + """ + prompt_tokens: int + prompt_unit_price: Decimal + prompt_price_unit: Decimal + prompt_price: Decimal + completion_tokens: int + completion_unit_price: Decimal + completion_price_unit: Decimal + completion_price: Decimal + total_tokens: int + total_price: Decimal + currency: str + latency: float + + @classmethod + def empty_usage(cls): + return cls( + prompt_tokens=0, + prompt_unit_price=Decimal('0.0'), + prompt_price_unit=Decimal('0.0'), + prompt_price=Decimal('0.0'), + completion_tokens=0, + completion_unit_price=Decimal('0.0'), + completion_price_unit=Decimal('0.0'), + completion_price=Decimal('0.0'), + total_tokens=0, + total_price=Decimal('0.0'), + currency='USD', + latency=0.0 + ) + + +class LLMResult(BaseModel): + """ + Model class for llm result. + """ + model: str + prompt_messages: list[PromptMessage] + message: AssistantPromptMessage + usage: LLMUsage + system_fingerprint: Optional[str] = None + + +class LLMResultChunkDelta(BaseModel): + """ + Model class for llm result chunk delta. + """ + index: int + message: AssistantPromptMessage + usage: Optional[LLMUsage] = None + finish_reason: Optional[str] = None + + +class LLMResultChunk(BaseModel): + """ + Model class for llm result chunk. + """ + model: str + prompt_messages: list[PromptMessage] + system_fingerprint: Optional[str] = None + delta: LLMResultChunkDelta + + +class NumTokensResult(PriceInfo): + """ + Model class for number of tokens result. + """ + tokens: int diff --git a/api/core/model_runtime/entities/message_entities.py b/api/core/model_runtime/entities/message_entities.py new file mode 100644 index 00000000000000..83b12082b28525 --- /dev/null +++ b/api/core/model_runtime/entities/message_entities.py @@ -0,0 +1,134 @@ +from abc import ABC +from enum import Enum +from typing import Optional + +from pydantic import BaseModel + + +class PromptMessageRole(Enum): + """ + Enum class for prompt message. + """ + SYSTEM = "system" + USER = "user" + ASSISTANT = "assistant" + TOOL = "tool" + + @classmethod + def value_of(cls, value: str) -> 'PromptMessageRole': + """ + Get value of given mode. + + :param value: mode value + :return: mode + """ + for mode in cls: + if mode.value == value: + return mode + raise ValueError(f'invalid prompt message type value {value}') + + +class PromptMessageTool(BaseModel): + """ + Model class for prompt message tool. + """ + name: str + description: str + parameters: dict + + +class PromptMessageFunction(BaseModel): + """ + Model class for prompt message function. + """ + type: str = 'function' + function: PromptMessageTool + + +class PromptMessageContentType(Enum): + """ + Enum class for prompt message content type. + """ + TEXT = 'text' + IMAGE = 'image' + + +class PromptMessageContent(BaseModel): + """ + Model class for prompt message content. + """ + type: PromptMessageContentType + data: str + + +class TextPromptMessageContent(PromptMessageContent): + """ + Model class for text prompt message content. + """ + type: PromptMessageContentType = PromptMessageContentType.TEXT + + +class ImagePromptMessageContent(PromptMessageContent): + """ + Model class for image prompt message content. + """ + class DETAIL(Enum): + LOW = 'low' + HIGH = 'high' + + type: PromptMessageContentType = PromptMessageContentType.IMAGE + detail: DETAIL = DETAIL.LOW + + +class PromptMessage(ABC, BaseModel): + """ + Model class for prompt message. + """ + role: PromptMessageRole + content: Optional[str | list[PromptMessageContent]] = None + name: Optional[str] = None + + +class UserPromptMessage(PromptMessage): + """ + Model class for user prompt message. + """ + role: PromptMessageRole = PromptMessageRole.USER + + +class AssistantPromptMessage(PromptMessage): + """ + Model class for assistant prompt message. + """ + class ToolCall(BaseModel): + """ + Model class for assistant prompt message tool call. + """ + class ToolCallFunction(BaseModel): + """ + Model class for assistant prompt message tool call function. + """ + name: str + arguments: str + + id: str + type: str + function: ToolCallFunction + + role: PromptMessageRole = PromptMessageRole.ASSISTANT + tool_calls: list[ToolCall] = [] + + +class SystemPromptMessage(PromptMessage): + """ + Model class for system prompt message. + """ + role: PromptMessageRole = PromptMessageRole.SYSTEM + + +class ToolPromptMessage(PromptMessage): + """ + Model class for tool prompt message. + """ + role: PromptMessageRole = PromptMessageRole.TOOL + tool_call_id: str diff --git a/api/core/model_runtime/entities/model_entities.py b/api/core/model_runtime/entities/model_entities.py new file mode 100644 index 00000000000000..b9393071a9268c --- /dev/null +++ b/api/core/model_runtime/entities/model_entities.py @@ -0,0 +1,196 @@ +from decimal import Decimal +from enum import Enum +from typing import Any, Optional + +from pydantic import BaseModel + +from core.model_runtime.entities.common_entities import I18nObject + + +class ModelType(Enum): + """ + Enum class for model type. + """ + LLM = "llm" + TEXT_EMBEDDING = "text-embedding" + RERANK = "rerank" + SPEECH2TEXT = "speech2text" + MODERATION = "moderation" + # TTS = "tts" + # TEXT2IMG = "text2img" + + @classmethod + def value_of(cls, origin_model_type: str) -> "ModelType": + """ + Get model type from origin model type. + + :return: model type + """ + if origin_model_type == 'text-generation' or origin_model_type == cls.LLM.value: + return cls.LLM + elif origin_model_type == 'embeddings' or origin_model_type == cls.TEXT_EMBEDDING.value: + return cls.TEXT_EMBEDDING + elif origin_model_type == 'reranking' or origin_model_type == cls.RERANK.value: + return cls.RERANK + elif origin_model_type == cls.SPEECH2TEXT.value: + return cls.SPEECH2TEXT + elif origin_model_type == cls.MODERATION.value: + return cls.MODERATION + else: + raise ValueError(f'invalid origin model type {origin_model_type}') + + def to_origin_model_type(self) -> str: + """ + Get origin model type from model type. + + :return: origin model type + """ + if self == self.LLM: + return 'text-generation' + elif self == self.TEXT_EMBEDDING: + return 'embeddings' + elif self == self.RERANK: + return 'reranking' + elif self == self.SPEECH2TEXT: + return 'speech2text' + elif self == self.MODERATION: + return 'moderation' + else: + raise ValueError(f'invalid model type {self}') + + +class FetchFrom(Enum): + """ + Enum class for fetch from. + """ + PREDEFINED_MODEL = "predefined-model" + CUSTOMIZABLE_MODEL = "customizable-model" + + +class ModelFeature(Enum): + """ + Enum class for llm feature. + """ + TOOL_CALL = "tool-call" + MULTI_TOOL_CALL = "multi-tool-call" + AGENT_THOUGHT = "agent-thought" + VISION = "vision" + + +class DefaultParameterName(Enum): + """ + Enum class for parameter template variable. + """ + TEMPERATURE = "temperature" + TOP_P = "top_p" + PRESENCE_PENALTY = "presence_penalty" + FREQUENCY_PENALTY = "frequency_penalty" + MAX_TOKENS = "max_tokens" + + @classmethod + def value_of(cls, value: Any) -> 'DefaultParameterName': + """ + Get parameter name from value. + + :param value: parameter value + :return: parameter name + """ + for name in cls: + if name.value == value: + return name + raise ValueError(f'invalid parameter name {value}') + + +class ParameterType(Enum): + """ + Enum class for parameter type. + """ + FLOAT = "float" + INT = "int" + STRING = "string" + BOOLEAN = "boolean" + + +class ModelPropertyKey(Enum): + """ + Enum class for model property key. + """ + MODE = "mode" + CONTEXT_SIZE = "context_size" + MAX_CHUNKS = "max_chunks" + FILE_UPLOAD_LIMIT = "file_upload_limit" + SUPPORTED_FILE_EXTENSIONS = "supported_file_extensions" + MAX_CHARACTERS_PER_CHUNK = "max_characters_per_chunk" + + +class ProviderModel(BaseModel): + """ + Model class for provider model. + """ + model: str + label: I18nObject + model_type: ModelType + features: Optional[list[ModelFeature]] = None + fetch_from: FetchFrom + model_properties: dict[ModelPropertyKey, Any] + deprecated: bool = False + + class Config: + protected_namespaces = () + + +class ParameterRule(BaseModel): + """ + Model class for parameter rule. + """ + name: str + use_template: Optional[str] = None + label: I18nObject + type: ParameterType + help: Optional[I18nObject] = None + required: bool = False + default: Optional[Any] = None + min: Optional[float | int] = None + max: Optional[float | int] = None + precision: Optional[int] = None + options: list[str] = [] + + +class PriceConfig(BaseModel): + """ + Model class for pricing info. + """ + input: Decimal + output: Optional[Decimal] = None + unit: Decimal + currency: str + + +class AIModelEntity(ProviderModel): + """ + Model class for AI model. + """ + parameter_rules: list[ParameterRule] = [] + pricing: Optional[PriceConfig] = None + + +class ModelUsage(BaseModel): + pass + + +class PriceType(Enum): + """ + Enum class for price type. + """ + INPUT = "input" + OUTPUT = "output" + + +class PriceInfo(BaseModel): + """ + Model class for price info. + """ + unit_price: Decimal + unit: Decimal + total_amount: Decimal + currency: str diff --git a/api/core/model_runtime/entities/provider_entities.py b/api/core/model_runtime/entities/provider_entities.py new file mode 100644 index 00000000000000..bf3fe0878fa695 --- /dev/null +++ b/api/core/model_runtime/entities/provider_entities.py @@ -0,0 +1,149 @@ +from enum import Enum +from typing import Optional + +from pydantic import BaseModel + +from core.model_runtime.entities.common_entities import I18nObject +from core.model_runtime.entities.model_entities import ModelType, ProviderModel, AIModelEntity + + +class ConfigurateMethod(Enum): + """ + Enum class for configurate method of provider model. + """ + PREDEFINED_MODEL = "predefined-model" + CUSTOMIZABLE_MODEL = "customizable-model" + + +class FormType(Enum): + """ + Enum class for form type. + """ + TEXT_INPUT = "text-input" + SECRET_INPUT = "secret-input" + SELECT = "select" + RADIO = "radio" + SWITCH = "switch" + + +class FormShowOnObject(BaseModel): + """ + Model class for form show on. + """ + variable: str + value: str + + +class FormOption(BaseModel): + """ + Model class for form option. + """ + label: I18nObject + value: str + show_on: list[FormShowOnObject] = [] + + def __init__(self, **data): + super().__init__(**data) + if not self.label: + self.label = I18nObject( + en_US=self.value + ) + + +class CredentialFormSchema(BaseModel): + """ + Model class for credential form schema. + """ + variable: str + label: I18nObject + type: FormType + required: bool = True + default: Optional[str] = None + options: Optional[list[FormOption]] = None + placeholder: Optional[I18nObject] = None + max_length: int = 0 + show_on: list[FormShowOnObject] = [] + + +class ProviderCredentialSchema(BaseModel): + """ + Model class for provider credential schema. + """ + credential_form_schemas: list[CredentialFormSchema] + + +class FieldModelSchema(BaseModel): + label: I18nObject + placeholder: Optional[I18nObject] = None + + +class ModelCredentialSchema(BaseModel): + """ + Model class for model credential schema. + """ + model: FieldModelSchema + credential_form_schemas: list[CredentialFormSchema] + + +class SimpleProviderEntity(BaseModel): + """ + Simple model class for provider. + """ + provider: str + label: I18nObject + icon_small: Optional[I18nObject] = None + icon_large: Optional[I18nObject] = None + supported_model_types: list[ModelType] + models: list[AIModelEntity] = [] + + +class ProviderHelpEntity(BaseModel): + """ + Model class for provider help. + """ + title: I18nObject + url: I18nObject + + +class ProviderEntity(BaseModel): + """ + Model class for provider. + """ + provider: str + label: I18nObject + description: Optional[I18nObject] = None + icon_small: Optional[I18nObject] = None + icon_large: Optional[I18nObject] = None + background: Optional[str] = None + help: Optional[ProviderHelpEntity] = None + supported_model_types: list[ModelType] + configurate_methods: list[ConfigurateMethod] + models: list[ProviderModel] = [] + provider_credential_schema: Optional[ProviderCredentialSchema] = None + model_credential_schema: Optional[ModelCredentialSchema] = None + + class Config: + protected_namespaces = () + + def to_simple_provider(self) -> SimpleProviderEntity: + """ + Convert to simple provider. + + :return: simple provider + """ + return SimpleProviderEntity( + provider=self.provider, + label=self.label, + icon_small=self.icon_small, + icon_large=self.icon_large, + supported_model_types=self.supported_model_types, + models=self.models + ) + + +class ProviderConfig(BaseModel): + """ + Model class for provider config. + """ + provider: str + credentials: dict diff --git a/api/core/model_runtime/entities/rerank_entities.py b/api/core/model_runtime/entities/rerank_entities.py new file mode 100644 index 00000000000000..d51efd2b3be133 --- /dev/null +++ b/api/core/model_runtime/entities/rerank_entities.py @@ -0,0 +1,18 @@ +from pydantic import BaseModel + + +class RerankDocument(BaseModel): + """ + Model class for rerank document. + """ + index: int + text: str + score: float + + +class RerankResult(BaseModel): + """ + Model class for rerank result. + """ + model: str + docs: list[RerankDocument] diff --git a/api/core/model_runtime/entities/text_embedding_entities.py b/api/core/model_runtime/entities/text_embedding_entities.py new file mode 100644 index 00000000000000..7be3def3791333 --- /dev/null +++ b/api/core/model_runtime/entities/text_embedding_entities.py @@ -0,0 +1,28 @@ +from decimal import Decimal + +from pydantic import BaseModel + +from core.model_runtime.entities.model_entities import ModelUsage + + +class EmbeddingUsage(ModelUsage): + """ + Model class for embedding usage. + """ + tokens: int + total_tokens: int + unit_price: Decimal + price_unit: Decimal + total_price: Decimal + currency: str + latency: float + + +class TextEmbeddingResult(BaseModel): + """ + Model class for text embedding result. + """ + model: str + embeddings: list[list[float]] + usage: EmbeddingUsage + diff --git a/api/core/third_party/langchain/embeddings/__init__.py b/api/core/model_runtime/errors/__init__.py similarity index 100% rename from api/core/third_party/langchain/embeddings/__init__.py rename to api/core/model_runtime/errors/__init__.py diff --git a/api/core/model_runtime/errors/invoke.py b/api/core/model_runtime/errors/invoke.py new file mode 100644 index 00000000000000..fc51f5c748e66f --- /dev/null +++ b/api/core/model_runtime/errors/invoke.py @@ -0,0 +1,34 @@ +from typing import Optional + + +class InvokeError(Exception): + """Base class for all LLM exceptions.""" + description: Optional[str] = None + + def __init__(self, description: Optional[str] = None) -> None: + self.description = description + + +class InvokeConnectionError(InvokeError): + """Raised when the Invoke returns connection error.""" + description = "Connection Error" + + +class InvokeServerUnavailableError(InvokeError): + """Raised when the Invoke returns server unavailable error.""" + description = "Server Unavailable Error" + + +class InvokeRateLimitError(InvokeError): + """Raised when the Invoke returns rate limit error.""" + description = "Rate Limit Error" + + +class InvokeAuthorizationError(InvokeError): + """Raised when the Invoke returns authorization error.""" + description = "Incorrect model credentials provided, please check and try again. " + + +class InvokeBadRequestError(InvokeError): + """Raised when the Invoke returns bad request.""" + description = "Bad Request Error" diff --git a/api/core/model_runtime/errors/validate.py b/api/core/model_runtime/errors/validate.py new file mode 100644 index 00000000000000..8db79a52bb612a --- /dev/null +++ b/api/core/model_runtime/errors/validate.py @@ -0,0 +1,5 @@ +class CredentialsValidateFailedError(Exception): + """ + Credentials validate failed error + """ + pass diff --git a/api/tests/integration_tests/models/__init__.py b/api/core/model_runtime/model_providers/__base/__init__.py similarity index 100% rename from api/tests/integration_tests/models/__init__.py rename to api/core/model_runtime/model_providers/__base/__init__.py diff --git a/api/core/model_runtime/model_providers/__base/ai_model.py b/api/core/model_runtime/model_providers/__base/ai_model.py new file mode 100644 index 00000000000000..e0b1796da73548 --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/ai_model.py @@ -0,0 +1,328 @@ +import decimal +import json +import logging +import os +from abc import ABC, abstractmethod +from typing import Optional + +import yaml +from pydantic import ValidationError + +from core.model_runtime.entities.defaults import PARAMETER_RULE_TEMPLATE +from core.model_runtime.entities.model_entities import PriceInfo, AIModelEntity, PriceType, PriceConfig, \ + DefaultParameterName, FetchFrom, ModelType +from core.model_runtime.entities.common_entities import I18nObject +from core.model_runtime.errors.invoke import InvokeError, InvokeAuthorizationError +from core.model_runtime.model_providers.__base.tokenizers.gpt2_tokenzier import GPT2Tokenizer + + +class AIModel(ABC): + """ + Base class for all models. + """ + model_type: ModelType + model_schemas: list[AIModelEntity] = None + started_at: float = 0 + + @abstractmethod + def validate_credentials(self, model: str, credentials: dict) -> None: + """ + Validate model credentials + + :param model: model name + :param credentials: model credentials + :return: + """ + raise NotImplementedError + + @property + @abstractmethod + def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]: + """ + Map model invoke error to unified error + The key is the error type thrown to the caller + The value is the error type thrown by the model, + which needs to be converted into a unified error type for the caller. + + :return: Invoke error mapping + """ + raise NotImplementedError + + def _transform_invoke_error(self, error: Exception) -> InvokeError: + """ + Transform invoke error to unified error + + :param error: model invoke error + :return: unified error + """ + for invoke_error, model_errors in self._invoke_error_mapping.items(): + if isinstance(error, tuple(model_errors)): + if invoke_error == InvokeAuthorizationError: + return invoke_error(description="Incorrect model credentials provided, please check and try again. ") + + return invoke_error(description=f"{invoke_error.description}: {str(error)}") + + return InvokeError(description=f"Error: {str(error)}") + + def get_price(self, model: str, credentials: dict, price_type: PriceType, tokens: int) -> PriceInfo: + """ + Get price for given model and tokens + + :param model: model name + :param credentials: model credentials + :param price_type: price type + :param tokens: number of tokens + :return: price info + """ + # get model schema + model_schema = self.get_model_schema(model, credentials) + + # get price info from predefined model schema + price_config: Optional[PriceConfig] = None + if model_schema: + price_config: PriceConfig = model_schema.pricing + + # get unit price + unit_price = None + if price_config: + if price_type == PriceType.INPUT: + unit_price = price_config.input + elif price_type == PriceType.OUTPUT and price_config.output is not None: + unit_price = price_config.output + + if unit_price is None: + return PriceInfo( + unit_price=decimal.Decimal('0.0'), + unit=decimal.Decimal('0.0'), + total_amount=decimal.Decimal('0.0'), + currency="USD", + ) + + # calculate total amount + total_amount = tokens * unit_price * price_config.unit + total_amount = total_amount.quantize(decimal.Decimal('0.0000001'), rounding=decimal.ROUND_HALF_UP) + + return PriceInfo( + unit_price=unit_price, + unit=price_config.unit, + total_amount=total_amount, + currency=price_config.currency, + ) + + def predefined_models(self) -> list[AIModelEntity]: + """ + Get all predefined models for given provider. + + :return: + """ + if self.model_schemas: + return self.model_schemas + + model_schemas = [] + + # get module name + model_type = self.__class__.__module__.split('.')[-1] + + # get provider name + provider_name = self.__class__.__module__.split('.')[-3] + + # get the path of current classes + current_path = os.path.abspath(__file__) + # get parent path of the current path + provider_model_type_path = os.path.join(os.path.dirname(os.path.dirname(current_path)), provider_name, model_type) + + # get all yaml files path under provider_model_type_path that do not start with __ + model_schema_yaml_paths = [ + os.path.join(provider_model_type_path, model_schema_yaml) + for model_schema_yaml in os.listdir(provider_model_type_path) + if not model_schema_yaml.startswith('__') + and not model_schema_yaml.startswith('_') + and os.path.isfile(os.path.join(provider_model_type_path, model_schema_yaml)) + and model_schema_yaml.endswith('.yaml') + ] + + # get _position.yaml file path + position_file_path = os.path.join(provider_model_type_path, '_position.yaml') + + # read _position.yaml file + position_map = {} + if os.path.exists(position_file_path): + with open(position_file_path, 'r') as f: + position_map = yaml.safe_load(f) + + # traverse all model_schema_yaml_paths + for model_schema_yaml_path in model_schema_yaml_paths: + # read yaml data from yaml file + with open(model_schema_yaml_path, 'r') as f: + yaml_data = yaml.safe_load(f) + + new_parameter_rules = [] + for parameter_rule in yaml_data.get('parameter_rules', []): + if 'use_template' in parameter_rule: + try: + default_parameter_name = DefaultParameterName.value_of(parameter_rule['use_template']) + default_parameter_rule = self._get_default_parameter_rule_variable_map(default_parameter_name) + copy_default_parameter_rule = default_parameter_rule.copy() + copy_default_parameter_rule.update(parameter_rule) + parameter_rule = copy_default_parameter_rule + except ValueError: + pass + + if 'label' not in parameter_rule: + parameter_rule['label'] = { + 'zh_Hans': parameter_rule['name'], + 'en_US': parameter_rule['name'] + } + + new_parameter_rules.append(parameter_rule) + + yaml_data['parameter_rules'] = new_parameter_rules + + if 'label' not in yaml_data: + yaml_data['label'] = { + 'zh_Hans': yaml_data['model'], + 'en_US': yaml_data['model'] + } + + yaml_data['fetch_from'] = FetchFrom.PREDEFINED_MODEL.value + + try: + # yaml_data to entity + model_schema = AIModelEntity(**yaml_data) + except Exception as e: + model_schema_yaml_file_name = os.path.basename(model_schema_yaml_path).rstrip(".yaml") + raise Exception(f'Invalid model schema for {provider_name}.{model_type}.{model_schema_yaml_file_name}:' + f' {str(e)}') + + # cache model schema + model_schemas.append(model_schema) + + # resort model schemas by position + if position_map: + model_schemas.sort(key=lambda x: position_map.get(x.model, 999)) + + # cache model schemas + self.model_schemas = model_schemas + + return model_schemas + + def get_model_schema(self, model: str, credentials: Optional[dict] = None) -> Optional[AIModelEntity]: + """ + Get model schema by model name and credentials + + :param model: model name + :param credentials: model credentials + :return: model schema + """ + # get predefined models (predefined_models) + models = self.predefined_models() + + model_map = {model.model: model for model in models} + if model in model_map: + return model_map[model] + + if credentials: + model_schema = self.get_customizable_model_schema_from_credentials(model, credentials) + if model_schema: + return model_schema + + return None + + def get_customizable_model_schema_from_credentials(self, model: str, credentials: dict) -> Optional[AIModelEntity]: + """ + Get customizable model schema from credentials + + :param model: model name + :param credentials: model credentials + :return: model schema + """ + if 'schema' in credentials: + schema_dict = json.loads(credentials['schema']) + + try: + model_instance = AIModelEntity.parse_obj(schema_dict) + return model_instance + except ValidationError as e: + logging.exception(f"Invalid model schema for {model}") + return self._get_customizable_model_schema(model, credentials) + + return self._get_customizable_model_schema(model, credentials) + + def _get_customizable_model_schema(self, model: str, credentials: dict) -> Optional[AIModelEntity]: + """ + Get customizable model schema and fill in the template + """ + schema = self.get_customizable_model_schema(model, credentials) + + if not schema: + return None + + # fill in the template + new_parameter_rules = [] + for parameter_rule in schema.parameter_rules: + if parameter_rule.use_template: + try: + default_parameter_name = DefaultParameterName.value_of(parameter_rule.use_template) + default_parameter_rule = self._get_default_parameter_rule_variable_map(default_parameter_name) + if not parameter_rule.max: + parameter_rule.max = default_parameter_rule['max'] + if not parameter_rule.min: + parameter_rule.min = default_parameter_rule['min'] + if not parameter_rule.precision: + parameter_rule.default = default_parameter_rule['default'] + if not parameter_rule.precision: + parameter_rule.precision = default_parameter_rule['precision'] + if not parameter_rule.required: + parameter_rule.required = default_parameter_rule['required'] + if not parameter_rule.help: + parameter_rule.help = I18nObject( + en_US=default_parameter_rule['help']['en_US'], + ) + if not parameter_rule.help.en_US: + parameter_rule.help.en_US = default_parameter_rule['help']['en_US'] + if not parameter_rule.help.zh_Hans: + parameter_rule.help.zh_Hans = default_parameter_rule['help'].get('zh_Hans', default_parameter_rule['help']['en_US']) + except ValueError: + pass + + new_parameter_rules.append(parameter_rule) + + schema.parameter_rules = new_parameter_rules + + return schema + + def get_customizable_model_schema(self, model: str, credentials: dict) -> Optional[AIModelEntity]: + """ + Get customizable model schema + + :param model: model name + :param credentials: model credentials + :return: model schema + """ + return None + + def _get_default_parameter_rule_variable_map(self, name: DefaultParameterName) -> dict: + """ + Get default parameter rule for given name + + :param name: parameter name + :return: parameter rule + """ + default_parameter_rule = PARAMETER_RULE_TEMPLATE.get(name) + + if not default_parameter_rule: + raise Exception(f'Invalid model parameter rule name {name}') + + return default_parameter_rule + + def _get_num_tokens_by_gpt2(self, text: str) -> int: + """ + Get number of tokens for given prompt messages by gpt2 + Some provider models do not provide an interface for obtaining the number of tokens. + Here, the gpt2 tokenizer is used to calculate the number of tokens. + This method can be executed offline, and the gpt2 tokenizer has been cached in the project. + + :param text: plain text of prompt. You need to convert the original message to plain text + :return: number of tokens + """ + return GPT2Tokenizer.get_num_tokens(text) \ No newline at end of file diff --git a/api/tests/integration_tests/models/speech2text/audio.mp3 b/api/core/model_runtime/model_providers/__base/audio.mp3 similarity index 100% rename from api/tests/integration_tests/models/speech2text/audio.mp3 rename to api/core/model_runtime/model_providers/__base/audio.mp3 diff --git a/api/core/model_runtime/model_providers/__base/large_language_model.py b/api/core/model_runtime/model_providers/__base/large_language_model.py new file mode 100644 index 00000000000000..6b5ea88d40a090 --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/large_language_model.py @@ -0,0 +1,557 @@ +import logging +import os +import time +from abc import abstractmethod +from typing import Optional, Generator, Union, List + +from core.model_runtime.callbacks.base_callback import Callback +from core.model_runtime.callbacks.logging_callback import LoggingCallback +from core.model_runtime.entities.message_entities import PromptMessage, PromptMessageTool, AssistantPromptMessage +from core.model_runtime.entities.model_entities import ModelPropertyKey, PriceType, ParameterType, ParameterRule, \ + ModelType +from core.model_runtime.entities.llm_entities import LLMResult, LLMMode, LLMUsage, \ + LLMResultChunk, LLMResultChunkDelta +from core.model_runtime.model_providers.__base.ai_model import AIModel + +logger = logging.getLogger(__name__) + + +class LargeLanguageModel(AIModel): + """ + Model class for large language model. + """ + model_type: ModelType = ModelType.LLM + + def invoke(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: Optional[dict] = None, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None, callbacks: list[Callback] = None) \ + -> Union[LLMResult, Generator]: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :param callbacks: callbacks + :return: full response or stream response chunk generator result + """ + # validate and filter model parameters + if model_parameters is None: + model_parameters = {} + + model_parameters = self._validate_and_filter_model_parameters(model, model_parameters, credentials) + + self.started_at = time.perf_counter() + + callbacks = callbacks or [] + + if bool(os.environ.get("DEBUG")): + callbacks.append(LoggingCallback()) + + # trigger before invoke callbacks + self._trigger_before_invoke_callbacks( + model=model, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user, + callbacks=callbacks + ) + + try: + result = self._invoke(model, credentials, prompt_messages, model_parameters, tools, stop, stream, user) + except Exception as e: + self._trigger_invoke_error_callbacks( + model=model, + ex=e, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user, + callbacks=callbacks + ) + + raise self._transform_invoke_error(e) + + if stream and isinstance(result, Generator): + return self._invoke_result_generator( + model=model, + result=result, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user, + callbacks=callbacks + ) + else: + self._trigger_after_invoke_callbacks( + model=model, + result=result, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user, + callbacks=callbacks + ) + + return result + + def _invoke_result_generator(self, model: str, result: Generator, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, + stop: Optional[List[str]] = None, stream: bool = True, + user: Optional[str] = None, callbacks: list[Callback] = None) -> Generator: + """ + Invoke result generator + + :param result: result generator + :return: result generator + """ + prompt_message = AssistantPromptMessage( + content="" + ) + usage = None + system_fingerprint = None + real_model = model + + for chunk in result: + try: + yield chunk + + self._trigger_new_chunk_callbacks( + chunk=chunk, + model=model, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user, + callbacks=callbacks + ) + + prompt_message.content += chunk.delta.message.content + real_model = chunk.model + if chunk.delta.usage: + usage = chunk.delta.usage + + if chunk.system_fingerprint: + system_fingerprint = chunk.system_fingerprint + except Exception as e: + raise self._transform_invoke_error(e) + + self._trigger_after_invoke_callbacks( + model=model, + result=LLMResult( + model=real_model, + prompt_messages=prompt_messages, + message=prompt_message, + usage=usage, + system_fingerprint=system_fingerprint + ), + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user, + callbacks=callbacks + ) + + @abstractmethod + def _invoke(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, stop: Optional[List[str]] = None, + stream: bool = True, user: Optional[str] = None) \ + -> Union[LLMResult, Generator]: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :return: full response or stream response chunk generator result + """ + raise NotImplementedError + + @abstractmethod + def get_num_tokens(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], + tools: Optional[list[PromptMessageTool]] = None) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param tools: tools for tool calling + :return: + """ + raise NotImplementedError + + def _llm_result_to_stream(self, result: LLMResult) -> Generator: + """ + Transform llm result to stream + + :param result: llm result + :return: stream + """ + index = 0 + + tool_calls = result.message.tool_calls + + for word in result.message.content: + assistant_prompt_message = AssistantPromptMessage( + content=word, + tool_calls=tool_calls if index == (len(result.message.content) - 1) else [] + ) + + yield LLMResultChunk( + model=result.model, + prompt_messages=result.prompt_messages, + system_fingerprint=result.system_fingerprint, + delta=LLMResultChunkDelta( + index=index, + message=assistant_prompt_message, + ) + ) + + index += 1 + time.sleep(0.01) + + def get_parameter_rules(self, model: str, credentials: dict) -> list[ParameterRule]: + """ + Get parameter rules + + :param model: model name + :param credentials: model credentials + :return: parameter rules + """ + model_schema = self.get_model_schema(model, credentials) + if model_schema: + return model_schema.parameter_rules + + return [] + + def get_model_mode(self, model: str, credentials: Optional[dict] = None) -> LLMMode: + """ + Get model mode + + :param model: model name + :param credentials: model credentials + :return: model mode + """ + model_schema = self.get_model_schema(model, credentials) + + mode = LLMMode.CHAT + if model_schema and model_schema.model_properties.get(ModelPropertyKey.MODE): + mode = LLMMode.value_of(model_schema.model_properties[ModelPropertyKey.MODE]) + + return mode + + def _calc_response_usage(self, model: str, credentials: dict, prompt_tokens: int, completion_tokens: int) -> LLMUsage: + """ + Calculate response usage + + :param model: model name + :param credentials: model credentials + :param prompt_tokens: prompt tokens + :param completion_tokens: completion tokens + :return: usage + """ + # get prompt price info + prompt_price_info = self.get_price( + model=model, + credentials=credentials, + price_type=PriceType.INPUT, + tokens=prompt_tokens, + ) + + # get completion price info + completion_price_info = self.get_price( + model=model, + credentials=credentials, + price_type=PriceType.OUTPUT, + tokens=completion_tokens + ) + + # transform usage + usage = LLMUsage( + prompt_tokens=prompt_tokens, + prompt_unit_price=prompt_price_info.unit_price, + prompt_price_unit=prompt_price_info.unit, + prompt_price=prompt_price_info.total_amount, + completion_tokens=completion_tokens, + completion_unit_price=completion_price_info.unit_price, + completion_price_unit=completion_price_info.unit, + completion_price=completion_price_info.total_amount, + total_tokens=prompt_tokens + completion_tokens, + total_price=prompt_price_info.total_amount + completion_price_info.total_amount, + currency=prompt_price_info.currency, + latency=time.perf_counter() - self.started_at + ) + + return usage + + def _trigger_before_invoke_callbacks(self, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, + stop: Optional[List[str]] = None, stream: bool = True, + user: Optional[str] = None, callbacks: list[Callback] = None) -> None: + """ + Trigger before invoke callbacks + + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :param callbacks: callbacks + """ + if callbacks: + for callback in callbacks: + try: + callback.on_before_invoke( + llm_instance=self, + model=model, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user + ) + except Exception as e: + if callback.raise_error: + raise e + else: + logger.warning(f"Callback {callback.__class__.__name__} on_before_invoke failed with error {e}") + + def _trigger_new_chunk_callbacks(self, chunk: LLMResultChunk, model: str, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, + stop: Optional[List[str]] = None, stream: bool = True, + user: Optional[str] = None, callbacks: list[Callback] = None) -> None: + """ + Trigger new chunk callbacks + + :param chunk: chunk + :param model: model name + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + """ + if callbacks: + for callback in callbacks: + try: + callback.on_new_chunk( + llm_instance=self, + chunk=chunk, + model=model, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user + ) + except Exception as e: + if callback.raise_error: + raise e + else: + logger.warning(f"Callback {callback.__class__.__name__} on_new_chunk failed with error {e}") + + def _trigger_after_invoke_callbacks(self, model: str, result: LLMResult, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, + stop: Optional[List[str]] = None, stream: bool = True, + user: Optional[str] = None, callbacks: list[Callback] = None) -> None: + """ + Trigger after invoke callbacks + + :param model: model name + :param result: result + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :param callbacks: callbacks + """ + if callbacks: + for callback in callbacks: + try: + callback.on_after_invoke( + llm_instance=self, + result=result, + model=model, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user + ) + except Exception as e: + if callback.raise_error: + raise e + else: + logger.warning(f"Callback {callback.__class__.__name__} on_after_invoke failed with error {e}") + + def _trigger_invoke_error_callbacks(self, model: str, ex: Exception, credentials: dict, + prompt_messages: list[PromptMessage], model_parameters: dict, + tools: Optional[list[PromptMessageTool]] = None, + stop: Optional[List[str]] = None, stream: bool = True, + user: Optional[str] = None, callbacks: list[Callback] = None) -> None: + """ + Trigger invoke error callbacks + + :param model: model name + :param ex: exception + :param credentials: model credentials + :param prompt_messages: prompt messages + :param model_parameters: model parameters + :param tools: tools for tool calling + :param stop: stop words + :param stream: is stream response + :param user: unique user id + :param callbacks: callbacks + """ + if callbacks: + for callback in callbacks: + try: + callback.on_invoke_error( + llm_instance=self, + ex=ex, + model=model, + credentials=credentials, + prompt_messages=prompt_messages, + model_parameters=model_parameters, + tools=tools, + stop=stop, + stream=stream, + user=user + ) + except Exception as e: + if callback.raise_error: + raise e + else: + logger.warning(f"Callback {callback.__class__.__name__} on_invoke_error failed with error {e}") + + def _validate_and_filter_model_parameters(self, model: str, model_parameters: dict, credentials: dict) -> dict: + """ + Validate model parameters + + :param model: model name + :param model_parameters: model parameters + :param credentials: model credentials + :return: + """ + parameter_rules = self.get_parameter_rules(model, credentials) + + # validate model parameters + filtered_model_parameters = {} + for parameter_rule in parameter_rules: + parameter_name = parameter_rule.name + parameter_value = model_parameters.get(parameter_name) + if parameter_value is None: + if parameter_rule.use_template and parameter_rule.use_template in model_parameters: + # if parameter value is None, use template value variable name instead + parameter_value = model_parameters[parameter_rule.use_template] + else: + if parameter_rule.required: + if parameter_rule.default is not None: + filtered_model_parameters[parameter_name] = parameter_rule.default + continue + else: + raise ValueError(f"Model Parameter {parameter_name} is required.") + else: + continue + + # validate parameter value type + if parameter_rule.type == ParameterType.INT: + if not isinstance(parameter_value, int): + raise ValueError(f"Model Parameter {parameter_name} should be int.") + + # validate parameter value range + if parameter_rule.min is not None and parameter_value < parameter_rule.min: + raise ValueError( + f"Model Parameter {parameter_name} should be greater than or equal to {parameter_rule.min}.") + + if parameter_rule.max is not None and parameter_value > parameter_rule.max: + raise ValueError( + f"Model Parameter {parameter_name} should be less than or equal to {parameter_rule.max}.") + elif parameter_rule.type == ParameterType.FLOAT: + if not isinstance(parameter_value, (float, int)): + raise ValueError(f"Model Parameter {parameter_name} should be float.") + + # validate parameter value precision + if parameter_rule.precision is not None: + if parameter_rule.precision == 0: + if parameter_value != int(parameter_value): + raise ValueError(f"Model Parameter {parameter_name} should be int.") + else: + if parameter_value != round(parameter_value, parameter_rule.precision): + raise ValueError( + f"Model Parameter {parameter_name} should be round to {parameter_rule.precision} decimal places.") + + # validate parameter value range + if parameter_rule.min is not None and parameter_value < parameter_rule.min: + raise ValueError( + f"Model Parameter {parameter_name} should be greater than or equal to {parameter_rule.min}.") + + if parameter_rule.max is not None and parameter_value > parameter_rule.max: + raise ValueError( + f"Model Parameter {parameter_name} should be less than or equal to {parameter_rule.max}.") + elif parameter_rule.type == ParameterType.BOOLEAN: + if not isinstance(parameter_value, bool): + raise ValueError(f"Model Parameter {parameter_name} should be bool.") + elif parameter_rule.type == ParameterType.STRING: + if not isinstance(parameter_value, str): + raise ValueError(f"Model Parameter {parameter_name} should be string.") + + # validate options + if parameter_rule.options and parameter_value not in parameter_rule.options: + raise ValueError(f"Model Parameter {parameter_name} should be one of {parameter_rule.options}.") + else: + raise ValueError(f"Model Parameter {parameter_name} type {parameter_rule.type} is not supported.") + + filtered_model_parameters[parameter_name] = parameter_value + + return filtered_model_parameters diff --git a/api/core/model_runtime/model_providers/__base/model_provider.py b/api/core/model_runtime/model_providers/__base/model_provider.py new file mode 100644 index 00000000000000..71d4a0c5d6bbf6 --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/model_provider.py @@ -0,0 +1,125 @@ +import importlib +import os +from abc import ABC, abstractmethod +from typing import Optional, Dict + +import yaml + +from core.model_runtime.entities.model_entities import ModelType, AIModelEntity +from core.model_runtime.entities.provider_entities import ProviderEntity +from core.model_runtime.model_providers.__base.ai_model import AIModel + + +class ModelProvider(ABC): + provider_schema: ProviderEntity = None + model_instance_map: Dict[str, AIModel] = {} + + @abstractmethod + def validate_provider_credentials(self, credentials: dict) -> None: + """ + Validate provider credentials + You can choose any validate_credentials method of model type or implement validate method by yourself, + such as: get model list api + + if validate failed, raise exception + + :param credentials: provider credentials, credentials form defined in `provider_credential_schema`. + """ + raise NotImplementedError + + def get_provider_schema(self) -> ProviderEntity: + """ + Get provider schema + + :return: provider schema + """ + if self.provider_schema: + return self.provider_schema + + # get dirname of the current path + provider_name = self.__class__.__module__.split('.')[-1] + + # get the path of the model_provider classes + base_path = os.path.abspath(__file__) + current_path = os.path.join(os.path.dirname(os.path.dirname(base_path)), provider_name) + + # read provider schema from yaml file + yaml_path = os.path.join(current_path, f'{provider_name}.yaml') + yaml_data = {} + if os.path.exists(yaml_path): + with open(yaml_path, 'r') as f: + yaml_data = yaml.safe_load(f) + + try: + # yaml_data to entity + provider_schema = ProviderEntity(**yaml_data) + except Exception as e: + raise Exception(f'Invalid provider schema for {provider_name}: {str(e)}') + + # cache schema + self.provider_schema = provider_schema + + return provider_schema + + def models(self, model_type: ModelType) -> list[AIModelEntity]: + """ + Get all models for given model type + + :param model_type: model type defined in `ModelType` + :return: list of models + """ + provider_schema = self.get_provider_schema() + if model_type not in provider_schema.supported_model_types: + return [] + + # get model instance of the model type + model_instance = self.get_model_instance(model_type) + + # get predefined models (predefined_models) + models = model_instance.predefined_models() + + # return models + return models + + def get_model_instance(self, model_type: ModelType) -> AIModel: + """ + Get model instance + + :param model_type: model type defined in `ModelType` + :return: + """ + # get dirname of the current path + provider_name = self.__class__.__module__.split('.')[-1] + + if f"{provider_name}.{model_type.value}" in self.model_instance_map: + return self.model_instance_map[f"{provider_name}.{model_type.value}"] + + # get the path of the model type classes + base_path = os.path.abspath(__file__) + model_type_name = model_type.value.replace('-', '_') + model_type_path = os.path.join(os.path.dirname(os.path.dirname(base_path)), provider_name, model_type_name) + model_type_py_path = os.path.join(model_type_path, f'{model_type_name}.py') + + if not os.path.isdir(model_type_path) or not os.path.exists(model_type_py_path): + raise Exception(f'Invalid model type {model_type} for provider {provider_name}') + + # Dynamic loading {model_type_name}.py file and find the subclass of AIModel + parent_module = '.'.join(self.__class__.__module__.split('.')[:-1]) + spec = importlib.util.spec_from_file_location(f"{parent_module}.{model_type_name}.{model_type_name}", model_type_py_path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + + model_class = None + for name, obj in vars(mod).items(): + if (isinstance(obj, type) and issubclass(obj, AIModel) and not obj.__abstractmethods__ + and obj != AIModel): + model_class = obj + break + + if not model_class: + raise Exception(f'Missing AIModel Class for model type {model_type} in {model_type_py_path}') + + model_instance_map = model_class() + self.model_instance_map[f"{provider_name}.{model_type.value}"] = model_instance_map + + return model_instance_map diff --git a/api/core/model_runtime/model_providers/__base/moderation_model.py b/api/core/model_runtime/model_providers/__base/moderation_model.py new file mode 100644 index 00000000000000..00cb1d6cc31624 --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/moderation_model.py @@ -0,0 +1,48 @@ +import time +from abc import abstractmethod +from typing import Optional + +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.model_providers.__base.ai_model import AIModel + + +class ModerationModel(AIModel): + """ + Model class for moderation model. + """ + model_type: ModelType = ModelType.MODERATION + + def invoke(self, model: str, credentials: dict, + text: str, user: Optional[str] = None) \ + -> bool: + """ + Invoke moderation model + + :param model: model name + :param credentials: model credentials + :param text: text to moderate + :param user: unique user id + :return: false if text is safe, true otherwise + """ + self.started_at = time.perf_counter() + + try: + return self._invoke(model, credentials, text, user) + except Exception as e: + raise self._transform_invoke_error(e) + + @abstractmethod + def _invoke(self, model: str, credentials: dict, + text: str, user: Optional[str] = None) \ + -> bool: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param text: text to moderate + :param user: unique user id + :return: false if text is safe, true otherwise + """ + raise NotImplementedError + diff --git a/api/core/model_runtime/model_providers/__base/rerank_model.py b/api/core/model_runtime/model_providers/__base/rerank_model.py new file mode 100644 index 00000000000000..2c86f25180eab8 --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/rerank_model.py @@ -0,0 +1,56 @@ +import time +from abc import abstractmethod +from typing import Optional + +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.entities.rerank_entities import RerankResult +from core.model_runtime.model_providers.__base.ai_model import AIModel + + +class RerankModel(AIModel): + """ + Base Model class for rerank model. + """ + model_type: ModelType = ModelType.RERANK + + def invoke(self, model: str, credentials: dict, + query: str, docs: list[str], score_threshold: Optional[float] = None, top_n: Optional[int] = None, + user: Optional[str] = None) \ + -> RerankResult: + """ + Invoke rerank model + + :param model: model name + :param credentials: model credentials + :param query: search query + :param docs: docs for reranking + :param score_threshold: score threshold + :param top_n: top n + :param user: unique user id + :return: rerank result + """ + self.started_at = time.perf_counter() + + try: + return self._invoke(model, credentials, query, docs, score_threshold, top_n, user) + except Exception as e: + raise self._transform_invoke_error(e) + + @abstractmethod + def _invoke(self, model: str, credentials: dict, + query: str, docs: list[str], score_threshold: Optional[float] = None, top_n: Optional[int] = None, + user: Optional[str] = None) \ + -> RerankResult: + """ + Invoke rerank model + + :param model: model name + :param credentials: model credentials + :param query: search query + :param docs: docs for reranking + :param score_threshold: score threshold + :param top_n: top n + :param user: unique user id + :return: rerank result + """ + raise NotImplementedError diff --git a/api/core/model_runtime/model_providers/__base/speech2text_model.py b/api/core/model_runtime/model_providers/__base/speech2text_model.py new file mode 100644 index 00000000000000..151bccc0748fd3 --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/speech2text_model.py @@ -0,0 +1,57 @@ +import os +from abc import abstractmethod +from typing import Optional, IO + +from core.model_runtime.entities.model_entities import ModelType +from core.model_runtime.model_providers.__base.ai_model import AIModel + + +class Speech2TextModel(AIModel): + """ + Model class for speech2text model. + """ + model_type: ModelType = ModelType.SPEECH2TEXT + + def invoke(self, model: str, credentials: dict, + file: IO[bytes], user: Optional[str] = None) \ + -> str: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param file: audio file + :param user: unique user id + :return: text for given audio file + """ + try: + return self._invoke(model, credentials, file, user) + except Exception as e: + raise self._transform_invoke_error(e) + + @abstractmethod + def _invoke(self, model: str, credentials: dict, + file: IO[bytes], user: Optional[str] = None) \ + -> str: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param file: audio file + :param user: unique user id + :return: text for given audio file + """ + raise NotImplementedError + + def _get_demo_file_path(self) -> str: + """ + Get demo file for given model + + :return: demo file + """ + # Get the directory of the current file + current_dir = os.path.dirname(os.path.abspath(__file__)) + + # Construct the path to the audio file + return os.path.join(current_dir, 'audio.mp3') diff --git a/api/core/model_runtime/model_providers/__base/text_embedding_model.py b/api/core/model_runtime/model_providers/__base/text_embedding_model.py new file mode 100644 index 00000000000000..1da4dcef9182fe --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/text_embedding_model.py @@ -0,0 +1,90 @@ +import time +from abc import abstractmethod +from typing import Optional + +from core.model_runtime.entities.model_entities import ModelPropertyKey, ModelType +from core.model_runtime.entities.text_embedding_entities import TextEmbeddingResult +from core.model_runtime.model_providers.__base.ai_model import AIModel + + +class TextEmbeddingModel(AIModel): + """ + Model class for text embedding model. + """ + model_type: ModelType = ModelType.TEXT_EMBEDDING + + def invoke(self, model: str, credentials: dict, + texts: list[str], user: Optional[str] = None) \ + -> TextEmbeddingResult: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param texts: texts to embed + :param user: unique user id + :return: embeddings result + """ + self.started_at = time.perf_counter() + + try: + return self._invoke(model, credentials, texts, user) + except Exception as e: + raise self._transform_invoke_error(e) + + @abstractmethod + def _invoke(self, model: str, credentials: dict, + texts: list[str], user: Optional[str] = None) \ + -> TextEmbeddingResult: + """ + Invoke large language model + + :param model: model name + :param credentials: model credentials + :param texts: texts to embed + :param user: unique user id + :return: embeddings result + """ + raise NotImplementedError + + @abstractmethod + def get_num_tokens(self, model: str, credentials: dict, texts: list[str]) -> int: + """ + Get number of tokens for given prompt messages + + :param model: model name + :param credentials: model credentials + :param texts: texts to embed + :return: + """ + raise NotImplementedError + + def _get_context_size(self, model: str, credentials: dict) -> int: + """ + Get context size for given embedding model + + :param model: model name + :param credentials: model credentials + :return: context size + """ + model_schema = self.get_model_schema(model, credentials) + + if model_schema and ModelPropertyKey.CONTEXT_SIZE in model_schema.model_properties: + return model_schema.model_properties[ModelPropertyKey.CONTEXT_SIZE] + + return 1000 + + def _get_max_chunks(self, model: str, credentials: dict) -> int: + """ + Get max chunks for given embedding model + + :param model: model name + :param credentials: model credentials + :return: max chunks + """ + model_schema = self.get_model_schema(model, credentials) + + if model_schema and ModelPropertyKey.MAX_CHUNKS in model_schema.model_properties: + return model_schema.model_properties[ModelPropertyKey.MAX_CHUNKS] + + return 1 diff --git a/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/merges.txt b/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/merges.txt new file mode 100644 index 00000000000000..226b0752cac778 --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/merges.txt @@ -0,0 +1,50001 @@ +#version: 0.2 +Ġ t +Ġ a +h e +i n +r e +o n +Ġt he +e r +Ġ s +a t +Ġ w +Ġ o +e n +Ġ c +i t +i s +a n +o r +e s +Ġ b +e d +Ġ f +in g +Ġ p +o u +Ġa n +a l +a r +Ġt o +Ġ m +Ġo f +Ġ in +Ġ d +Ġ h +Ġan d +i c +a s +l e +Ġt h +i on +o m +l l +en t +Ġ n +Ġ l +s t +Ġ re +v e +Ġ e +r o +l y +Ġb e +Ġ g +Ġ T +c t +Ġ S +i d +o t +Ġ I +u t +e t +Ġ A +Ġ is +Ġ on +i m +a m +o w +a y +a d +s e +Ġth at +Ġ C +i g +Ġf or +a c +Ġ y +v er +u r +Ġ u +l d +Ġs t +Ġ M +' s +Ġ he +Ġ it +at ion +it h +i r +c e +Ġy ou +i l +Ġ B +Ġw h +o l +Ġ P +Ġw ith +Ġ 1 +t er +c h +Ġa s +Ġw e +Ġ ( +n d +i ll +Ġ D +i f +Ġ 2 +a g +er s +k e +Ġ " +Ġ H +e m +Ġc on +Ġ W +Ġ R +he r +Ġw as +Ġ r +o d +Ġ F +u l +at e +Ġa t +r i +p p +o re +ĠT he +Ġs e +u s +Ġp ro +Ġh a +u m +Ġa re +Ġd e +a in +an d +Ġo r +ig h +es t +is t +a b +r om +Ġ N +t h +Ġc om +Ġ G +u n +o p +0 0 +Ġ L +Ġn ot +es s +Ġe x +Ġ v +re s +Ġ E +e w +it y +an t +Ġb y +e l +o s +or t +o c +q u +Ġf rom +Ġha ve +Ġs u +i ve +ou ld +Ġs h +Ġth is +n t +r a +p e +igh t +ar t +m ent +Ġa l +u st +en d +- - +al l +Ġ O +ac k +Ġc h +Ġ le +i es +re d +ar d +â Ģ +ou t +Ġ J +Ġa b +e ar +i v +al ly +ou r +o st +g h +p t +Ġp l +as t +Ġc an +a k +om e +u d +T he +Ġh is +Ġd o +Ġg o +Ġh as +g e +' t +Ġ U +r ou +Ġs a +Ġ j +Ġb ut +Ġw or +Ġa ll +e ct +Ġ k +am e +Ġw ill +o k +Ġw he +Ġthe y +id e +0 1 +f f +ic h +p l +t her +Ġt r +. . +Ġin t +i e +u re +ag e +Ġn e +i al +a p +in e +ic e +Ġm e +Ġo ut +an s +on e +on g +ion s +Ġwh o +Ġ K +Ġu p +Ġthe ir +Ġa d +Ġ 3 +Ġu s +at ed +ou s +Ġm ore +u e +o g +ĠS t +in d +i ke +Ġs o +im e +p er +. " +b er +i z +a ct +Ġon e +Ġsa id +Ġ - +a re +Ġyou r +c c +ĠT h +Ġc l +e p +a ke +ab le +i p +Ġcon t +Ġwh ich +i a +Ġ im +Ġab out +Ġwe re +ver y +u b +Ġh ad +Ġ en +Ġcom p +, " +ĠI n +Ġu n +Ġa g +i re +ac e +a u +ar y +Ġw ould +as s +r y +Ġ âĢ +c l +o ok +e re +s o +Ġ V +ig n +i b +Ġof f +Ġt e +v en +Ġ Y +i le +o se +it e +or m +Ġ2 01 +Ġre s +Ġm an +Ġp er +Ġo ther +or d +ul t +Ġbe en +Ġl ike +as e +an ce +k s +ay s +ow n +en ce +Ġd is +ct ion +Ġan y +Ġa pp +Ġs p +in t +res s +ation s +a il +Ġ 4 +ic al +Ġthe m +Ġhe r +ou nt +ĠC h +Ġa r +Ġ if +Ġthe re +Ġp e +Ġy ear +a v +Ġm y +Ġs ome +Ġwhe n +ou gh +ac h +Ġth an +r u +on d +ic k +Ġo ver +ve l +Ġ qu +Ċ Ċ +Ġs c +re at +re e +ĠI t +ou nd +p ort +Ġal so +Ġp art +f ter +Ġk n +Ġbe c +Ġt ime +en s +Ġ 5 +op le +Ġwh at +Ġn o +d u +m er +an g +Ġn ew +-- -- +Ġg et +or y +it ion +ing s +Ġj ust +Ġint o +Ġ 0 +ent s +o ve +t e +Ġpe ople +Ġp re +Ġit s +Ġre c +Ġt w +i an +ir st +ar k +or s +Ġwor k +ad e +o b +Ġs he +Ġo ur +w n +in k +l ic +Ġ1 9 +ĠH e +is h +nd er +au se +Ġh im +on s +Ġ [ +Ġ ro +f orm +i ld +at es +ver s +Ġon ly +o ll +Ġs pe +c k +e ll +am p +Ġa cc +Ġb l +i ous +ur n +f t +o od +Ġh ow +he d +Ġ ' +Ġa fter +a w +Ġat t +o v +n e +Ġpl ay +er v +ic t +Ġc ould +it t +Ġa m +Ġf irst +Ġ 6 +Ġa ct +Ġ $ +e c +h ing +u al +u ll +Ġcom m +o y +o ld +c es +at er +Ġf e +Ġbe t +w e +if f +Ġtw o +oc k +Ġb ack +) . +id ent +Ġu nder +rou gh +se l +x t +Ġm ay +rou nd +Ġp o +p h +is s +Ġd es +Ġm ost +Ġd id +Ġad d +j ect +Ġin c +f ore +Ġp ol +on t +Ġag ain +cl ud +ter n +Ġkn ow +Ġne ed +Ġcon s +Ġc o +Ġ . +Ġw ant +Ġse e +Ġ 7 +n ing +i ew +ĠTh is +c ed +Ġe ven +Ġin d +t y +ĠW e +at h +Ġthe se +Ġp r +Ġu se +Ġbec ause +Ġf l +n g +Ġn ow +ĠâĢ ĵ +c om +is e +Ġm ake +Ġthe n +ow er +Ġe very +ĠU n +Ġse c +os s +u ch +Ġe m +Ġ = +ĠR e +i ed +r it +Ġin v +le ct +Ġsu pp +at ing +Ġl ook +m an +pe ct +Ġ 8 +ro w +Ġb u +Ġwhe re +if ic +Ġyear s +i ly +Ġd iff +Ġsh ould +Ġre m +T h +I n +Ġe v +d ay +' re +ri b +Ġre l +s s +Ġde f +Ġr ight +Ġs y +) , +l es +00 0 +he n +Ġth rough +ĠT r +_ _ +Ġw ay +Ġd on +Ġ , +Ġ1 0 +as ed +Ġas s +ub lic +Ġre g +ĠA nd +i x +Ġ very +Ġin clud +ot her +Ġim p +ot h +Ġsu b +ĠâĢ Ķ +Ġbe ing +ar g +ĠW h += = +ib le +Ġdo es +an ge +r am +Ġ 9 +er t +p s +it ed +ation al +Ġb r +Ġd own +Ġman y +ak ing +Ġc all +ur ing +it ies +Ġp h +ic s +al s +Ġde c +at ive +en er +Ġbe fore +il ity +Ġwe ll +Ġm uch +ers on +Ġth ose +Ġsu ch +Ġ ke +Ġ end +ĠB ut +as on +t ing +Ġl ong +e f +Ġth ink +y s +Ġbe l +Ġs m +it s +a x +Ġo wn +Ġpro v +Ġs et +if e +ment s +b le +w ard +Ġsh ow +Ġp res +m s +om et +Ġo b +Ġs ay +ĠS h +t s +f ul +Ġe ff +Ġg u +Ġin st +u nd +re n +c ess +Ġ ent +ĠY ou +Ġgo od +Ġst art +in ce +Ġm ade +t t +st em +ol og +u p +Ġ | +um p +Ġhe l +ver n +ul ar +u ally +Ġa c +Ġm on +Ġl ast +Ġ2 00 +1 0 +Ġst ud +u res +ĠA r +sel f +ar s +mer ic +u es +c y +Ġm in +oll ow +Ġc ol +i o +Ġm od +Ġc ount +ĠC om +he s +Ġf in +a ir +i er +âĢ Ķ +re ad +an k +at ch +e ver +Ġst r +Ġpo int +or k +ĠN ew +Ġs ur +o ol +al k +em ent +Ġus ed +ra ct +we en +Ġs ame +ou n +ĠA l +c i +Ġdiff ere +Ġwh ile +---- ---- +Ġg ame +ce pt +Ġs im +.. . +Ġin ter +e k +Ġre port +Ġpro du +Ġst ill +l ed +a h +Ġhe re +Ġwor ld +Ġth ough +Ġn um +ar ch +im es +al e +ĠS e +ĠI f +/ / +ĠL e +Ġre t +Ġre f +Ġtr ans +n er +ut ion +ter s +Ġt ake +ĠC l +Ġcon f +w ay +a ve +Ġgo ing +Ġs l +u g +ĠA meric +Ġspe c +Ġh and +Ġbet ween +ist s +ĠD e +o ot +I t +Ġe ar +Ġagain st +Ġh igh +g an +a z +at her +Ġex p +Ġo p +Ġin s +Ġg r +Ġhel p +Ġre qu +et s +in s +ĠP ro +is m +Ġf ound +l and +at a +us s +am es +Ġp erson +Ġg reat +p r +Ġs ign +ĠA n +' ve +Ġs omet +Ġs er +h ip +Ġr un +Ġ : +Ġt er +ire ct +Ġf ollow +Ġd et +ic es +Ġf ind +1 2 +Ġm em +Ġc r +e red +e x +Ġex t +ut h +en se +c o +Ġte am +v ing +ou se +as h +at t +v ed +Ġsy stem +ĠA s +d er +iv es +m in +Ġle ad +ĠB l +c ent +Ġa round +Ġgo vern +Ġc ur +vel op +an y +Ġc our +al th +ag es +iz e +Ġc ar +od e +Ġl aw +Ġre ad +' m +c on +Ġre al +Ġsupp ort +Ġ1 2 +.. .. +Ġre ally +n ess +Ġf act +Ġd ay +Ġb oth +y ing +Ġs erv +ĠF or +Ġth ree +Ġw om +Ġm ed +od y +ĠThe y +5 0 +Ġex per +t on +Ġe ach +ak es +Ġc he +Ġc re +in es +Ġre p +1 9 +g g +ill ion +Ġg rou +ut e +i k +W e +g et +E R +Ġm et +Ġs ays +o x +Ġd uring +er n +iz ed +a red +Ġf am +ic ally +Ġha pp +ĠI s +Ġch ar +m ed +v ent +Ġg ener +i ent +p le +i et +re nt +1 1 +v es +pt ion +Ġ2 0 +form ation +Ġc or +Ġoff ic +ie ld +Ġto o +is ion +Ġin f +Ġ Z +t he +o ad +Ġp ublic +Ġpro g +r ic +* * +Ġw ar +Ġp ower +v iew +Ġf ew +Ġl oc +Ġdiffere nt +Ġst ate +Ġhe ad +' ll +Ġp oss +Ġst at +re t +ant s +Ġv al +Ġis s +Ġc le +i vers +an c +Ġex pl +Ġan other +Ġ Q +Ġa v +th ing +n ce +W h +Ġch ild +Ġs ince +i red +l ess +Ġl ife +Ġde velop +itt le +Ġde p +Ġp ass +ã ĥ +Ġt urn +or n +Th is +b ers +ro ss +ĠA d +Ġf r +Ġres p +Ġsec ond +o h +Ġ / +Ġdis c +Ġ & +Ġsomet hing +Ġcomp le +Ġ ed +Ġf il +Ġmon th +a j +u c +Ġgovern ment +Ġwith out +Ġle g +Ġd ist +Ġp ut +Ġqu est +an n +Ġpro t +2 0 +Ġne ver +i ence +Ġle vel +Ġar t +Ġth ings +Ġm ight +Ġeff ect +Ġcont ro +Ġc ent +Ġ1 8 +Ġall ow +Ġbel ie +ch ool +ot t +Ġinc re +Ġfe el +Ġres ult +Ġl ot +Ġf un +ot e +Ġt y +ere st +Ġcont in +Ġus ing +Ġb ig +2 01 +Ġas k +Ġb est +Ġ ) +I N +Ġo pp +3 0 +Ġnum ber +in ess +S t +le ase +Ġc a +Ġm ust +Ġd irect +Ġg l +Ġ < +Ġop en +Ġp ost +Ġcom e +Ġse em +ord ing +Ġwe ek +ate ly +it al +Ġe l +ri end +Ġf ar +Ġt ra +in al +Ġp ri +ĠU S +Ġpl ace +Ġfor m +Ġto ld +" : +ain s +at ure +ĠTr ump +Ġst and +Ġ # +id er +ĠF r +Ġne xt +Ġs oc +Ġp ur +Ġle t +Ġl ittle +Ġh um +Ġ i +r on +1 5 +Ġ1 5 +Ġcomm un +Ġm ark +ĠThe re +Ġw r +ĠTh at +Ġin formation +w ays +Ġb us +a pp +Ġinv est +m e +Ġh ard +ain ed +e ad +Ġim port +Ġapp ro +Ġt est +Ġt ri +Ġre st +os ed +Ġf ull +Ġc are +ĠS p +Ġc ase +O N +Ġs k +Ġl ess +Ġ + +Ġpart ic +ĠP l +ab ly +u ck +is hed +ch n +b e +Ġl ist +at or +Ġto p +Ġad v +ĠB e +ru ct +Ġd em +r ation +l ing +g y +re en +g er +Ġh ome +Ġle ft +Ġbet ter +Ġd ata +Ġ1 1 +Ġatt ack +Ġpro ble +l ine +ard s +Ġbe h +r al +ĠH ow +ĠS he +ar ge +Ġ -- +: // +Ġb ro +ĠP h +at s +Ġbu ild +w w +id ed +a im +as es +en cy +Ġm ain +in ed +Ġinclud ing +Ġ { +Ġg ot +Ġint erest +Ġke ep +Ġ X +Ġe as +ain ing +Ġcl ass +âĢ ¦ +ĠN o +Ġv ar +Ġsm all +amp le +A T +Ġ ide +ĠS o +Ġre ce +Ġpol it +Ġm ov +Ġpl an +Ġper cent +iv ing +Ġc amp +Ġp ay +1 4 +s c +is ed +Ġu nt +one y +pl oy +== == +Ġdid n +ĠI nd +el s +ert ain +Ġp os +__ __ +i ver +Ġpro cess +Ġprog ram +if ied +ĠR ep +1 6 +u ro +olog y +at ter +in a +Ġn ame +ĠA ll +Ġf our +Ġret urn +v ious +b s +Ġcall ed +Ġm ove +ĠS c +ir d +Ġgrou p +Ġb re +Ġm en +Ġc ap +t en +e e +Ġd ri +le g +he re +uth or +Ġp at +Ġcur rent +id es +Ġp op +t o +ent ion +Ġal ways +Ġm il +Ġwom en +Ġ1 6 +Ġo ld +iv en +ra ph +ĠO r +r or +ent ly +Ġn ear +ĠE x +re am +s h +Ġ1 4 +Ġf ree +iss ion +st and +ĠC on +al ity +us ed +1 3 +Ġdes ign +Ġch ange +Ġch ang +Ġb o +Ġv is +em ber +Ġb ook +read y +Ġk ill +2 5 +pp ed +Ġa way +Ġab le +Ġcount ry +Ġcon st +ar n +Ġor der +A R +i or +i um +or th +1 8 +ail able +Ġs w +Ġm illion +Ġ1 3 +at ic +t ed +ĠG o +Ġo per +en g +Ġth ing +aj or +con om +ĠCom m +Ġwh y +u red +ur al +Ġs chool +b y +ĠM ar +Ġa ff +Ġd ays +Ġan n +us h +an e +I f +e g +Ġpro f +Ġhe alth +ou th +B ut +ion al +. , +Ġs ol +Ġal ready +Ġ3 0 +Ġchar act +H e +Ġf riend +E S +i ans +ic le +' d +ĠO n +Ġle ast +Ġp rom +Ġd r +Ġh ist +it her +Ġ est +i qu +1 7 +s on +Ġte ll +Ġt alk +oh n +o int +le ction +A N +Ġunt il +au gh +Ġl ater +Ġ ve +Ġv iew +end ing +iv ed +Ġwor d +w are +Ġc ost +Ġen ough +Ġg ive +ĠUn ited +Ġte chn +are nt +O R +Ġp ar +ĠD r +Ġ201 6 +r ist +er ing +Ġ  +Ġl arge +s ide +ac y +cc ess +Ġw in +Ġimport ant +Ġ19 9 +Ġdoes n +Ġ1 7 +Ġbus iness +Ġcle ar +Ġre se +" , +ur y +Ġe qu +as ter +al f +ĠAmeric an +n ect +Ġex pect +ivers ity +Ġo cc +ĠF l +Ġk ind +Ġme an +Ġp ast +Ġde v +Ġb as +le t +ra ft +Ġor gan +Ġde l +Ġper form +Ġst ory +Ġse ason +ĠC ol +Ġcl aim +Ġc ame +Ġwith in +Ġl ine +Ġpro ject +ĠA t +Ġcontro l +end ed +ĠS y +Ġa ir +iz ation +Ġ * +le y +Ġm oney +id d +Y ou +f or +Ġfam ily +Ġm aking +Ġb it +Ġpol ice +Ġhapp en +Ġ vers +on y +u ff +ĠW hen +Ġs it +ide o +l f +is on +Ġsu re +g in +Ġapp ear +Ġl ight +Ġ es +o f +Ġw ater +Ġt imes +n ot +Ġg row +Ġcomp any +ĠT e +ow s +Ġm ar +our ce +i ol +ar m +b r +Ġex ample +Ġcon c +Ġf ore +ĠT o +p ro +E N +ri es +Ġ2 5 +ĠC an +ne y +Ġact ually +Ġe ver +ur ity +ak en +ap s +Ġt ax +Ġm ajor +am a +Ġof ten +er al +Ġhum an +Ġj ob +is ter +Ġav ailable +oc r +en n +a id +iv id +Ġrec ord +? " +Ġs ing +ĠA m +id ence +Ġnew s +st er +Ġe conom +Ġfollow ing +ĠB r +is ing +Ġh our +m ost +um ent +Ġse x +Ġdes c +Ġbec ome +ĠE d +Ġto ok +Ġha ving +Ġprodu ct +a ult +A s +ar ing +Ġme ans +Ġh op +un e +Ġch o +Ġc ertain +Ġn on +Ġde al +2 4 +le ment +oc i +en e +Ġs ide +ĠP r +ĠM ay +Ġre ason +u ed +c hed +ul ation +Ġe lect +Ġoffic ial +Ġposs ible +Ġh old +and s +ot s +Ġc ity +or ies +Ġse ver +Ġchild ren +Ġon ce +Ġact iv +l er +Ġn ight +it ions +ĠJ ohn +a pe +pl ay +Ġd one +Ġl im +Ġwork ing +ĠP res +or ld +e b +ĠC o +Ġb ody +ail s +ut es +ĠM r +Ġwhe ther +Ġa uthor +ro p +Ġpro per +Ġse en +) ; +Ġf ac +ĠS u +Ġcon d +it ing +Ġcour se +Ġ } +-------- -------- +a ign +Ġev ent +Ġen g +Ġp ot +Ġin tern +i am +Ġsh ort +em pt +ã Ĥ +ĠG od +il ar +8 0 +Ġor ig +I S +our n +ab ility +it ive +Ġd am +Ġ1 00 +Ġp ress +Ġdo ing +Ġprot ect +r ing +Ġthough t +Ġquest ion +re w +ĠW ar +Ġsever al +ĠSt ate +Ġg iven +Ġf und +ĠT w +Ġw ent +an ces +w ork +p or +m y +4 0 +Ġar g +art ment +ust om +Ġpol ic +Ġme et +Ġc reat +2 2 +ĠSt ates +Ġg ames +ra w +ut ure +Ġunder stand +ur s +ĠO b +l ish +s y +Ġm akes +Ġw on +ag on +Ġh tt +Ġl ove +ent ial +Ġcomple te +p ar +ĠI m +A L +Ġacc ount + ł +ore d +ver t +Ġ ident +Ġ201 5 +Ġother s +ĠM in +i ber +ver age +The re +ition al +d d +Ġpro b +Ġyou ng +Ġal ong +Ġacc ording +Ġy et +Ġmem bers +ĠWh at +o id +ĠM an +A nd +Ġam ong +a i +Ġem ploy +ĠR es +Ġ > +Ġinv ol +Ġl ow +a f +ĠC ar +Ġh ig +ĠO ne +ĠS ec +in ation +Ġlike ly +Ġan t +ag ed +ĠR uss +Ġb en +Ġre le +F or +b ack +ĠN ot +Ġpres ident +b all +Ġacc ess +ivid ual +ĠD em +ĠE uro +6 0 +Ġkn own +ir l +ĠG r +Ġear ly +u se +iet y +âĢ ĵ +Ġf ight +Ġs ent +Ġto day +Ġmark et +" . +Ġb ased +Ġstr ong +ur ther +Ġde b +m ber +Ġproble m +Ġde ath +Ġsoc ial +im ate +A S +ort un +Ġcamp aign +er y +C h +Ġe y +i ally +Ġm us +w h +p os +Ġ er +Ġsa f +Ġmonth s +ir on +Ġv iol +Ġf ive +Ġst re +Ġplay ers +in c +al d +y ear +a un +Ġsu ccess +Ġpres ent +ere nce +Ġ201 4 +Ġsu gg +Ġpartic ular +Ġtr y +Ġsugg est +ĠCh rist +on es +Ġpri v +2 3 +Ġc rit +Ġl and +Ġloc al +if y +2 9 +Ġa ut +E D +ĠG u +Ġm ult +Ġpolit ical +Ġask ed +Ġfor mer +it ter +ri pt +Ġcl ose +Ġp ract +ĠY ork +Ġget ting +Ġac ross +Ġcom b +Ġbelie ve +Ġ z +Ġto get +Ġtoget her +ĠC ent +ir c +Ġind ividual +ĠM c +2 7 +is k +ĠE ng +Ġf ace +Ġ2 4 +Ġval ue +Ġare a +e v +Ġw rit +ĠPres ident +Ġv ot +Ġke y +Ġm om +p ut +Ġany thing +Ġexper ience +att le +Ġm ind +a ff +om m +Ġf uture +g ed +Ġc ut +Ġto t +it ch +Ġv ideo +Ġinvest ig +Ġn et +ĠM y +r ict +i en +. ) +Ġimp ro +th ough +ward s +Ġcon nect +ĠM ed +sel ves +ens ive +m b +o ber +at ors +A n +Ġ5 0 +Ġre du +res ent +Ġab ove +Ġf re +ĠEuro pe +s w +Ġam ount +ĠA pp +Ġe ither +Ġmil it +Ġan al +Ġf ail +ĠE n +al es +Ġspec ial +Ġbl ack +I T +c her +Ġlook ing +Ġf ire +y n +Ġal most +o on +Ġstud y +Ġm iss +c hes +ro wn +Ġt re +Ġcommun ity +Ġmed ia +Ġf ood +Ġcom es +ĠUn iversity +Ġsing le +Wh at +u ly +Ġh alf +ag ue +h od +ĠRep ublic +Ġstart ed +Ġqu ick +ot o +b ook +Ġiss ue +it or +Ġel se +Ġcons ider +2 6 +ro du +Ġt aken +2 8 +9 9 +ĠW ith +Ġtr ue +Ġw a +Ġtr ad +Ġag o +Ġm ess +ie f +Ġadd ed +o ke +Ġb ad +Ġf av +3 3 +Ġsim ilar +as k +ĠD on +Ġcharact er +ort s +ĠH ouse +Ġreport ed +Ġty pe +v al +i od +ĠHow ever +Ġt arg +Ġent ire +pp ing +Ġhist ory +Ġl ive +ff ic +.... .... +ed eral +Ġtr ying +Ġdisc uss +ĠH ar +ac es +l ished +Ġse lf +os p +re st +Ġro om +el t +Ġf all +ol ution +Ġe t +Ġ x +Ġis n +Ġide a +b o +Ġs ound +ĠD ep +Ġsome one +ci ally +ull y +Ġf oc +Ġob ject +if t +ap er +Ġplay er +Ġr ather +Ġserv ice +as hing +ĠD o +ĠP art +ru g +m on +p ly +Ġm or +Ġnot hing +Ġprov ide +I C +un g +Ġpart y +Ġex ist +Ġm ag +7 0 +Ġr ul +Ġh ouse +Ġbeh ind +Ġhow ever +ĠW orld +Ġs um +Ġapp lic +Ġ ; +Ġfun ction +g r +ĠP ol +Ġfr ont +2 00 +Ġser ies +Ġt em +Ġty p +ill s +Ġo pt +Ġpoint s +Ġbel ow +itt ed +Ġspec ific +Ġ201 7 +um b +Ġr a +Ġpre vious +Ġpre t +re me +Ġc ustom +Ġcour t +ĠM e +Ġre pl +Ġwho le +g o +c er +Ġt reat +ĠA ct +Ġprob ably +Ġle arn +end er +ĠA ss +Ġvers ion +n ow +Ġche ck +ĠC al +R E +min ist +O n +our ces +Ġben ef +Ġd oc +Ġdet er +Ġen c +Ġsu per +Ġadd ress +Ġv ict +Ġ201 3 +Ġme as +t r +Ġf ield +W hen +Ġsign ific +u ge +Ġfe at +Ġcomm on +l oad +Ġbe gin +Ġbr ing +Ġa ction +er man +Ġdesc rib +Ġind ust +Ġwant ed +ri ed +m ing +Ġatt empt +4 5 +f er +Ġd ue +ress ion +# # +Ġsh all +Ġs ix +o o +Ġst ep +Ġp ub +Ġhim self +Ġ2 3 +Ġc op +Ġd est +Ġst op +A C +ib ility +Ġl ab +ic ult +Ġhour s +Ġcre ate +Ġf urther +ĠAmeric a +ĠC ity +Ġd ou +he ad +S T +ĠN orth +c ing +Ġn ational +u le +ĠIn st +Ġt aking +ĠQ u +ir t +Ġre d +Ġrese arch +v iron +ĠG e +Ġbre ak +an a +Ġsp ace +ater ial +Ġrec ent +ĠA b +Ġgener al +Ġh it +Ġper iod +Ġevery thing +ive ly +Ġph ys +Ġsay ing +an ks +Ġc ou +Ġc ult +ac ed +e al +u ation +Ġc oun +l u +Ġinclud e +Ġpos ition +ĠA fter +ĠCan ad +ĠE m +Ġim m +ĠR ed +Ġp ick +Ġcom pl +Ġm atter +re g +e xt +ang u +is c +o le +a ut +Ġcomp et +e ed +f ect +Ġ2 1 +ĠS en +ĠThe se +as ing +Ġcan not +Ġin it +Ġrel ations +ac hed +Ġb ar +Ġ4 0 +ĠT H +Ġ201 2 +Ġv ol +Ġg round +Ġsec urity +Ġup d +il t +3 5 +Ġconc ern +ĠJ ust +Ġwh ite +Ġseem s +ĠH er +pe cially +i ents +Ġann oun +Ġf ig +ight s +Ġst ri +l ike +id s +Ġs us +Ġw atch +Ġ â +Ġw ind +ĠC ont +Ġit self +Ġm ass +A l +y le +iqu e +ĠN ational +Ġab s +Ġp ack +Ġout side +Ġan im +Ġp ain +et er +Ġman ag +du ct +og n +Ġ ] +ĠSe pt +se c +o ff +ĠJ an +Ġf oot +ad es +Ġth ird +Ġm ot +Ġev idence +int on +Ġth reat +a pt +pl es +c le +Ġl o +Ġde cl +Ġit em +med i +Ġrep resent +om b +am er +Ġsignific ant +og raph +s u +Ġc al +i res +00 00 +I D +A M +Ġsim ply +Ġlong er +Ġf ile +O T +c he +S o +ate g +or g +ĠH is +Ġen er +Ġd om +Ġup on +il i +": " +Ġthem selves +Ġcom ing +Ġqu ite +Ġdiff icult +ĠB ar +il ities +re l +end s +c ial +6 4 +Ġwom an +ra p +y r +Ġne cess +ip s +Ġte xt +Ġrequ ire +Ġmilit ary +Ġre view +Ġresp ons +7 5 +Ġsub ject +Ġinst ead +Ġiss ues +Ġg en +" ," +Ġmin utes +Ġwe ap +r ay +am ed +t ime +b l +H ow +Ġc ode +ĠS m +Ġhig her +ĠSt e +r is +Ġp age +Ġstud ents +ĠIn tern +Ġmet hod +ĠA ug +ĠP er +ĠA g +Ġpolic y +ĠS w +Ġex ec +Ġac cept +um e +rib ut +Ġword s +Ġfin al +Ġchang es +ĠDem ocr +Ġfriend s +Ġres pect +Ġe p +Ġcomp an +iv il +Ġdam age +** ** +og le +viron ment +Ġne g +ent al +Ġa p +Ġtot al +iv al +! " +l im +Ġneed s +Ġag re +Ġdevelop ment +Ġa ge +ip le +2 1 +Ġresult s +ĠA f +S h +Ġg un +ĠOb ama +ro ll +Ġ @ +Ġright s +ĠB rit +Ġrun ning +Ġwas n +Ġp ort +Ġr ate +Ġpret ty +Ġtarg et +Ġsa w +Ġc irc +Ġwor ks +ic ro +al t +o ver +ww w +Th at +l ier +Ġevery one +ud e +Ġp ie +idd le +ra el +Ġr ad +Ġbl ock +Ġw alk +T o +ã ģ +n es +ĠA ust +a ul +ro te +ĠS outh +ess ion +op h +Ġshow s +Ġs ite +Ġj o +Ġr isk +cl us +l t +Ġin j +id ing +ĠS pe +Ġch all +ir m +Ġ2 2 +itt ing +st r +Ġh y +L E +ke y +Ġbe gan +at ur +ashing ton +l am +ĠD av +b it +Ġs ize +ĠP ar +3 8 +ourn al +f ace +Ġdec ision +Ġl arg +Ġj ud +re ct +Ġcontin ue +ĠO ct +ove red +ĠI nt +==== ==== +Ġp arent +ĠW ill +Ġeas y +Ġd rug +ang er +Ġs ense +Ġd i +id ay +Ġener gy +ist ic +Ġass oci +ar ter +ob al +e ks +ĠE l +ur ch +Ġg irl +o e +it le +Ġ2 8 +ĠC he +Ġrequ est +Ġso on +Ġh ost +k y +Ġst ates +om es +Ġm aterial +le x +Ġmom ent +Ġan sw +on se +Ġes pecially +Ġn orm +Ġserv ices +p ite +r an +Ġro le +4 4 +) : +Ġc red +C l +____ ____ +Ġm at +Ġl og +ĠCl inton +O U +Ġoff ice +Ġ2 6 +Ġch arg +Ġtr ack +m a +Ġhe art +Ġb all +Ġperson al +Ġbuild ing +n a +s et +b ody +ĠBl ack +Ġincre ase +itt en +Ġneed ed +3 6 +3 2 += " +Ġl ost +Ġbec ame +Ġgrou ps +ĠM us +Ġw rote +ĠP e +Ġpro p +j oy +à © +ĠWh ite +Ġde ad +. ' +Ġhtt p +Ġwe bs +O S +Ġins ide +Ġwr ong +Ġstat ement +Ġ ... +y l +Ġfil m +Ġmus ic +Ġsh are +ific ation +Ġre lease +Ġfor ward +Ġst ay +Ġcomp ut +it te +s er +Ġorig inal +Ġc ard +Ġc and +Ġd iv +at ural +Ġfav or +O M +Ġc ases +us es +Ġse ction +Ġle ave +g ing +ov ed +ĠW ashington +3 9 +ĠG l +Ġrequ ired +act ion +ap an +o or +it er +ĠK ing +Ġcount ries +ĠG erman +ll ing +Ġ2 7 +3 4 +Ġquest ions +Ġpr im +Ġc ell +Ġsh oot +Ġany one +ĠW est +Ġaff ect +ep end +Ġon line +ĠIs rael +ĠSept ember +Ġab ility +Ġcont ent +is es +Ġre ve +Ġl aun +Ġind ic +Ġfor ce +c ast +Ġso ld +av ing +f l +Ġso ft +Ġcompan ies +ce ed +Ġart icle +Ġa ud +Ġre v +Ġed uc +Ġplay ing +0 5 +Ġhe ld +ct or +Ġrele ased +Ġf ederal +3 7 +Ġad minist +Ġinter view +Ġinst all +Ġrece ived +Ġs ource +u k +P h +Ġser ious +Ġcre ated +Ġc ause +Ġim medi +Ġdef in +u el +ĠDep artment +ct ions +ĠC our +ĠN ow +z e +it es +it ution +Ġl ate +Ġspe ak +n ers +Ġleg al +ar i +ĠC or +Ġwe eks +Ġmod el +Ġp red +Ġex act +B C +ĠB y +IN G +os ing +Ġt akes +Ġreg ard +Ġopp ortun +Ġpr ice +Ġ19 8 +ĠA pr +f ully +Ġor d +Ġproble ms +ru ction +h am +ĠC ount +le ge +Ġlead ers +E T +le v +Ġde ep +olog ical +es e +h aps +ĠS ome +Ġp ers +Ġcont ract +Ġrelations hip +s p +ou d +Ġb ase +4 8 +m it +A d +anc ial +Ġcons um +Ġpot ential +Ġl angu +re m +et h +Ġrel ig +ress ed +6 6 +Ġl ink +Ġl ower +ay er +ĠJ une +Ġf em +un t +er c +ur d +Ġcont act +Ġ ill +Ġm other +Ġest ab +h tt +ĠM arch +ĠB ro +ĠCh ina +Ġ2 9 +Ġs qu +Ġprov ided +Ġa verage +as ons +Ġ201 1 +Ġex am +l in +5 5 +n ed +Ġper fect +Ġt ou +al se +u x +Ġbu y +Ġsh ot +Ġcol lect +Ġph ot +Ġplay ed +Ġsur pr +Ġofficial s +Ġsim ple +av y +Ġindust ry +Ġhand s +g round +Ġp ull +Ġr ound +Ġus er +Ġr ange +u ary +Ġpriv ate +op s +e es +Ġw ays +ĠM ich +Ġve h +Ġex cept +Ġter ms +im um +pp er +I ON +ore s +ĠDr agon +ou l +Ġd en +Ġperform ance +Ġb ill +c il +4 7 +Ġen vironment +Ġex c +ad d +Ġwor th +Ġp ict +Ġch ance +Ġ201 8 +b or +Ġspe ed +ict ion +Ġal leg +ĠJ apan +at ory +re et +Ġm atch +ĠI I +Ġst ru +ord er +Ġst e +Ġl iving +Ġst ruct +in o +Ġse par +her n +Ġresp onse +Ġen joy +Ġv ia +A D +um ents +ace book +Ġmem ber +ib r +iz ing +Ġto ol +ĠM on +ĠWh ile +h ood +ĠA ng +ĠD ef +Ġoff er +T r +a ur +Ġturn ed +ĠJ uly +d own +an ced +Ġrec ently +ĠE ar +Ġc e +ĠSt ar +ĠC ong +rough t +Ġbl ood +Ġhop e +Ġcom ment +ain t +Ġar ri +il es +Ġpartic ip +ough t +ri ption +0 8 +4 9 +Ġg ave +Ġse lect +Ġkill ed +sy ch +Ġgo es +i j +Ġc oll +Ġimp act +at ives +ĠS er +0 9 +ĠAug ust +Ġb oy +d e +ĠD es +Ġf elt +U S +Ġexpect ed +Ġim age +ĠM ark +cc ording +o ice +E C +ĠM ag +en ed +h old +ĠP ost +Ġpre vent +N o +Ġinvol ved +Ġey es +Ġquick ly +A t +un k +Ġbeh av +Ġ ur +Ġl ed +c ome +e y +Ġcand id +Ġear lier +Ġfoc us +et y +P ro +led ge +ix ed +ill ed +Ġpop ular +A P +Ġset t +l ight +Ġvar ious +in ks +Ġlevel s +Ġro ad +ell ig +ab les +he l +itte e +ĠG ener +y pe +Ġhe ard +ic les +Ġm is +Ġus ers +ĠS an +Ġimpro ve +Ġf ather +Ġse arch +The y +v il +Ġprof ess +Ġkn ew +Ġl oss +Ġev ents +6 5 +Ġb illion +0 7 +0 2 +ĠNew s +ĠA M +Ġco ver +w here +ens ion +Ġb ott +Ġare as +en ces +op e +ĠTw itter +a el +Ġget s +ĠGo ogle +Ġs n +i ant +Ġv ote +Ġnear ly +Ġinclud ed +Ġrec ogn +z z +m m +al ed +Ġhappen ed +0 4 +Ġh ot +Ġwho se +Ġc ivil +Ġsu ff +o es +it iz +ĠSy ri +Ġresp ond +Ġh on +Ġfeat ures +Ġeconom ic +ĠApr il +r im +Ġtechn ology +Ġo ption +ag ing +Ġpur ch +R e +Ġl at +ch ie +is l +Ġrec omm +u f +Ġtr aining +Ġeffect s +Ġf ast +Ġ201 0 +Ġocc ur +Ġwebs ite +Ġem ail +Ġs ens +e ch +Ġo il +Ġinf lu +Ġcurrent ly +ĠS ch +ĠAd d +Ġgo al +Ġsc ient +Ġcon v +1 00 +em y +Ġdec ided +Ġtra vel +Ġm ention +L L +0 3 +Ġe lection +Ġph one +Ġlook s +Ġsit uation +Ġc y +Ġh or +b ed +ĠCour t +a ily +av es +Ġqu ality +ĠCom p +w ise +Ġt able +Ġst aff +ĠW ind +et t +Ġtri ed +ide red +Ġadd ition +Ġb ox +Ġl ack +ar ily +Ġw ide +Ġm id +Ġbo ard +ys is +Ġant i +h a +Ġd ig +en ing +Ġd ro +C on +6 8 +Ġsl ow +b ased +se qu +Ġp ath +E x +ak er +Ġwork ed +Ġp en +Ġeng ine +Ġlook ed +ĠSu per +ĠS erv +Ġvict im +U n +Ġproper ty +Ġint rodu +Ġexec ut +ĠP M +L e +Ġcol or +ĠM ore +Ġ6 0 +Ġnet work +Ġd ate +c ul +id ge +Ġext ra +3 1 +Ġs le +6 7 +Ġw ond +Ġreport s +j ust +ĠAust ral +Ġcap ital +Ġen s +Ġcomm and +Ġallow ed +Ġpre p +Ġca pt +h ib +Ġnum bers +ch an +Ġf air +m p +om s +Ġre ach +W ith +t ain +Ġbro ad +Ġcou ple +ec ause +ly ing +ĠF eb +Ġsc reen +Ġl ives +Ġpri or +ĠCong ress +A r +Ġappro ach +Ġe mer +ar ies +ĠD is +s erv +ĠN e +Ġbu ilt +c ies +Ġre pe +Ġrul es +for ce +ĠP al +Ġfin ancial +Ġcons idered +ĠCh ar +n ces +ĠI S +Ġb rought +Ġb i +i ers +ĠS im +O P +Ġproduct s +Ġvis it +Ġdoc ument +Ġcon duct +Ġcomplete ly +in ing +ĠCal if +ib ly +Ġwr itten +ĠT V +em ents +Ġd raw +O ne +Ġpub lished +Ġsec ret +r ain +he t +ĠF acebook +ond ay +ĠU p +Ġsex ual +Ġth ous +ĠP at +Ġ ess +Ġstand ard +Ġar m +g es +ect ion +Ġf ell +Ġfore ign +an i +ĠFr iday +Ġreg ular +in ary +Ġincre ased +Ġus ually +Ġdem on +Ġd ark +Ġadd itional +ro l +ĠO f +Ġprodu ction +! ! +und red +Ġintern ational +id ents +ĠF ree +rou p +Ġr ace +Ġm ach +Ġh uge +A ll +le ar +ove mber +Ġto wn +Ġatt ention +ĠO ff +y ond +ĠThe n +f ield +Ġter ror +ra z +ĠB o +Ġmeet ing +ĠP ark +Ġar rest +Ġf ear +Ġa w +ĠV al +or ing +' , +Ġext reme +ar r +Ġwork ers +A fter +Ġ3 1 +n et +am ent +Ġdirect ly +Ġpop ulation +ub e +ĠOct ober +ĠI N +ĠJan uary +5 9 +ĠDav id +Ġc ross +ce mber +ĠF irst +Ġmess age +ir it +Ġn ation +Ġp oll +is ions +Ġansw er +n y +is ode +Ġcar ry +ĠRuss ia +Ġhe ar +eng th +ro y +Ġn atural +in ally +Ġdo g +m itted +Ġtr ade +Ġsub st +Ġmult iple +ĠAf ric +Ġf ans +Ġs ort +Ġgl obal +ic ation +ĠW ed +ar a +Ġa chie +Ġlangu age +ve y +Ġt al +Ġnecess ary +Ġdet ails +Ġs en +ĠS und +ĠRe g +ĠR ec +0 6 +Ġs il +ress ive +Ġmed ical +un ch +orn ia +Ġu nd +f ort +oc ks +ĠM onday +ues day +c raft +7 7 +ur t +Ġ ver +ĠH ill +Ġrece ive +Ġmor ning +es tern +Ġb ank +Ġs at +ir th +ĠH igh +Ġdev ice +ĠTH E +ĠCent er +Ġsaf e +Ġp le +ĠCanad a +Ġsystem s +Ġass ist +Ġsur v +Ġb attle +ĠS oc +vert is +S he +Ġp aper +Ġgrow th +Ġc ast +S c +Ġpl ans +ll ed +Ġpart s +Ġw all +Ġmove ment +Ġpract ice +im ately +Ġdis play +Ġsomet imes +om p +ĠP aul +ĠY es +k ing +5 8 +o ly +Ġs on +Ġav oid +ok es +ĠJ ew +Ġto wards +as c +Ġ // +ĠK ore +Ġtalk ing +Ġcor rect +Ġsp ent +ic ks +i able +e ared +Ġter m +Ġwant s +om ing +Ġ ut +Ġdou b +Ġfor ces +Ġp lease +6 9 +ĠN ovember +at form +ond on +Ġon es +Ġimmedi ately +ĠRuss ian +ĠM et +Ġde g +Ġparent s +C H +ĠAmeric ans +al y +ĠM od +Ġsh own +Ġcond itions +Ġst uff +Ġre b +ĠY our +Ġinclud es +n own +ĠS am +Ġexper ien +m ission +ĠE ven +augh t +Ġannoun ced +ĠRepublic an +Ġdeter min +Ġdescrib ed +ĠCount y +( ) +Ġdo or +Ġchang ed +Ġne igh +ĠH ere +Ġcle an +Ġp an +ĠDe cember +ĠEurope an +ir ing +ap ter +Ġcl ub +ĠT uesday +Ġp aid +ĠN et +Ġattack s +Ġcharact ers +Ġal one +Ġdirect or +d om +Ġ3 5 +Ġl oad +Ġr out +ĠCalif ornia +Ġfin ally +Ġr ac +Ġcont r +Ġexact ly +res h +p ri +ĠIs lam +Ġn ature +Ġcare er +Ġlat est +Ġcon vers +ĠS l +p ose +ci ent +ĠIn c +iv ity +8 8 +ĠA tt +ĠM or +nes day +Ġwe ight +k en +Ġnot e +Ġteam s +Ġ \ +air s +ĠG reen +Ġh undred +on ent +Ġstre ng +Ġcons ist +ic ated +Ġreg ul +Ġl ic +ast ic +Ġt en +urs day +ellig ence +ous ly +ĠU K +B I +Ġcost s +Ġind epend +ĠA P +Ġnorm al +Ġh om +Ġob vious +Ġs we +Ġst ar +Ġread y +ac her +Ġimp lement +g est +Ġs ong +ĠG et +ĠL ab +Ġinterest ing +us ing +Ġg iving +ĠSund ay +Ġet c +Ġm iddle +Ġrem ember +r ight +os ition +ut ions +Ġm ax +4 6 +Ġyour self +Ġdem and +Ġtreat ment +Ġd anger +ĠC ons +Ġgu y +ĠBrit ish +Ġphys ical +Ġrel ated +Ġrem ain +Ġcould n +Ġref er +Ġc itiz +b ox +EN T +bo ard +Ġin n +I G +er o +ĠSt reet +osp ital +ren ch +cher s +Ġst ra +O L +ag er +ĠA N +Ġeas ily +I A +en ge +in y +Ġcl os +ock ed +Ġus es +ĠC oun +I m +u ild +? ? +m ore +Ġan g +Ġwr ite +ol ute +5 7 +Ġlead er +Ġread ing +< / +Ġaut om +est s +4 3 +Ġleg isl +ĠG old +Ġdesign ed +ĠS T +ĠLe g +a res +Ġbe aut +ĠT ex +Ġappear s +Ġstru gg +ĠR om +Ġ 00 +Ġcho ice +Ġparticular ly +ĠF rom +op er +ĠL ondon +ann ed +Ġallow s +ob ile +Ġdiffere nce +âĢ ¢ +ĠV iew +ĠWed nesday +Ġal though +Ġrel ative +Ġapplic ation +ate ver +Ġare n +Ġmy self +Ġim ag +Ġdis e +Ġsoc iety +Ġfre qu +ĠEng lish +Ġpo or +ĠD ay +Ġwrit ing +Ġse ven +Ġstart ing +Ġb ud +Ġpr int +ĠTr ans +uf act +ĠSt ud +n ew +Ġcr im +Ġg ives +Ġco ol +a e +i ance +ĠGener al +Ġthink ing +Ġsa ve +Ġlim ited +ĠPart y +Ġmean ing +p en +ow ers +ĠJ ack +E M +Ġn ice +ru pt +Ġg as +Ġe ight +Ġfe et +Ġeff ort +Ġ ign +ic it +B l +co in +Ġop in +Ġbr ain +Wh ile +he st +ĠTh ursday +Ġwould n +augh ter +Ġtou ch +le ments +Ġstud ies +Ġcent er +c ont +or ge +Ġcomput er +Ġinvestig ation +P l +or ks +Ġ200 8 +Ġincre asing +Ġst ore +Ġcom ments +Ġb al +m en +Ġdo ll +Ġl iber +Ġw ife +Ġlaw s +atur day +it ness +Ġmod ern +ĠS k +Ġadminist ration +Ġopportun ity +Ġs al +Ġpower ful +M y +Ġclaim s +ĠEar th +ord s +Ġt itle +Ġes c +n ame +N ot +om en +Ġbe yond +Ġc amer +Ġse ll +it ute +ear ch +Ġapp l +im ent +4 2 +ĠAr t +Ġun f +Ġviol ence +ur g +ĠE ast +Ġcomp ared +Ġopt ions +Ġthrough out +Ġv s +ig r +. [ +ac hes +7 8 +Ġfil es +F L +E L +ar ian +ĠJ ames +ĠA ir +an ch +Ġdet ail +Ġpie ce +P S +Ġn amed +Ġeduc ation +Ġdri ve +Ġitem s +Ġstud ent +ic ed +: : +ic o +Ġth row +Ġsc ene +Ġcomple x +Ġ200 9 +Ġpre c +ĠB re +7 9 +Ġcon cept +Ġstat us +am ing +Ġd ied +Ġknow ledge +Ġbegin ning +O D +ru ary +Ġcertain ly +Ġgu ys +Ġsl ight +in n +ound s +Ġf ine +Ġf at +ic ations +Ġper haps +ĠA nt +Ġinc ome +Ġhtt ps +Ġmajor ity +port s +st on +Ġgreat er +Ġfe ed +ent ially +Ġsaf ety +Ġun ique +and om +Ġg one +Ġshow ed +Ġhist or +Ġcoun ter +i us +id a +Ġlead ing +i pe +Ġs end +ĠDon ald +er ve +Ġdef ense +ines e +Ġy es +ĠF ire +ĠMus lim +ra q +Ġcontin ued +os h +Ġprov ides +Ġpr ison +ĠP re +Ġhapp y +Ġeconom y +Ġtr ust +ag s +ĠG ame +Ġweap ons +um an +ĠC le +it ation +Ġanal ysis +ĠT imes +Ġsc ience +- > +Ġfig ure +Ġdis app +ent y +Ġsoft ware +Ġu lt +Ġoffic ers +N ew +I s +Ġrem ains +ĠInd ia +Ġp sych +ri ef +Ġc at +es c +Ġob serv +Ġst age +ĠD ark +Ġent er +ch ange +Ġpass ed +Ġdes pite +ĠO ut +Ġmov ie +r s +Ġv oice +m ine +ĠPl ay +Ġto ward +ĠT er +Ġreg ion +Ġval ues +or ters +Ġm ount +Ġoffic er +ĠO ther +b an +Ġh ous +w ood +ro om +I V +ĠS un +se e +ĠO ver +ro g +9 0 +Ġl ay +ĠT ur +a wn +Ġpress ure +ĠS ub +Ġbook s +ed om +ĠS and +A A +ag o +Ġre asons +f ord +Ġactiv ity +U T +N ow +ĠSen ate +ce ll +n ight +Ġcall s +in ter +Ġlet ter +ĠR ob +ĠJ e +Ġcho ose +ĠL aw +G et +B e +Ġro b +Ġtyp es +Ġpl atform +Ġqu arter +R A +ĠT ime +Ġmay be +ĠC r +9 5 +p re +Ġmov ing +Ġl if +Ġgo ld +Ġs om +Ġpat ients +Ġtr uth +ĠK e +ur ance +ant ly +m ar +Ġchar ge +ĠG reat +Ġce le +---------------- ---------------- +Ġro ck +ro id +an cy +Ġcred it +a ud +B y +ĠE very +Ġmov ed +ing er +rib ution +Ġn ames +Ġstra ight +ĠHe alth +ĠW ell +Ġfe ature +Ġr ule +Ġsc he +in ated +ĠMich ael +ber g +4 1 +il ed +b and +Ġcl ick +ĠAng el +on ents +Â Ń +ĠI raq +ĠS aturday +Ġa ware +p art +Ġpat tern +O W +ĠL et +Ġgr ad +ign ed +Ġassoci ated +Ġst yle +n o +i ation +a ith +il ies +Ġst ories +ur ation +Ġindividual s +ĠâĢ ¦ +m iss +ĠAss oci +ish ing +ab y +Ġsum mer +ĠB en +Ġ3 2 +Ġar ch +ut y +ĠTex as +h ol +Ġfull y +Ġm ill +Ġfollow ed +ĠB ill +ĠInd ian +ĠSec ret +ĠB el +ĠFeb ruary +Ġjob s +Ġseem ed +ĠGo vern +i pped +Ġreal ity +Ġl ines +Ġp ark +Ġmeas ure +ĠO ur +I M +Ġbro ther +Ġgrow ing +Ġb an +Ġest im +Ġc ry +ĠS chool +Ġme chan +ĠO F +ĠWind ows +Ġr ates +ĠO h +Ġpos itive +Ġcult ure +ist ics +ic a +Ġh ar +y a +ite ly +i pp +Ġm ap +en cies +ĠWill iam +I I +ak ers +5 6 +ĠM art +ĠR em +Ġal tern +it ude +Ġco ach +row d +D on +Ġk ids +Ġj ournal +Ġcor por +Ġf alse +Ġwe b +Ġsle ep +Ġcont ain +Ġst o +Ġb ed +iver se +ĠR ich +ĠCh inese +Ġp un +Ġme ant +k nown +Ġnot ice +Ġfavor ite +a ven +Ġcond ition +Ġpur pose +) ) +Ġorgan ization +Ġchall eng +Ġman ufact +Ġsus p +ĠA c +Ġcrit ic +un es +uc lear +Ġm er +vent ion +Ġ8 0 +Ġm ist +ĠU s +ĠT or +htt p +ol f +Ġlarg er +Ġadv ant +Ġrese ar +Ġact ions +m l +Ġke pt +Ġa im +, ' +c ol +Ġbenef its +if ying +Ġact ual +ĠIntern ational +Ġveh icle +Ġch ief +Ġeff orts +ĠLe ague +ĠM ost +Ġwa it +Ġad ult +Ġover all +Ġspe ech +Ġhigh ly +Ġfem ale +Ġer ror +Ġeffect ive +5 4 +Ġenc our +w ell +Ġfail ed +Ġcons erv +Ġprogram s +Ġt rou +Ġa head +5 00 +vertis ement +I P +ĠF ound +p ir +Ġ % +Ġcr ime +and er +Ġloc ation +ĠI ran +Ġbehav ior +az ing +Ġr are +Ġem b +Ġca used +Ġsh ip +Ġact ive +Ġcont ribut +Ġg reen +Ġac qu +Ġref lect +ven ue +Ġf irm +Ġb irth +] . +Ġclear ly +Ġem ot +Ġag ency +ri age +Ġmem ory +9 8 +S A +ĠSe e +ac ing +C C +Ġbig gest +Ġr ap +Ġbas ic +Ġb and +e at +Ġsus pect +ĠM ac +Ġ9 0 +m ark +ist an +Ġsp read +am s +k i +as y +ra v +ĠR ober +Ġdemon str +r ated +Ġabs olute +Ġpl aces +Ġim pl +ibr ary +Ġc ards +Ġdest roy +Ġv irt +ve re +Ġapp eared +y an +p oint +Ġbe g +Ġtem per +s pe +ant ed +ear s +ĠD irect +Ġl ength +Ġbl og +am b +Ġint eg +Ġres ources +ac c +if ul +Ġsp ot +Ġfor ced +Ġthous ands +ĠMin ister +Ġqu al +ĠF rench +at ically +Ġgener ally +Ġdr ink +Ġth us +I L +od es +Ġappro pri +ĠRe ad +Ġwh om +Ġey e +Ġcol lege +Ġ4 5 +ire ction +Ġens ure +Ġapp arent +id ers +Ġrelig ious +Ġmin or +ol ic +Ġt ro +ĠWh y +rib ute +m et +Ġprim ary +Ġdevelop ed +Ġpe ace +Ġsk in +st e +av a +Ġbl ue +Ġfam ilies +Ġ ir +Ġapp ly +Ġin form +ĠSm ith +C T +i i +Ġlim it +Ġres ist +........ ........ +um n +Ġconf lic +Ġtw e +ud d +ĠT om +Ġl iter +qu e +b on +Ġha ir +Ġevent ually +Ġp us +Ġhelp ed +Ġag g +or ney +ĠApp le +Ġf it +ĠS ur +Ġpre m +Ġs ales +Ġsecond s +Ġstreng th +Ġfeel ing +¿ ½ +Ġt our +Ġknow s +o om +Ġex erc +Ġsom ew +ï ¿½ +> > +Ġsp okes +Ġide as +Ġreg ist +so ft +ĠD el +ĠP C +Ġpro pos +Ġlaun ch +Ġbott om +T H +ĠP lease +v est +it z +ĠIn ter +Ġsc ript +Ġr at +ar ning +Ġ il +ĠJ er +ĠA re +Ġwh atever +ok en +ci ence +Ġmod e +Ġag ree +Ġs ources +Ġinit ial +Ġrest rict +Ġwond er +us ion +## ## +ĠS il +vil le +Ġb urn +t w +as ion +Ġ £ +Ġn or +u ing +Ġre ached +Ġs un +Ġc ateg +ig ration +Ġc ook +Ġprom ot +Ġm ale +Ġcl imate +Ġf ix +Ġalleg ed +U R +all ed +Ġim ages +C ont +ot a +Ġschool s +i os +Ġd rop +Ġst ream +ĠM o +Ġprevious ly +al ing +Ġp et +Ġdou ble +Ġ( @ +ann el +Ġdef ault +t ies +Ġr ank +ĠD ec +ĠCoun cil +Ġweap on +Ġst ock +Ġanal y +ĠSt r +Ġpict ure +ĠPol ice +f erence +Ġcent ury +Ġcitiz ens +Ġon to +Ġexp and +Ġhe ro +ĠS ol +Ġw ild +Ġupd ate +Ġcustom ers +r ont +d ef +Ġl ik +Ġcrim inal +ĠChrist ian +S P +7 6 +Ġle aving +Ġother wise +ĠD ist +Ġbas is +5 2 +5 3 +ic ip +ĠB er +Ġrecomm end +Ġfl oor +Ġc rowd +ol es +Ġ7 0 +Ġcent ral +ĠE v +Ġd ream +Ġdown load +Ġconf ir +ĠTh om +Ġwind ow +Ġhapp ens +Ġun it +Ġt end +Ġs pl +Ġbec omes +Ġfight ing +Ġpred ict +ĠP ress +ĠP ower +Ġhe avy +ak ed +Ġf an +or ter +ate gy +B A +iz es +Ġsp end +H ere +Ġ200 7 +Ġad op +ĠH am +Ġfoot ball +ĠP ort +od ay +5 1 +amp ions +Ġtrans fer +h t +Ġ3 8 +ter m +ac ity +Ġb ur +] , +tern al +r ig +b ut +Ġthere fore +ĠB ecause +res p +re y +Ġm ission +S ome +Ġnot ed +Ġass um +Ġdise ase +Ġed it +Ġprog ress +r d +ĠB rown +oc al +Ġadd ing +Ġra ised +ĠAn y +Ġt ick +Ġsee ing +ĠPe ople +Ġagre ement +Ġser ver +Ġw at +Ġdeb ate +Ġsupp osed +il ing +Ġlarg est +Ġsuccess ful +ĠP ri +ĠDemocr atic +Ġj ump +ĠSyri a +Ġown ers +Ġoff ers +Ġshoot ing +Ġeff ic +se y +Ġha ven +ver se +te red +ĠL ight +im al +ĠB ig +Ġdef end +Ġbe at +Ġrecord s +% ) +Ġsc en +Ġemploy ees +Ġdev ices +he m +Ġcom mer +ĠM ex +Ġbenef it +ĠPro f +Ġil leg +Ġsur face +ĠAl so +Ġh arm +ing ly +w ide +ĠA lex +Ġsh ut +ĠC ur +Ġl ose +p m +Ġchall enge +se mb +Ġst ation +Ġint elligence +Ġacc ur +ĠFl or +Ġrequ ires +ĠM al +b um +Ġh ospital +Ġsp irit +Ġoff ered +Ġprodu ce +ĠComm un +Ġcreat ing +Ġcr is +s pect +Ġend ed +Ġd aily +Ġvot ers +land s +i as +i h +on a +Ġsm art +ĠOff ice +ĠL ord +ri al +ĠIntern et +Ġcirc um +Ġextreme ly +' . +Ġopin ion +ĠM il +Ġg ain +B S +ĠF in +y p +Ġuse ful +Ġbud get +Ġcom fort +is f +Ġback ground +el ine +Ġep isode +Ġen emy +Ġtri al +Ġestab lish +d ate +ĠC ap +Ġcontin ues +Ġshow ing +ĠUn ion +w ith +Ġpost ed +ĠSy stem +Ġe at +ri an +Ġr ise +ĠGerman y +il s +Ġsign ed +Ġv ill +Ġgr and +m or +ĠEng land +Ġproject s +um ber +Ġconf erence +z a +Ġrespons ible +ĠAr ab +Ġlearn ed +âĢĶ âĢĶ +i pping +ĠGe orge +O C +Ġreturn ed +ĠAustral ia +Ġb rief +Q u +Ġbr and +ill ing +ab led +Ġhig hest +Ġtr ain +ĠComm ission +wh ile +Ġn om +cept ion +Ġm ut +ĠBl ue +Ġinc ident +v ant +8 6 +ĠI D +Ġn uclear +7 4 +ĠL ike +ĠR E +ĠM icro +l i +m ail +Ġcharg es +8 9 +Ġad just +ad o +Ġear th +N A +Ġpr ices +P A +Ġd raft +Ġrun s +Ġcandid ate +ens es +Ġmanag ement +ĠPh il +ĠM iss +Ġte ach +g ram +Ġunderstand ing +a it +ic ago +A dd +ĠE p +sec ut +Ġsepar ate +Ġinst ance +Ġe th +Ġun less +**** **** +ĠF ore +in ate +Ġoper ations +S p +Ġf aith +g ar +ĠCh urch +ron ic +Ġconf ig +os ure +Ġactiv ities +Ġtrad itional +Ġ3 6 +Ġd irection +Ġmach ine +Ġsur round +Ġp ush +un ction +ĠE U +Ġeas ier +Ġarg ument +G B +Ġm icro +Ġsp ending +iz ations +Ġthe ory +ad ow +Ġcall ing +ĠL ast +Ġd er +Ġinflu ence +Ġcomm it +Ġph oto +Ġun c +ist ry +g n +ast e +ack s +Ġdis p +ad y +d o +ĠG ood +Ġ ` +Ġw ish +Ġreve aled +Âł Âł +l ig +Ġen force +ĠComm ittee +Ġche m +Ġmil es +Ġinterest ed +Ġsol ution +ic y +in ct +Ġ- > +ĠD et +Ġrem oved +Ġcomp ar +e ah +Ġpl ant +ĠS ince +Ġachie ve +Ġadvant age +Ġslight ly +b ing +Ġpl aced +u nder +201 5 +ĠM ad +Ġt im +os es +Ġc ru +ĠR ock +Ġmost ly +Ġneg ative +Ġset ting +Ġprodu ced +Ġm ur +Ġconnect ion +ĠM er +Ġdri ver +Ġexecut ive +Ġass ault +Ġb orn +ĠV er +t ained +Ġstruct ure +Ġredu ce +Ġdec ades +Ġd ed +u ke +ĠM any +idd en +Ġle ague +S e +Ġjo in +Ġdis co +Ġd ie +c ks +act ions +Ġass ess +ag n +Ġgo als +our s +I R +Ġsen ior +ill er +m od +ip ment +oc ol +u y +ĠQ ue +Ġpart ies +ir gin +Ġle arning +it able +Ġstre et +Ġcamer a +A pp +Ġsk ills +b re +c ious +Ġcele br +ĠFr anc +Ġexist ing +Ġwill ing +l or +Ġ id +ĠSp ace +Ġcrit ical +ĠL a +ortun ately +Ġser ve +Ġc old +Ġspec ies +T S +Ġanim als +ĠB ay +Ġold er +ĠU nder +est ic +ĠT re +Ġte acher +Ġpre fer +v is +Ġth read +ĠM att +Ġmanag er +ãĥ » +Ġprofess ional +ĠV ol +Ġnot es +The se +ul a +Ġf resh +ent ed +u zz +ed y +clus ion +ĠR el +Ġdoub t +E O +Ġopen ed +ĠB it +Ad vertisement +Ġgu ess +ĠU N +Ġse qu +Ġexpl ain +ott en +Ġatt ract +ak s +Ġstr ing +Ġcont ext +oss ible +ĠRepublic ans +Ġsol id +Ġc ities +Ġask ing +Ġr andom +u ps +ur ies +ar ant +dd en +g l +ĠFlor ida +Ġdep end +ĠSc ott +Ġ3 3 +Ġi T +ic on +Ġmention ed +Ġ2 000 +Ġclaim ed +Ġdefin itely +ul f +Ġc ore +Ġopen ing +ĠCon st +wh ich +ĠT ra +A G +7 2 +Ġbelie ved +ad a +Ġ4 8 +ĠSec urity +yr ight +ĠP et +ĠL ou +Ġhold ing +======== ======== +Ġ ice +Ġb row +Ġauthor ities +h ost +w ord +Ġsc ore +ĠD iv +Ġcell s +Ġtrans l +Ġneigh bor +Ġrem ove +u ct +Ġdist rict +ĠA ccording +Ġwor se +Ġconcern s +Ġpresident ial +Ġpolic ies +ĠH all +7 3 +Ġh us +A Y +Ġ200 6 +ĠJ ud +Ġindepend ent +ĠJust ice +ili ar +pr int +igh ter +Ġprotect ion +z en +Ġsu dden +h ouse +ĠJ es +P R +ĠIn f +Ġb ul +Ġ _ +ĠServ ice +ĠP R +Ġstr ategy +ff ect +Ġgirl s +Ġmiss ing +oy al +ĠTe am +ul ated +Ġd at +Ġpolit ics +ab or +A ccording +Ġspe ll +Ġg raph +ort hern +T C +A b +Ġlab or +is her +Ġk ick +ĠiT unes +Ġstep s +pos es +Ġsmall er +E n +ber t +Ġro ll +Ġresear chers +Ġcl osed +Ġtrans port +Ġlaw y +________ ________ +ĠCh icago +Ġas pect +Ġn one +Ġmar riage +9 6 +Ġe lements +ĠF re +ĠS al +Ġd ram +F C +t op +e qu +Ġhe aring +Ġsupport ed +Ġtest ing +co hol +Ġmass ive +Ġst ick +Ġgu ard +is co +ph one +F rom +How ever +Ġb order +Ġcop y +ograph y +l ist +7 1 +Ġown er +cl ass +ru it +r ate +ĠO nce +Ġdig ital +Ġt ask +ER S +Ġinc red +t es ++ + +ĠFr ance +Ġb reat +ow l +Ġiss ued +ĠW estern +Ġdet ect +Ġpart ners +Ġsh ared +ĠC all +Ġcan cer +ac he +rib e +Ġexpl ained +Ġhe at +{ " +Ġinvest ment +ĠB ook +Ġw ood +Ġtool s +ĠAl though +Ġbelie f +Ġcris is +Ġg e +ĠM P +Ġoper ation +ty pe +~ ~ +g a +Ġcont ains +ant a +Ġexp ress +ĠG roup +ĠJ ournal +k a +Ġam b +ĠUS A +Ġfind ing +Ġfund ing +h ow +Ġestab lished +ide os +Ġdeg ree +Ġdanger ous +ang ing +Ġfre edom +pp ort +out hern +Ġch urch +Ġc atch +ĠTw o +Ġpres ence +ĠGu ard +U p +Ġauthor ity +ĠPro ject +Ġbut ton +Ġcon sequ +Ġval id +Ġwe ak +Ġstart s +Ġref erence +ĠM em +" ) +U N +or age +ĠO pen +Ġcol lection +y m +g ency +Ġbeaut iful +ro s +Ġtell s +Ġwa iting +n el +Ġprov iding +ĠDemocr ats +Ġd aughter +Ġm aster +Ġpur poses +ĠJapan ese +Ġequ al +Ġturn s +Ġdoc uments +Ġwatch ing +R es +Ġr an +201 4 +Ġre ject +ĠKore a +Ġvictim s +Le vel +ere nces +Ġw itness +Ġ3 4 +Ġre form +com ing +Ġocc up +Ġc aught +Ġtra ffic +ad ing +Ġmod els +ar io +Ġserv ed +Ġb atter +u ate +ĠSecret ary +Ġagre ed +Ġtr uly +yn am +ĠR et +Ġun its +ĠRes earch +h and +az ine +ĠM ike +Ġvar iety +ot al +Ġam azing +Ġconfir med +Ġentire ly +Ġpurch ase +Ġe lement +Ġc ash +Ġdeter mine +D e +Ġc ars +ĠW all +â ĸ +Ġview s +Ġdrug s +Ġdep artment +ĠSt ep +u it +Ġ3 9 +as ure +ĠCl ass +Ġc overed +ĠB ank +Ġme re +u ana +Ġmult i +Ġm ix +Ġun like +lev ision +Ġsto pped +Ġs em +ĠG al +ul es +Ġwe l +ĠJohn son +l a +Ġsk ill +Ġbec oming +ri e +Ġappropri ate +f e +ell ow +ĠPro t +ul ate +oc ation +Ġweek end +od ies +Ġsit es +Ġanim al +ĠT im +Ġsc ale +Ġcharg ed +Ġinst ruct +ill a +Ġmethod s +Ġc ert +Ġjud ge +ĠH el +Ġdoll ars +Ġstand ing +ĠS qu +Ġdeb t +l iam +Ġdri ving +ĠS um +ĠEd ition +Ġal bum +and on +I F +ĠU k +6 3 +ad er +Ġcommer cial +es h +ĠGovern ment +Ġdisc overed +Ġout put +ĠHill ary +ĠCar ol +Ġ200 5 +Ġab use +anc ing +Ġsw itch +Ġann ual +T w +Ġst ated +ag ement +in ner +Ġdem ocr +Ġres idents +Ġallow ing +Ġfact ors +od d +Ġf uck +em ies +Ġoccur red +ot i +Ġn orth +ĠP ublic +Ġinj ury +Ġins urance +C L +oll y +ã Ģ +Ġrepe ated +Ġar ms +ang ed +Ġconst ruction +Ġf le +P U +ic ians +Ġfor ms +ĠMc C +ant ic +Ġm ental +p ire +Ġequ ipment +Ġf ant +Ġdiscuss ion +Ġregard ing +k in +ar p +Ġch air +og ue +Ġpro ceed +ĠI d +O ur +Ġmur der +M an +Ġ4 9 +as p +Ġsupp ly +Ġin put +Ġwe alth +liam ent +Ġpro ced +or ial +ĠSt at +ĠN FL +hen s +ĠInst itute +Ġput ting +ourn ament +et ic +Ġloc ated +Ġk id +er ia +r un +Ġpr inc +Ġ ! +go ing +ĠB et +Ġcl ot +Ġtell ing +Ġprop osed +i ot +or ry +Ġfund s +g ment +ĠL ife +Ġb aby +ĠB ack +Ġsp oke +Im age +Ġear n +ĠA T +g u +Ġex change +ĠL in +ov ing +Ġp air +M ore +az on +Ġarrest ed +Ġkill ing +c an +ĠC ard +y d +Ġident ified +Ġm obile +Ġthan ks +ony m +ĠF orm +Ġhundred s +ĠCh ris +ĠC at +Ġtre nd +h at +ĠA v +om an +Ġelect ric +ĠW il +S E +O f +Ġrest aur +ot ed +Ġtr ig +Ġn ine +Ġb omb +Wh y + ¯ +Ġco verage +Ġapp eal +ĠRober t +ĠS up +Ġfin ished +Ġfl ow +Ġdel iver +Ġcal cul +Ġphot os +Ġph il +Ġpie ces +Ġapp re +k es +Ġr ough +D o +Ġpart ner +Ġconcern ed +Ġ3 7 +ĠG en +C ol +ct ors +Ġ= > +st ate +Ġsuggest ed +ĠFor ce +C E +Ġher self +ĠPl an +w orks +o oth +ren cy +Ġcor ner +Ġhus band +Ġintern et +ĠA ut +em s +os en +ĠAt l +g en +Ġbal ance +6 2 +Ġsound s +te xt +Ġar r +ov es +Ġmill ions +Ġrad io +Ġsat isf +ĠD am +M r +G o +S pe +Ġcomb at +r ant +ĠG ree +Ġf uel +Ġdist ance +Ġtest s +Ġdec re +ĠE r +Ġman aged +D S +Ġt it +Ġmeas ures +ĠL iber +Ġatt end +as hed +ĠJ ose +ĠN ight +d it +ĠN ov +ĠE nd +out s +Ġgener ation +Ġadv oc +y th +Ġconvers ation +ĠS ky +act ive +ce l +ri er +ĠFr ank +Ġg ender +Ġcon cent +Ġcar ried +and a +ĠV irgin +Ġarri ved +ic ide +ad ed +Ġfail ure +Ġmin imum +le ts +Ġwor st +Ġkeep ing +Ġint ended +Ġilleg al +Ġsub sc +Ġdetermin ed +Ġtri p +Y es +Ġra ise +Ġ ~ +Ġfeel s +Ġpack age +ĠJ o +h i +201 6 +re al +Ġf ra +Ġsy mb +M e +uck y +p ret +ĠK h +ĠEd it +ĠWe b +em ic +ĠCol or +Ġjust ice +I nt +Ġfar m +ck now +" > +el ess +Ġredu ced +Ġ5 00 +x x +ĠR ad +ĠW ood +Ġcl in +Ġhy p +il er +ur a +k ins +8 5 +6 1 +ĠThe ir +ĠM ary +Ġs an +Ġno vel +ĠWh o +Ġcap acity +Ġimp ossible +Ġpl ays +Ġmin ister +ij uana +ic ate +ĠS et +Ġf ram +Ġ ing +Ġcommun ities +ĠF BI +it a +Ġb on +Ġstr ateg +Ġinterest s +l ock +g ers +m as +ĠAN D +Ġconflic t +Ġrequire ments +Ġs ac +Ġoper ating +in i +rel ated +Ġcomm itted +Ġrelative ly +Ġs outh +¯ ¯ +Ġaff ord +Ġident ity +Ġdec isions +Ġacc used +pl ace +Ġvict ory +o ch +i at +N ame +C om +t ion +ed s +Ġsee k +Ġt ight +ĠIm ages +Ġinit i +Ġhum ans +Ġfam iliar +Ġaud ience +Ġintern al +vent ure +Ġs ides +ĠT O +Ġd im +Ġcon clud +Ġapp oint +Ġenforce ment +ĠJ im +ĠAssoci ation +Ġcircum st +ĠCanad ian +Ġjo ined +Ġdiffere nces +ĠL os +Ġprot est +Ġtw ice +w in +Ġgl ass +ars h +ĠAr my +Ġexp ression +Ġdec ide +Ġplan ning +an ia +Ġhand le +ĠMicro soft +ĠN or +Ġmax imum +ĠRe v +Ġse a +Ġev al +Ġhel ps +re f +Ġb ound +Ġm outh +Ġstand ards +Ġcl im +ĠC amp +ĠF ox +cl es +Ġar my +ĠTe chn +ack ing +x y +S S +Ġ4 2 +Ġbu g +ĠUk rain +ĠM ax +ĠJ ones +ĠSh ow +l o +Ġplan et +Ġ7 5 +Ġwin ning +Ġf aster +Ġspe ct +Ġbro ken +T R +Ġdef ined +Ġhealth y +Ġcompet ition +htt ps +ĠIs land +ĠF e +Ġannoun ce +ĠC up +ĠInst ead +Ġcl ient +Ġposs ibly +se ction +ock et +l ook +Ġfin ish +Ġcre w +Ġres erv +Ġed itor +Ġh ate +Ġs ale +Ġcontro vers +Ġp ages +w ing +Ġnum er +Ġopp osition +Ġ200 4 +Ġref uge +Ġfl ight +Ġap art +ĠL at +A meric +ĠAfric a +Ġapplic ations +ĠPal est +ĠB ur +Ġg ar +ĠSoc ial +Ġup gr +Ġsh ape +Ġspe aking +ans ion +a o +ĠS n +Ġwor ry +ĠBrit ain +P lease +rou d +Ġh un +Ġintrodu ced +Ġd iet +I nd +ĠSec ond +Ġfun ctions +ut s +ĠE ach +ĠJe ff +Ġst ress +Ġaccount s +Ġgu arant +ĠAn n +ed ia +Ġhon est +Ġt ree +ĠAfric an +ĠB ush +} , +Ġs ch +ĠOn ly +Ġf if +ig an +Ġexerc ise +ĠEx p +Ġscient ists +Ġlegisl ation +ĠW ork +ĠS pr +à Ĥ +ĠH uman +Ġ è +Ġsur vey +Ġr ich +ri p +Ġmain tain +Ġfl o +Ġleaders hip +st ream +ĠIslam ic +Ġ 01 +ĠCol lege +Ġmag ic +ĠPr ime +Ġfig ures +201 7 +ind er +x ual +ĠDe ad +Ġabsolute ly +Ġfour th +Ġpresent ed +resp ond +rib le +Ġal cohol +at o +ĠD E +por ary +Ġgr ab +Ġvar i +Ġqu ant +ĠPh oto +Ġpl us +r ick +ar ks +Ġaltern ative +Ġp il +Ġappro x +th at +Ġobject s +ĠR o +ĠAnd roid +Ġsignificant ly +ĠR oad +k ay +R ead +av or +Ġa cknow +ĠH D +ĠS ing +O r +ĠM ont +Ġun s +pro f +Ġneg oti +ĠAr ch +ik i +Ġte levision +ĠJew ish +Ġcomm ittee +Ġmot or +Ġappear ance +Ġs itting +Ġstri ke +ĠD own +com p +ĠH ist +Ġf old +ac ement +ĠLou is +Ġbel ong +ĠâĢ ¢ +Ġm ort +Ġprep ared +Ġ6 4 +ĠM aster +Ġind eed +ĠD en +Ġre nt +T A +our ney +ar c +S u +9 7 +Ġadv ice +Ġchang ing +Ġlist ed +Ġlaun ched +is ation +ĠP eter +is hes +Ġl ived +ĠM el +ĠSup reme +ĠF ederal +Ġ) ; +ruct ure +Ġset s +Ġphil os +u ous +Ġ ł +Ġappl ied +ĠN OT +Ġhous ing +ĠM ount +Ġo dd +Ġsu st +D A +ffic ient +Ġ ? +ol ved +Ġp owers +Ġth r +Ġrem aining +ĠW ater +L C +Ġca uses +ãģ ® +Ġman ner +ad s +Ġsuggest s +Ġend s +stand ing +f ig +ĠD un +id th +Ġg ay +Ġter min +ĠAngel es +M S +Ġscient ific +Ġco al +ap ers +b ar +ĠThom as +Ġsy m +ĠR un +th is +P C +igr ants +Ġmin ute +ĠDist rict +cell ent +Ġle aves +Ġcomple ted +am in +Ġfoc used +Ġmon itor +Ġveh icles +M A +ĠM ass +ĠGr and +Ġaffect ed +itution al +Ġconst ruct +Ġfollow s +Ġt on +re ens +Ġh omes +ĠE xt +ĠLe vel +r ast +ĠI r +Ġel im +Ġlarge ly +ĠJ oe +Ġvot es +all s +Ġbusiness es +ĠFound ation +ĠCent ral +Ġy ards +Ġmaterial s +ul ner +Ġgu ide +Ġclos er +um s +Ġsp orts +ed er +J ust +Ġtax es +8 4 +ĠO ld +Ġdec ade +ol a +Ġv ir +Ġdro pped +Ġdel ay +it ect +Ġsec ure +ste in +le vel +Ġtre ated +Ġfil ed +ain e +Ġv an +Ġm ir +Ġcol umn +ict ed +e per +Ġro t +Ġcons ult +Ġent ry +Ġmar ijuana +ĠD ou +Ġapparent ly +ok ing +clus ive +Ġincre ases +an o +Ġspecific ally +Ġte le +ens ions +Ġrelig ion +ab ilities +Ġfr ame +ĠN ote +ĠLe e +Ġhelp ing +Ġed ge +ost on +Ġorgan izations +à ĥ +ĠB oth +hip s +Ġbig ger +Ġbo ost +ĠSt and +Ġro w +ul s +ab ase +Ġr id +L et +are n +ra ve +Ġst ret +P D +Ġv ision +Ġwe aring +Ġappre ci +Ġa ward +ĠU se +Ġfact or +w ar +ul ations +) ( +Ġg od +Ġter rit +Ġpar am +ast s +8 7 +Ġen emies +ĠG ames +F F +Ġacc ident +W ell +ĠMart in +T ER +Ġat h +ĠHe ll +Ġfor g +Ġve ter +ĠMed ic +f ree +Ġst ars +Ġexp ensive +Ġac ad +ra wn +ĠW he +Ġl ock +Ġform at +Ġsold iers +s m +Ġag ent +Ġrespons ibility +or a +ĠS cience +Ġrap id +Ġt ough +ĠJes us +Ġbelie ves +M L +Ġwe ar +le te +Ãĥ ÃĤ +ĠD ri +Ġcomm ission +ĠB ob +O h +ap ed +Ġwar m +ÃĥÃĤ ÃĥÃĤ +Ġ200 3 +ort ion +Ġhas n +ust er +Ġun ivers +ĠI ll +Ġk ing +olog ies +9 4 +ĠT em +ĠM os +Ġpat ient +ĠMex ico +ce an +ĠDe ath +ĠSand ers +y ou +ĠC ast +ĠComp any +pt y +Ġhappen ing +F P +ĠB attle +Ġb ought +A m +M od +U s +ut ers +ĠC re +ĠTh ose +Ġ4 4 +is er +Ġs oul +ĠT op +ĠHar ry +ĠA w +Ġse at +ff ee +Ġrev olution +Ġ( " +ĠD uring +et te +Ġr ing +Ġoff ensive +Ġreturn s +Ġv ideos +Ġdis cl +Ġfam ous +en ced +ĠS ign +ĠR iver +Ġ3 00 +P M +ĠB us +ĠC H +Ġcandid ates +ard en +Ġpercent age +Ġvis ual +Ġthan k +Ġtrou ble +ner gy +Ġ200 1 +Ġpro ve +ash ion +Ġen h +ĠL ong +U M +Ġconnect ed +Ġposs ibility +O ver +Ġexper t +Ġl ibrary +art s +ĠDirect or +Ġfell ow +9 2 +ir ty +Ġd ry +Ġsign s +ĠL ove +Ġqu iet +f oot +Ġp ure +ĠH un +Ġf illed +ph as +ĠE lect +end ment +ĠEx pl +Ġun able +n s +m o +Ġv ast +ob e +Ġident ify +app ing +ĠCarol ina +g ress +Ġpro te +Ġf ish +Ġcircumst ances +raz y +ĠPh ot +Ġb odies +ĠM ur +Ġdevelop ing +ĠA R +Ġexperien ced +Ġsubst ant +ĠBo ard +es ome +Ġdom estic +Ġcomb ined +ĠP ut +Ġchem ical +ĠCh ild +Ġpo ol +ĠC y +Ġe gg +c ons +st ers +Ġh urt +Ġmark ets +Ġconserv ative +Ġsupp orters +Ġag encies +id el +O b +ur b +Ġ4 3 +ĠDef ense +y e +ĠA p +du le +Ġtemper ature +Ġconduct ed +ĠCh ief +Ġpull ed +Ġf ol +L ast +ont o +os is +V ER +D es +ĠP an +F irst +Ġadv ance +Ġlic ense +r ors +ĠJ on +Ġimag ine +Ġhe ll +Ġf ixed +Ġinc or +os ite +ĠL og +ick en +] : +Ġsurpr ise +h ab +Ġc raft +ol t +ĠJ ul +Ġd ial +Ġrele vant +Ġent ered +Ġlead s +ĠA D +ĠCle an +Ġpict ures +ess or +Ġal t +Ġpay ing +P er +ĠMark et +Ġupd ates +am ily +ĠT ype +ĠH ome +Ġ5 5 +semb ly +rom e +8 3 +Ġgreat est +Ġhe ight +Ġhe av +ain ts +Ġlist en +as er +ĠS H +Ġcap able +ac le +Ġpers pect +in ating +Ġoff ering +ry pt +ĠDe velop +ab in +r c +Ġbr ight +al ty +ar row +Ġsupp l +ind ing +ack ed +gy pt +ĠAn other +p g +ĠVirgin ia +ĠL u +Ġpl anned +Ġp it +Ġswe et +T ype +ĠD i +Ġtyp ically +ĠFranc isco +Ġpro spect +ĠD an +Ġte en +re es +Ġsc hed +Ġh ol +Ġsc r +Ġlot s +l ife +Ġnews p +Ġfor get +ĠN one +ĠM iddle +ĠR yan +ed d +Ġse vere +Ġsu it +ll er +9 3 +Ġcor respond +Ġexpl os +u ations +Ġfl ag +g ame +r id +Ġpr in +ĠD ata +Ġde ploy +ĠEn ter +su it +gh an +ĠM en +Ġthough ts +Ġmat ters +Ġad apt +ĠA ri +Ġf ill +Ġfor th +Ġs am +Ġ4 1 +Ġpay ment +ĠH or +Ġsp ring +du c +Ġl osing +Ġbring ing +F O +al a +Ġdist ribution +he red +b our +ĠIsrael i +om a +Ġcomb ination +Ġpl enty +V E +C an +ĠH aw +Ġper man +ĠSpe cial +Ġto w +Ġsee king +Ġexam ples +Ġclass es +c r +Ġbe er +Ġmov es +ĠI P +ĠK n +Ġpan el +E ven +Ġproper ly +Ġr is +Ġpl ug +Ġestim ated +E very +Ġdef ensive +ag raph +Ġpre gn +Ġinst it +ĠV ict +Ġvol ume +Ġpos itions +Ġl inks +ĠPro gram +ĠWe ek +ag ues +Ġtrans form +k er +ĠC EO +Ġc as +Ġopp onent +Ġtwe et +ĠC ode +Ġsh op +Ġf ly +Ġtal ks +Ġb ag +Ph one +Ġa id +Ġpl ants +Ġ6 5 +Ġatt orney +ar ters +qu est +ĠMag ic +Ġbeg ins +Ġmy ster +Ġenvironment al +Ġst orage +N N +Ġm arg +Ġs ke +Ġmet al +ell y +Ġord ered +Ġrem ained +Ġl oved +Ġprom pt +Ġupd ated +Ġexper ts +Ġwalk ing +Ġan cient +Ġperform ed +AT E +Ġne ither +i ency +Ġmanufact ure +ĠP ak +Ġselect ed +Ġm ine +Ġult imately +Ġexpl an +Ġlab el +ĠServ ices +ribut ed +Tr ump +Ġsy n +ĠU lt +S C +Ġme at +Ġg iant +ĠW ars +ĠO N +Ġad m +Ġinter pret +Ġeven ing +Ġev il +ĠB oston +ĠW ild +Ġ à +ĠBit coin +ĠAm azon +D r +ĠIn formation +Ġobvious ly +Ġadv anced +Ph oto +ol ar +Ġwe ather +Ġsymb ol +Ġso le +Ġpot entially +ost er +Ġorig inally +m un +3 00 +az e +ess ions +Ġde ck +Ġst ood +Ġyou th +ĠB ern +R ep +ĠT est +Ġbas ically +ot ic +Ġinvol ve +ol it +ly n +S ee +Ġair craft +Ġconf irm +E W +Ġmess ages +ĠRich ard +Ġk it +Ġpro hib +Ġv ulner +is ters +Ġexist ence +Ġturn ing +ĠS P +Ġdes ire +Ġfl at +Ġm ent +se ason +ang es +Ġneighbor hood +ĠL ake +AT ION +Ġpoint ed +b ur +Ġinn ov +uc ks +U L +Ġprofess or +Ġexp ressed +A B +ic ious +Ġ200 2 +ĠDe v +Ġs ession +Ġb are +s en +Ġdis s +ĠC ath +ĠP ass +ĠP oint +Ġdo ctor +or row +ail ed +ĠR ub +ĠD C +ĠChar l +p erson +Ġwrit er +igh ters +ure au +Ġob lig +Ġrecord ed +Ġbro ke +Ġord ers +il ty +Ġmot ion +in ity +l aw +ad ium +Ġimm igration +Ġcontr ast +Ġb att +Ġex cellent +Ġtechn ical +am i +Ġt un +Ġcl oud +ĠY ear +ge on +Ġcre ation +Ġstr ange +Ġa uth +Ġfor t +b orn +Ġext ent +ĠT oday +ĠCl ub +Ġr ain +Ġs ample +Ġaccept ed +Ġt act +Ġf ired +ĠS on +Ġstand s +Ġb oot +Ġ4 7 +Ġstat ements +Ġvers ions +Ġse lling +ound ed +Ġ199 0 +Ġwere n +ĠW atch +Ġexper iment +P ost +Ġret ail +ul ed +In st +un te +ãĥ ¼ +Ġdep art +Ġb ond +i very +om pl +Ġre action +ĠSyri an +ĠP ac +app ed +ani el +D P +Ġres olution +Ġre act +Ġappro ved +on om +m ond +ĠO ffic +-- - +Ġrepl ace +Ġt ack +Ġsp ort +Ġch ain +Ġemer gency +r ad +ĠPalest in +Ġ4 6 +Ġautom atically +Ġrout e +Ġp al +Ġb anks +ĠPar is +ĠMed ia +ro ad +ic ing +i xt +ist ed +Ġg rew +Ġco ord +ĠW here +om in +Ġsub s +� � +Ġ ± +Ġcorpor ate +Ġse lection +n oon +ĠRep ort +c s +clud ing +ord ers +anc he +ĠIt s +Ġslow ly +ĠE gypt +ĠA cc +Ġcol le +iqu es +E X +Ġattempt s +ur l +ĠC ross +Ġfind ings +ĠS C +ĠO R +Ġind ex +ens ity +ĠW ay +ĠL and +Ġsh ock +d is +Ġd ynam +Ġc art +m osp +S ince +i est +ĠB oy +Ġst orm +ĠCont in +201 3 +he w +il it +Ġess ential +iqu id +O ther +ive red +Ġreason able +A ct +Ġsub sequ +ĠP ack +ĠF ort +Ġconsider ing +Ġun iversity +l og +Ġmar ried +Ġill ust +ĠTr ue +£ ı +Ġnumer ous +rast ructure +Ġserious ly +Ġrefer red +u a +Ġconsist ent +on na +ĠRe al +ru ption +ci ples +Ġfact s +9 1 +ot es +er g +The n +Ġacc ompl +N ote +Ġre venue +Ġpass ing +Ġm al +e en +ĠY et +Ġg ather +ter day +ew ork +ĠA uthor +P e +Ġopt im +Ġr ub +Ġè £ı +Ġun known +st one +Ġun ion +ol ve +Ġopportun ities +Ġbrow ser +ĠW al +ĠC ost +Ġreport ing +st s +p et +Ġs and +Ġsudden ly +Ġsurpr ising +ĠV R +Ġsomew hat +ĠB as +ult ure +iz z +ĠC D +Ġchalleng es +Ġsett ings +Ġexperien ces +ĠF ull +Ġcan n +Ġrece iving +ES T +Ġj oint +Ġcult ural +Ġa st +8 2 +as tern +ce ived +ĠC ru +Ġb ull +p ired +am m +Ġfac ing +p ower +Ġb oss +ĠH ol +Ġinst r +Ġincreasing ly +Ġsh ift +Ġstre ets +ĠWilliam s +ab b +Ġl ie +Ġl augh +ĠC a +P L +Ġadult s +Ġcustom er +Ġob tained +Ġsupport ing +ht ml +f ire +Ġdetail ed +Ġpick ed +ĠR ight +ld er +E E +st ood +ĠK im +Ġw ire +Ġs ight +Ġdevelop ers +Ġpers ons +Ġs ad +Ġc up +Ġwar ning +Ġboy s +l ong +Ġb ird +f o +Ġw al +Ġobserv ed +Ġz one +iven ess +Ġch annel +c ript +Ġref used +ĠAg ain +Ġsu c +Ġspokes man +ĠRe f +r ite +ou ston +ãĥ ³ +ĠS her +Ġact s +ĠN ame +Ġstrugg le +ar ry +omet imes +Ġdisc rim +H T +Ġcateg ory +Ġreal ize +Ġemploy ee +ĠAf ghan +en ger +Ġgun s +ĠSte ve +ĠM ot +ĠO l +ok ed +Ġth ick +Ġfair ly +ill y +Ġsur ve +ĠM at +we ight +â Ķ +Ġtro ops +Ġag ents +Ġbatter y +Ġmot iv +à ¡ +S ec +d en +o very +L S +Ġfl u +Ġconf ident +ĠO per +Ġem pty +Ġp hen +Ġse ctor +Ġexc ited +Ġrem ote +ap h +o en +Ġdestroy ed +Ġmor al +ĠH P +ĠR on +Ġd ress +ĠB at +Ġl it +ĠM S +Ġa f +H L +r um +is ms +Ġshould n +Ġsym pt +ĠTor onto +het ic +Ġcar bon +Ġinstall ed +Ġviol ent +Ġsol ar +j a +Ġpract ices +Ġr ide +ĠP enn +Ġimpro ved +Ġaud io +Ġbehav i +ĠP S +Ġe ating +D ata +ĠRe view +p ass +cl aim +u ated +ang ers +c hen +Ġproper ties +Ġany where +An other +Ġbl ow +ĠJack son +Ġp roud +Ġplan e +l ines +Ġsqu are +Ġpro of +ans as +Ġtalk ed +m akers +Ġs ister +Ġhold s +Ġres ident +Ġ= = +Ġresist ance +Ġspl it +Ġpro secut +Ġconf idence +res ents +Ġcut s +Ġexcept ion +Ġz ero +Get ty +Ġcop yright +Ġtot ally +orm al +ific ations +ĠAustral ian +Ġs ick +Ġ1 50 +Ġhouse hold +Ġfe es +Ġdri vers +og en +ĠN Y +Ġnecess arily +Ġregul ations +ear ing +s l +Ġperspect ive +c are +ic ial +H is +Ġesc ape +Ġsurpr ised +ĠV an +ur rent +Ġv ac +8 1 +ĠTh us +Ġem phas +ĠCh ampions +ĠI ce +Ġn arr +Ġhead s +Ġca using +b el +f ortunately +ĠM a +Ġtarg ets +ci pl +Ġafter noon +Ġadd s +ĠMay be +ĠF our +ess ed +ple te +Ġus ual +ch o +ing u +Ġwith d +ĠE nergy +ĠE conom +O O +Ġart icles +Ġinj ured +Ġman age +Ġexpl ains +Ġdi agn +R ec +at ures +Ġlink ed +Ġdiscuss ed +Ġexpl o +Ġocc asion +ath an +Ġopp osite +Ġfac es +Ġden ied +ĠK night +Ġn ut +Ġapprox imately +Ġdisapp oint +onym ous +ĠB est +ĠL o +ĠH y +ĠA ff +Ġvot ing +an while +ĠII I +Ġinstit utions +ag ram +ĠD aily +Ġdr ag +Ġnear by +Ġgu ilty +Ġcon ver +P re +s hip +Ġre ward +Ġphilos oph +ĠS S +u gh +Ġapp s +f riend +Ġu pper +Ġad vert +Ġs now +Ġfr ust +Ġour selves +F r +ĠD ie +amp ion +Ġdis miss +Ġc ere +Ġsign al +f rom +Ġ ). +Ġ5 2 +Ġcr imes +it ors +est ival +use um +Ġcoun cil +ĠS aud +M ay +ĠG un +ic ian +et her +Ġsu fficient +ĠH en +so le +Ġhistor ical +ĠF ar +ĠT urn +Ġp in +Ġsuc ceed +m at +ly mp +Ġtrad ition +ĠO k +Ġc ro +Ġdesc ription +al le +Ġsk y +T e +Ġwide ly +Ġw ave +Ġdefin ition +ĠJew s +Ġcy cle +Ġref ere +Ġbr ings +us al +Ġal ive +Ġfrequ ently +Ġint ention +ĠCont rol +l v +y stem +Ġpriv acy +g ent +ren ce +ĠQu est +ĠChrist mas +Ġr ail +Ġco oper +Ġtest ed +ĠC apt +as ks +Ġcomfort able +Ġdel ivered +sc ape +Ġdep th +ĠG OP +Ġwrit es +Ġass ets +Ġsa v +im ents +Ġtrans ition +Ġart ist +ĠL ook +Ġl ob +Ġcomp onents +ar ity +Ġwalk ed +Ġro ot +Ġparticip ants +Ġnot iced +Ġres c +Ġn av +ĠAd minist +d a +ut ral +pl ate +Ġimport ance +Ġass ert +ious ly +c ription +Ġinj uries +ĠChe ck +Ġregist ered +Ġint ent +Ġmiss ed +ograph ic +Ġsent ence +oun ter +Ġassist ance +ev in +Ġdat abase +Ġbuild ings +Ġclass ic +Ġth inks +ĠOh io +P r +ug g +Ġfe e +p an +Ġeffect ively +Ġfac ility +Ġbe ar +Ġch apter +Ġdog s +ĠCol umb +Ġl atter +it ial +Ġad mitted +T V +ĠGe org +Ġpost s +\ \ +Ġlawy er +Ġequ ival +Ġm and +Ġcontro lled +ĠW alk +ĠAnd rew +Ġmen u +am ental +Ġprotect ed +v a +Ġadminist r +or al +Ġre in +ĠS ar +Ġamount s +Ġn ative +ĠM oon +Ġrep resents +Ġab andon +Ġcarry ing +Ġt ank +m ary +Ġdecl ared +T ube +Ġh at +Ġpun ish +el lect +m es +Ġun iverse +ĠR od +ph y +Ġinf rastructure +Ġ5 1 +Ġopp osed +ow nt +c a +ĠM ake +Ġhard ware +Ġco ffee +R el +b al +w orld +ĠS af +ĠSe a +in als +Ġown ed +Ġh all +ers ion +Ġdescrib e +ĠP ot +Ġport ion +Ġat mosp +Ġgovern ments +Ġdep ending +Ġoff ense +Ġtr ick +aw a +ĠL ine +ĠV is +ĠH ard +ĠOr ig +ĠCl ick +Ġdes k +ĠVal ley +ĠS ov +Ġmov ies +Ġrem ark +Ġm ail +Ġcons cious +Ġrul ing +ĠR ights +Ġmed ic +he nt +ĠW omen +> < +Ġrepl aced +ĠP rem +ĠTh anks +Ġre new +ĠB all +if orm +Ġsh ots +C omm +Ġar med +Ġconst ant +Ġt aste +Ġreal ized +Ġbu ff +Ġm o +Ġeffic ient +M ost +or ation +if ies +Ġcommun ication +Ġfl ood +Ġconsequ ences +Ġany way +ig g +ĠG M +ĠTh ank +Ġ iron +Ġev olution +ĠC op +tw itter +Ġ9 5 +Ġrelationship s +ad el +ĠYou ng +Ġpropos al +ay ers +uild ing +ĠH ot +OR E +c os +Ġcoll abor +P G +ax y +Ġknow ing +Ġsupport s +ow ed +Ġcontrol s +Ġmere ly +um er +Ġath let +Ġf ashion +p ath +Ġg ift +Ġer a +AN D +Ġkind s +ĠKore an +Ġleg it +ul ous +Ġess entially +Ġthe rap +n ic +Ġsuff ered +Ġh ur +Ġprom ise +Ġex cess +Ġover w +Ġpr ime +ĠH ouston +er ry +ĠM s +R S +201 2 +Ġst ores +ĠO lymp +Ġj ourney +Al though +S ub +ĠE duc +ĠCh apter +Ġrequest s +Ġconsum ers +Ġt iny +Ġis ol +ĠF air +b a +ĠY OU +Ġcr ash +ce ler +Ġemot ional +Ġgood s +Ġelect ed +Ġmod er +ĠLin ux +Ġbl ocks +Ġis land +ĠSoc iety +Ġelect ions +Ġbroad cast +Ġche ap +Ġn ations +Ġse asons +4 00 +Ġwas te +ĠS at +Ġfield s +em ploy +Ġprof ile +Ġauth ors +AL L +ĠG ra +w est +ĠT y +Ġdeath s +Ġv acc +Ġfor med +Ġd u +Ġon going +ĠMuslim s +el f +ig ure +Ġass ume +ĠUkrain e +w ater +Ġco ast +Ġvot ed +g or +ĠA S +ĠMich igan +az a +ĠAr m +i ro +Ġf lex +as ters +' ' +Ġwel come +ar l +Ġloc ations +ig ation +ĠF il +Ġbu ying +Ġarch itect +Ġhard er +ĠC ub +Ġinter face +Ġrestaur ant +Ġdisco ver +Ġex ceed +Ġfav our +ger y +Ġd uty +Ġp itch +ad or +ĠM ach +b oy +Ġrespond ed +Ġext ended +her s +M any +ra id +if er +ĠIn s +S er +Ġmed ium +s he +ĠS ports +Ġmag azine +ut ation +Ġlim its +ĠG all +Ġex ternal +raz il +Ġyoung er +t le +Ġrem ind +ĠC ON +Ġimmedi ate +Ġh idden +Ġvol unte +Ġsim pl +od cast +Ġph ase +d r +Ġpl ot +Ġexp osure +R I +og rap +v in +an ish +ĠAc ad +ĠEng ine +Ġexp ansion +ĠP ay +Y our +Ġpus hed +ĠE ll +ĠHe ad +Ġmarket ing +ĠA C +k et +Ġh its +Ġg ro +ĠA ge +ĠSc ot +] [ +Ġst im +Ġi Phone +Ī Ĵ +Ġn arrow +ĠGet ty +ĠTur key +Ġperfect ly +Ġen able +ut ch +Ġprec ise +Ġreg ime +Ġsh if +Ġcomp ens +g un +d iv +Ġch osen +ĠK en +An y +Ġtre es +Ġrecomm ended +ĠR en +u able +ĠH T +F ollow +E G +ĠH and +ĠK enn +Ġarg uments +Ġex ists +Ġb ike +ĠCons erv +Ġbre aking +ĠG ar +Ġc razy +Ġvirt ual +ay lor +ix el +Ġ19 80 +Ġper mission +ĠSer ies +Ġconsum er +Ġclose ly +c alled +Ġ5 4 +Ġhop es +Ġar ray +ĠW in +ĠLab our +Ġsp ons +ĠI re +Ġp ow +Ġread ers +Ġemploy ment +Ġcreat ure +Ġresult ing +Ġaccur ate +Ġmom ents +Ġarg ued +Ġp ed +D uring +Ġ5 3 +ĠT al +Ġs ought +Ġsuff ering +Ġ icon +le e +Ġ( $ +al ian + ° +Ġp ra +Ġbon us +( " +k o +Ġact ing +D E +f all +Ġcompar ison +Ġsm ooth +ĠN AS +u pp +ĠJose ph +ep ing +ĠT ake +ĠM id +Ġs ending +f ast +ĠF all +Ġdeal ing +us er +ĠOr gan +C o +Ġatt ached +Ġse es +% . +Ġtyp ical +AR T +Ġfind s +ĠAs ia +um in +ĠC ore +ĠE nt +in ent +u ce +ĠBl ood +ĠN ever +Ġem ails +Ġhigh light +Ġconf ront +at us +ut ed +Ġun us +Ġtop ic +ĠAd am +Ġb le +at i +Ġunder stood +S et +st ruct +T P +Ġm ob +a a +ĠSt art +pect ed +se ll +Ġded icated +ĠC A +u an +Ġsong s +esc ription +Ġte ch +Ġr ape +Ġas ide +Ġgr ant +Ġ5 6 +s ub +Ġarg ue +Ġcont aining +Ġsche dule +Ġliber al +Ġpublic ly +Ġheav ily +ĠU t +in er +ĠS ection +ĠC are +we et +l s +D is +âĶ Ģ +ĠF ollow +B ack +ĠI T +Ġb es +j i +ĠH it +est ed +Ġevery body +ĠSw ed +Ġfem in +Ġfac ilities +Ġcon ven +C omp +ĠO S +c ore +Ġan x +Ġdiv ision +ĠC am +ĠSt an +m ates +Ġexpl ore +pl om +Ġsh ares +pl oad +an es +Ġide al +et ers +ĠB ase +Ġpl astic +Ġdist inct +ĠNet work +ĠSe attle +Ġtrad ing +ens us +int end +Ġex hib +Ġinit ially +ĠF ood +Ġthous and +ĠBus iness +act er +Ġpar agraph +Ġrough ly +Ġw ww +Ġcreat ive +ĠCon f +Ġconsum ption +Ġfil ms +ag an +Ġob tain +Ġt all +Ġt or +Ġacknow led +Ġg rown +al o +K E +Ġ4 00 +end ers +t aining +U G +Ġsu icide +Ġwat ched +ĠL ist +al i +re hens +Ġsurround ing +Ġp ip +Ġf lying +ĠJ ava +ord an +Ġserv ing +in ations +p ost +Ġsh o +A v +Ġj ail +z y +Ġ199 9 +Ġ< / +Ġliter ally +ĠS ir +Ġexp osed +Ġl ies +st ar +Ġb at +Ġear ned +ĠD ig +Ġspec ified +ĠSe ason +Ġdeg rees +Don ald +Ġcent re +Ġsh aring +Ġwin ter +ĠC O +C he +Ġ Î +M P +Ġun w +Ġfew er +ĠM ir +Ġsomew here +ĠK ey +Ġattack ed +ĠK ir +Ġdom ain +Ġstrong er +Ġ9 9 +Ġpen alty +I d +Sc ript +Ġdecl ined +Ġne ck +Ġfra ud +Ġcur rency +Ġr ising +R C +âĢ¦ âĢ¦ +H z +Ġt ab +Ġtal ent +n am +ĠN BA +Ġvill age +Ġleg s +ĠN ext +E d +Ġac id +Ġhy d +8 00 +Ġinvol ving +ĠIm age +ĠBe fore +F l +Ġyes terday +S ource +Ġterror ist +Ġsu p +Ġsy nt +ĠSaud i +Ġw est +Ġr u +b urg +Ġvis ible +Ġstru ck +r ison +Ġaw esome +Ġd rawn +Ġansw ers +ĠG irl +ĠR am +Ġthreat s +Ġdef eat +os it +Ġv ent +atur ally +Americ an +end a +ĠH oly +Ġr um +% , +c ase +ĠHist ory +ĠYou Tube +Ġsit uations +ĠD NA +S te +Ġsa ved +It em +Ġrec ip +olog ist +Ġfac ed +Ġel ig +O nce +ĠL i +u h +Ġmist ake +ĠDiv ision +ĠB ell +Ġsympt oms + ® +Ġdom in +Ġfall ing +Ġend ing +as hes +Ġmat ches +ĠOn line +Ġexplan ation +D ef +red it +Ġany more +ĠT otal +ĠF OR +us hed +Ġlet ters +Ġris ks +ĠO K +Ġreported ly +: \ +Ġpl ate +Ġsubject s +Ġattempt ed +if ier +ian a +Ġunlike ly +ĠTh ough +um a +ĠIn vest +ĠPr in +ic an +ĠD ar +ĠColor ado +au g +Ġve get +a os +ri a +Ġshe l +Ġmark ed +Ġ( ) +Ġsp r +p o +ĠL ink +Ġdef e +ĠJ r +Ġthem e +Ġpass ion +ĠP en +Ġinf o +iz er +Ġsh it +ĠC ivil +ap se +c re +Ġpo ly +Ġcomp onent +ĠChar les +ĠIre land +ĠPro v +Ġdo ctors +Ġgr anted +Ġpain t +Ġhon or +Ġsm oke +Ġpay ments +Ġprim arily +ĠKing dom +r ich +ate ll +Ġde als +Ġsched uled +Ġfund amental +Ġprote in +Ġnewsp aper +Ġcl ients +yth on +ĠD ate +h us +Ġfeed back +Ġstret ch +Ġc ock +Ġhot el +ĠQue en +Ġsu gar +Ġj u +Ġmil k +Ġappro val +ĠL ive +Ġequival ent +ef ully +Ġins ert +z ona +Ġext ension +d ri +J ohn +Ġacc omp +S m +ĠF und +Ġconst antly +Ġ` ` +Ġgener ated +ĠA ction +ĠP sych +ĠT ri +Ġrecogn ize +Ġv ary +ph a +ĠR a +d f +et ch +ĠSov iet +Tw o +Ġpattern s +Ġprof ession +an ing +T ime +ĠL im +Ġcol ors +ĠA z +ĠT R +Ġinf ect +Ġphen omen +Ġshe ll +Al so +Ġput s +Ġdel ivery +Ġbro wn +Ġprocess ing +Ġlight s +ess age +ĠBro ok +ĠA ud +l ation +Ġindust rial +L ike +ĠB razil +rou s +ES S +ĠL uc +Ġsome how +Ġ8 5 +Ġpro port +Ġpolit icians +Ġindic ate +Ġh ole +Ġtechn iques +Ġcompet itive +Ġph r +Ġv o +ist ent +ĠD ream +Ġcamp us +Ġaspect s +Ġhelp ful +Ġsh ield +or se +Ġtrig ger +m al +Ġ5 8 +Ġt ort +Ġperson ally +Ġt ag +Ġkeep s +ĠV ideo +Ġben ch +Ġg ap +a ire +Ġe ast +Ġrec overy +per ial +Ġprof it +ĠM ic +Ġ5 7 +Ġcol on +Ġstrong ly +st yle +Ġalleg ations +h an +Ġrep orters +j o +r ine +arg et +and al +Ġ0 3 +Ġfl ash +tr ans +Ġstr ict +Ġpark ing +ĠPak istan +Ġl i +Ġwe ird +ĠE ric +Ġreg ions +ĠJ un +Ġint ellect +ĠW H +od ing +rib utes +up id +ĠT it +Ġf inger +or ia +Ġe lev +ĠF ield +Ġcon clusion +; ; +Ġfeel ings +Ġext ensive +Ġm ixed +Ġne uro +v y +Ġhar ass +ĠC irc +ou ch +Ġterrit ory +Ġsuccess fully +M ar +Ġing red +Ġoverw hel +Ġl ayer +V iew +Ġall ies +ill ance +ĠTh ree +Ġb unch +Ġnorm ally +Ġnet works +Ġsac r +ĠC IA +b les +Ġch ose +Ġopp onents +Ġregard less +Ġfr anch +Ġpre f +ĠP o +Ġbr idge +ann a +ĠSil ver +Ġw age +p age +ri or +Ġrad ical +ĠL ittle +Ġman ip +Ġsecret ary +Ġg ang +D R +F A +Ġdec ent +ĠSp irit +Ġun cle +ĠDevelop ment +Ġinvest ors +Ġwall s +Ġpub lish +Ġgener ate +iss ions +c ar +Ġprom ote +Ġcut ting +Ġche st +Ġdrink ing +Ġcollect ed +Ġ7 2 +Ġhop ing +Ġem br +gor ith +Ġwar ned +Ġinstruct ions +O G +ĠD id +ĠAg ency +Ġg ear +Ġcritic ism +ĠF urther +Ġut il +ann y +R ed +Ġcoun sel +ĠAs ian +Ġredu ction +p ool +Ġteach ing +Ġdeep ly +i y +Ġestim ates +Ġcho ices +Ġperman ent +in em +ke l +Ġf asc +p se +f ile +ĠL ow +ĠP erson +Ġt ournament +st al +Ġm el +U ST +ĠR ay +az i +V al +Ġcont ained +ĠH olly +Ġw ake +Ġreve al +Ġprocess es +ĠIS IS +Ġ0 9 +Ġbl ind +Ġste el +ĠB ad +Ġcare fully +app y +ro it +Ġg aming +Ġhous es +ĠC oll +Ġtr uck +er m +Ġsc ored +Ġocc as +ret urn +b ound +v ar +Ġsh arp +Ġaf raid +ĠE X +am ber +c ific +Ġsche me +N C +ĠPol it +Ġdecl ine +Ġ199 8 +Ġpus hing +Ġposs ession +Ġpriv ile +Ġteacher s +Ġy ield +H A +ĠDav is +it led +#### #### +Ġr ig +ĠD aniel +ac on +Ġh ide +ut en +Ġcolle agues +Ġprin ciples +Ġl oud +Ġs in +ĠDem on +Ġst one +Ġ0 2 +Ġt aught +Ġter rible +Ġst uck +ĠPol icy +te en +Ġimplement ation +ĠB BC +ĠAP I +Ġwhe el +all as +Ġch ampions +ol ars +play er +Ġrepeated ly +ĠSt ill +Ġlik es +ast y +es ter +ĠCath olic +R L +Ġb ath +Ġno ise +t itle +Ġn orthern +P art +Ġmag n +Ġf ab +ĠAs h +Ġdis pl +Ġtick et +Ġm urd +Ġalong side +ĠMus ic +Ġr iver +ĠSte el +ĠC L +ĠPl ayer +ĠM ult +ow ing +re p +s ize +Ġt ur +ĠGeorg ia +isc al +ra ction +Ġc able +Ġ5 9 +Ġw ins +Ġup coming +Ġsurv ive +Ġins pired +ĠEduc ation +Ġstat istics +ĠF oot +iam i +Ġy ellow +ĠP age +. - +ĠH as +Ġur ban +Ġa x +es sel +\ " +Ġquarter back +Ġreg ister +ĠLab or +Ġab ilities +ĠF amily +Ġvar iable +ĠPr ice +Ġcont em +Ġth in +ĠE qu +d ata +Ġg otten +Ġconst it +Ġas ks +Ġt ail +Ġexc iting +ĠE ffect +ĠSp anish +Ġencour age +ins on +ĠA h +Ġcommit ment +C S +Ġr ally +Ġ: : +Ġsubs id +Ġsp in +Ġcapt ured +201 8 +Ġinn oc +Ġalleged ly +ĠC ome +Ġart ists +ĠN umber +Ġelect ronic +Ġreg ional +ap es +Ġw ra +Ġmy th +pr ise +ĠM iller +ĠC reat +ĠEp isode +b ell +Ġdirect ed +Ġext ract +Ġs orry +Ġv ice +ag ger +ĠSu pport +Ġ6 6 +ĠI ron +Ġwonder ful +Ġg ra +N et +ion e +E ng +Ġsh ips +ik es +ĠK evin +it ar +Ġactiv ists +tr ue +ĠAri zona +ent h +ĠDes pite +ĠS E +Ġha bit +ern el +Ġin qu +Ġab ortion +Ġv oid +Ġexpl icit +Ġeng aged +Ġang ry +Ġr ating +Ġfr ag +b ro +ick ing +d ev +Ġwor ried +Ġob ser +Ġap artment +ĠG T +Ġest ate +ĠConst itution +em on +ĠS now +Ġcount y +Ġdis ag +ĠStep hen +Ġimm igrants +w ind +ĠN ations +Ġfol ks +O ut +Ġg all +Ġtarget ed +Ġst ead +ĠB on +ĠL ib +Ġinform ed +Ġ12 0 +ch ain +idel ines +or ough +Ġdri ven +Ġregular ly +Ġbas ket +Ġprinc iple +oc ument +Ġst un +ib ilities +ĠRom an +ĠAb out +Ġal ert +Ġdemocr acy +Ġrepresent ed +H S +c ers +p arent +Ar t +p ack +Ġdi plom +re ts +ĠN O +Ġcapt ure +ĠAd v +Ħ ¢ +Ġannounce ment +ĠL ear +Ġh ook +Ġpur s +ĠS uch +ĠC amer +Ġrefuge es +ĠV e +P ol +Ġrecogn ized +l ib +Ġhad n +A ss +Ġpil ot +us hing +Ġreturn ing +Ġtra il +ĠSt one +Ġrout ine +Ġcour ts +Ġdes per +Ġfriend ly +ĠIt aly +Ġpl ed +Ġbreat h +Ġstud io +N S +Ġimp ressive +ĠAfghan istan +Ġf ing +Ġd ownt +ink ing +ĠR og +i ary +col or +se x +ar on +Ġf ault +ĠN ick +D own +ĠR ose +ĠS outhern +X X +is odes +L ist +6 00 +Ġout come +er r +Ġelse where +Ġret ire +Ġp ounds +ĠGl obal +Pe ople +Ġcommun ications +Ġlo an +Ġrat io +ĠEm pire +Ġg onna +Ġinv ent +D F +Ġ19 70 +ĠComm on +p at +Ġprom ised +Ġd inner +ĠH om +Ġcreat es +Ġoper ate +ver ty +ĠJ ordan +et ime +Ġsust ain +R eg +Ġincred ible +im a +Ġwar rant +Ġm m +A tt +Ġlaw suit +Ġreview s +it ure +ĠS ource +l ights +ĠF ord +Ġ6 3 +g roup +st ore +Ġfeat ured +Ġfore ver +Ġpo verty +ĠP op +ĠC NN +az z +ab is +ach ing +Ġl aid +ĠSu pp +Ġfil ter +en a +ĠCommun ity +Ġcreat ures +u ction +ĠR oyal +Ġassoci ation +ĠCon nect +ĠBr ad +âĸ Ī +l ers +the re +ĠG i +Ġval uable +AC K +ĠT aylor +Ġl iquid +ĠAtt orney +ĠCar l +ĠF inal +ag a +ĠWil son +B ecause +ĠProf essor +ak a +Ġincred ibly +r ance +! ) +R ef +s k +Ġsol utions +Ġatmosp here +Ġbl ame +um es +ĠN ob +C A +um ps +r ical +ĠPut in +ĠD est +or ic +ĠP A +Ġrespect ively +w an +Ġfif th +â Ħ¢ +ĠC ry +Ġgovern or +res ident +Ġpurch ased +Ġh ack +Ġint ense +ob s +Ġorig in +Ġdef ine +Ġcare ful +** * +Ġshould er +Cl ick +Ġt ied +Ġdest ruction +ou red +Ġno body +Ġh o +ĠEx per +Ġt ip +" ; +Ġtechn ique +Ġj ur +ĠP ok +b ow +Ġleg end +Ġacc ord +Ġbus y +ĠInt el +Ġh ang +ak i +. ] +âĢĶâĢĶ âĢĶâĢĶ +Ġsur gery +Ġrep rodu +Ġun iform +Ġscen es +c ode +Ġ6 2 +l isher +ĠH ave +ph ia +Ġcry pt +Ġrec on +Ġsc ream +Ġadop ted +Ġsc ores +N e +ĠIt alian +in cluding +B O +Ġindic ated +Ġent ertain +G u +T ext +i el +Ġtw enty +Ġeng age +off s +ĠPac ific +Ġsm ile +Ġperson nel +Ġto ler +Ġdo ors +Ġt one +Ġmach ines +Ġent ering +ten ance +C O +ĠJer sey +Ġfore st +Ġhor se +Ġcompl aint +ĠSpr ing +y o +ĠPl us +ed ing +ĠRet urn +qu arters +ial s +c ow +Ġacad emic +Ġf ruit +Ġ199 6 +og ether +Ġw ine +Ġpur su +ĠSte ven +Ġlic ens +Wh o +Ġclot hes +re ction +Ġsqu ad +Ġst able +Ġr aw +z ens +St ar +ut ies +anc er +Ġke ys +ĠM u +Ġcompl icated +ig er +ĠTe xt +Ġabs or +Ġ6 8 +Ġfun ny +Ġrel ief +ĠL ew +ĠC ook +Ġch art +Ġdraw ing +G E +Ġmod ule +ĠB ull +I LL +Ġs alt +0000 0000 +il le +Ġres ource +aw ay +adel phia +ĠB ru +Ġ6 7 +Ġsome body +Ġparticip ate +Ġro se +we red +Ġmus cle +Ġcons ent +Ġcontin uing +ĠGuard ian +ĠOr der +reg on +Ġre ar +Ġprov ision +Ġlik ed +ri ent +Ġb ra +Tr ans +Ġmeet ings +Ġto x +Ġcon vent +Ġaut o +Ġrec ording +ĠSo ft +00 1 +ĠR oll +Ġprogram ming +Ġp ic +Ġprov ed +Ġst ab +ĠA st +Ġca ption +ul ating +ĠAtt ack +Ġnew ly +Ġ199 7 +f r +Ġdis cipl +ĠGree k +Ġed ition +ĠDo es +ĠB ox +if le +ack et +Ġpass es +Ġgu est +Ġac celer +it als +U D +Ġaut hent +ĠR est +ov al +t a +u ine +Ġarm or +ĠT own +Ġcomp at +Ġinc hes +Des pite +Ġass ign +he rent +Ġprep are +ĠM eg +oc key +Ġdep ends +Ġtrack s +w atch +Ġl ists +ĠN orthern +Ġal ter +re c +ĠE astern +Ġcond em +Ġevery where +? ' +Ġaff ili +Ġf ought +": {" +Ġm ac +it arian +Ġsc ope +ĠA L +aw s +ar ms +Ġqu e +Ġenjoy ed +nes ota +Ġagg ressive +ĠSt ory +ĠI V +Ġrec ipe +Ġrare ly +ĠMed ical +val ue +ang el +ay ing +omet hing +Ġsub section +Ġs outhern +Ġfrequ ency +re te +roll ed +ult s +ĠN ic +Ġbeh alf +Ġsequ ence +ab et +Ġcontrovers ial +Ġcomp rom +Ġwork er +Ġmain ly +Ġal gorith +ĠM ajor +or ce +g ender +Ġorgan ized +Ġf ake +Ġconclud ed +ĠE D +ĠEx ec +r age +Ġch ances +ber ry +ĠTr ad +Ġconfig uration +Ġwithd raw +Ġf ro +ud es +ĠBro ther +ĠB rian +Ġtri es +Ġsam ples +Ġb id +ĠGold en +Ġphot ograph +if est +ĠD O +ĠPar liament +******** ******** +R em +Ġcont est +Ġsign ing +p x +ĠZ eal +âĶĢ âĶĢ +E ar +Ġex it +Be fore +ĠCor por +n ull +mon th +Ġrac ial +ott ed +ĠV eg +ĠRe uters +Ġsw ord +ps on +ĠRom ney +a ed +Ġt rib +Ġin ner +Ġprot ocol +ĠB i +ĠM iami +ever al +p ress +Ġsh ipping +ĠAm endment +ĠHow ard +con nect +ĠD isc +ĠJ ac +iam ond +ĠThere fore +s es +ĠPrin cess +ĠUS B +ĠAn th +Ġsurve illance +Ġap olog +Ġ6 1 +ow a +Ġf ulf +j s +Ġl uck +ust ed +Ġ § +n i +Ġant icip +em an +Ġwin ner +Ġsil ver +ll a +ic ity +Ġunus ual +Ġcr ack +Ġt ies +e z +Ġpract ical +Ġprov ince +ĠPl ace +Ġprior ity +IC E +Ġdescrib es +Ġbr anch +F orm +ask a +miss ions +b i +Ġp orn +ĠTur k +Ġent hus +Ġf ighters +Ġ0 8 +ĠDet roit +Ġfound ation +av id +A re +Ġjud gment +cl ing +Ġsol ve +ĠDes ign +W here +hes is +ĠT ro +a fter +Ġne utral +ĠPalestin ian +ĠHolly wood +Ġadv is +ĠN on +y es +ol is +Ġrep utation +Ġsm ell +Ġb read +ĠB ul +ĠBe ach +Ġclaim ing +Ġgen etic +Ġtechn ologies +Ġupgr ade +row s +Ġdevelop er +ĠJ osh +ĠDis ney +erv ed +ip al +Ġun ex +Ġbare ly +t hen +ĠP ub +Ġill ness +et ary +ĠB al +Ġp atch +Ġbut t +Ġst upid +ĠD og +ĠD allas +f ront +ie ce +Ġprot ests +Ġch at +oen ix +Ġw ing +Ġpar liament +Ġ7 7 +ose xual +Ġre nder +pt ions +ĠCo ast +os a +ĠG reg +h op +ĠMan agement +Ġbit coin +Ġrec over +Ġincor por +or ne +ĠUs ing +Ġpre ced +Ġthreat ened +Ġspirit ual +ĠE vent +ĠF red +Ġadvert ising +Ġimprove ments +ĠC ustom +Ġer rors +Ġsens itive +ĠN avy +Ġcre am +L ook +Ġex clusive +Ġcomp rehens +Ġde leg +Ġcon ce +Ġrem em +Ġstruct ures +Ġst ored +N D +Ġ1 000 +U P +ĠB udd +A F +w oman +ĠAcad emy +ð Ł +se a +Ġtem porary +Ab out +es ters +Ġtick ets +Ġposs ess +in ch +o z +Ġl a +Ġcontract s +Ġun p +Ġc ig +ĠK at +ult ural +as m +Ġmount ain +ĠCapt ain +St ep +m aking +ĠSp ain +Ġequ ally +Ġl ands +at ers +Ġreject ed +er a +im m +ri x +C D +Ġtrans action +g ener +less ly +Ġ| | +Ġc os +ĠHen ry +Ġprov isions +Ġg ained +Ġdirect ory +Ġra ising +ĠS ep +ol en +ond er +Ġcon sole +in st +Ġb om +Ġunc ertain +1 50 +ock ing +Ġmeas ured +Ġpl ain +Ġse ats +Ġd ict +S L +af e +Ġest imate +iz on +at hered +Ġcontribut ed +Ġep isodes +omm od +G r +AN T +Ġ6 9 +G ener +Ġ2 50 +vious ly +rog en +Ġterror ism +Ġmove ments +ent le +oun ce +ĠS oul +Ġpre v +ĠT able +act s +ri ors +t ab +Ġsuff er +Ġn erv +Ġmain stream +ĠW olf +Ġfranch ise +b at +Ġdem ands +Ġag enda +Ġdo zen +Ġclin ical +iz ard +ĠO p +t d +Ġvis ited +ĠPer haps +Ġact or +Ġde lic +Ġcont ribute +Ġin ject +ĠE s +ac co +Ġlist ening +Ġcon gress +epend ent +Ġprem ium +Ġ7 6 +ĠIr ish +Ġass igned +ĠPh ys +Ġworld wide +Ġnarr ative +ot ype +m ont +b ase +ĠB owl +ĠAdminist ration +Ġrel ation +ĠE V +C P +Ġco vers +Ġ7 8 +Ġcert ific +Ġgr ass +Ġ0 4 +pir acy +ir a +Ġengine ering +ĠM ars +Ġun employ +ĠFore ign +st ract +Ġv en +Ġst eal +Ġrepl ied +Ġult imate +Ġtit les +d ated +Ġj oy +a us +Ġhy per +ak u +Ġoffic ially +ĠPro duct +Ġdifficult y +per or +Ġresult ed +rib ed +l ink +wh o +~~ ~~ +ĠSpe ed +ĠV iet +W ind +ĠBar ack +Ġrestrict ions +ĠSh are +Ġ199 5 +ition ally +Ġbeaut y +op t +Ġm aps +ĠC R +ĠN ation +ĠCru z +W ill +Ġelectric ity +Ġor g +Ġb urd +Ġviol ation +Ġus age +Ġper mit +ĠCh ron +ĠF ant +Ġn aturally +Ġ0 7 +Ġth rown +ĠAw oken +Ġal ien +ĠHer o +ĠK ent +ĠR ick +ri ke +Ġp ace +}, {" +G L +Ġpo ison +ĠT ower +Ġform al +al ysis +Ġgen uine +Ġk il +a ver +Ġproced ure +ĠPro p +intend o +ĠM ain +as ant +Ġtr ained +G ame +ĠL oad +ĠM A +Ġcru cial +Ġle ts +ĠF R +Ġch ampion +1 01 +ĠCon ference +Ġwrit ers +Ġconnect ions +Ġo kay +ir ms +ĠR and +Ġenc ounter +ĠB uff +Ġachie ved +Ġche cks +isc ons +Ġassist ant +Ġwhen ever +ĠA ccess +ĠU r +b in +Ġcl ock +is p +op her +Ġb orrow +Ġm ad +Ġperson ality +on ly +IS T +ab ama +Ġg ains +Ġcommon ly +Ġter r +Ġhyp ot +Ġre ly +Ġt iss +iscons in +Ġrid ic +f unction +ĠO regon +Ġun com +r ating +el and +ĠN C +Ġm oon +ann on +Ġvulner able +ut ive +³³ ³³ +ĠRad io +Ġw estern +se ct +ĠT ony +Ġocc urs +ĠO s +ĠH on +Ã Ń +Ġv essel +ĠScot land +Ġdiscrim ination +Ġsubsequ ent +st ring +Ġfant asy +ĠSh adow +Ġtest im +W E +it i +r as +Ġbo at +Ġmar ks +Ġord inary +Ġre n +Ġrepresent ative +Ġpet ition +Ġ7 3 +Ġad venture +Ġign ore +ĠPhil adelphia +ĠS av +V P +Ġfact ory +Ġt asks +Ġdep ression +z ed +................ ................ +ĠSt orm +Ġc ogn +Ġelig ible +Ġredu cing +v ia +Ġ0 5 +Ġstri king +Ġdoll ar +h o +O V +Ġinstr ument +Ġphilosoph y +ĠMo ore +ĠA venue +Ġrul ed +ĠFr ont +IN E +ĠM ah +Ġscen ario +ĠNAS A +Ġen orm +Ġdeb ut +Ġte a +T oday +Ġabs ence +S im +Ġh am +le ep +Ġt ables +ĠHe art +M I +K e +re qu +V D +m ap +Ġchair man +Ġp ump +Ġrapid ly +v i +Ġsubstant ial +E P +d es +ch ant +ili pp +ĠS anta +ri ers +anche ster +L oad +ĠC ase +Ġsa ving +Ġ7 4 +ĠA FP +er ning +oun ced +ĠMin nesota +ĠW as +Ġrec ru +Ġassess ment +ĠB ron +U E +Ġdynam ic +Ġf urn +ul ator +Ġprop ag +h igh +Ġacc ommod +Ġst ack +ĠS us +w rit +Ġre ven +ĠGod d +ĠZeal and +ab s +Ġbr ut +Ġper pet +h ot +Ġhard ly +ĠB urn +ãĤ ¹ +Ġst y +Ġtrans actions +Ġg ate +Ġsc reens +Ġsub mitted +Ġ1 01 +Ġlangu ages +ugh t +em en +Ġfall s +Ġc oc +Ĥ ¬ +Ġstri kes +p a +Ġdel iber +ĠI M +Ġrel ax +ann els +ĠSen ator +Ġext rem +Ġ} , +ĠDe b +Ġbe ll +Ġdis order +c ut +Ġi OS +Ġl ocked +Ġem issions +Ġshort ly +" ] +ĠJud ge +ĠS ometimes +Ġr ival +Ġd ust +Ġreach ing +F ile +¯¯ ¯¯ +ino is +ĠJ ason +Ġs atell +are t +Ġst ations +Ġag ric +ĠTechn ology +com es +ĠUn fortunately +ĠChild ren +Ġappl ies +ast ed +Ġan ger +ail ability +ĠDam age +Ġcomp are +ĠStand ard +Ġaim ed +ĠB a +angu age +Ġreg ulation +Ġj ury +Ġair port +Ġse ctions +ĠPr ince +em ed +Ġmedic ine +Ġh itting +Ġsp ark +ol ves +Ġad s +St ate +Ġfood s +Ġrepl acement +Ġch icken +Ġlow est +Ġmind s +Ġinvol ves +u i +Ġarr ang +Ġproced ures +ĠWh ich +ivers ary +Ġb ills +Ġimprove ment +Ġin ev +Ġexpect ations +Ġintellect ual +Ġsp aces +Ġmechan ism +2 50 +bre ak +ĠZ e +ĠT enn +ĠB alt +Ġbar rel +Ġstat ic +man n +Pol ice +Ġt ips +Ġhand ling +c us +od ed +il ton +ir y +Ġjournal ists +our se +Ġcom ic +Ġnom ine +IT Y +Ġvers us +Ġlo op +Ġsur f +ĠInd ust +ĠHun ter +Ġbelief s +is an +Ġset up +Ġbre w +im age +Ġcomput ers +f ol +} ," +ĠMed al +Ġtax p +Ġdisplay ed +Ġg rav +Ġf iscal +M on +ĠMos cow +ĠK ong +ĠCent re +Ġcamer as +ĠMr s +ĠH ay +Ġa ver +ĠK elly +p y +Ġrequire ment +Ġent itled +omb ie +Ġsh adow +ag ic +ĠA k +Ġel ite +Ġdiv ided +Ġhead ing +Ġcop ies +Ġloss es +Ġv it +k ed +ĠB ry +Ġan s +ĠSte am +Ġrep orter +he im +ĠIt em +Ġsuper ior +d on +ere nt +à ¶ +Ġtherap y +Ġpe ak +ĠMod el +Ġl ying +Ġg am +z er +r itten +Ġrespons es +Ġconsider ation +ĠB ible +Ġl oyal +Ġinst ant +Ġp m +ĠFore st +à ¼ +Ġext end +Ġconv icted +Ġfound er +Ġconv in +ĠO ak +che ck +Ġsch olars +p ed +Ġover se +T op +c ount +ĠAr k + · +Ġ0 6 +ĠL A +m d +ĠLat in +im ental +ĠC PU +Ġsubst ance +Ġminor ity +Ġmanufact uring +E r +ocol ate +Ġatt ended +ĠMan ager +r ations +Ġappreci ate +om y +GB T +id ency +B L +Ġguarant ee +pos ition +Ġo cean +clud e +Ġhead ed +Ġt ape +Ġlo ose +Ġlog ic +Ġpro ven +Ġsp ir +Ġad mit +is a +Ġinvestig ate +Ġ199 4 +sy lv +ĠL ost +c est +Ġ7 1 +Ġrequest ed +Ġwind ows +ĠPok é +ĠWith out +M et +Ġbehavi our +Ġread er +Ġh ung +ĠKe ep +Ġro les +Ġimplement ed +Ġbl ank +Ġserv es +ĠJ ay +Ġc ited +ĠF riend +prof it +ap on +Ġrep air +it em +arr ass +Ġcrit ics +ad i +ĠF ather +Ġsh out +Ġf ool +Ġ8 8 +Ġprodu cing +Ġl ib +Ġround s +Ġcirc le +Ġpre par +Ġsub mit +Ġn ic +mor row +ãĥ « +U nder +Ġv ital +ater n +Ġpass word +Ġpublic ation +Ġprom inent +Ġspeak s +Ġb ars +Ġde eper +ĠM ill +port ed +Ġw id +Ġbut ter +Ġsm oking +Ġindic ates +K ey +rop ri +ĠF ile +all ing +ast ing +ĠR us +Ġad j +Ġ7 9 +av al +Ġpres um +bur gh +on ic +Ġf ur +Ġpoll s +ik a +Ġsecond ary +Ġmon ster +ig s +ĠCur rent +E vent +Ġowners hip +end ar +Ġarri ve +ĠT ax +Ġn ull +ĠPri v +Ġth ro +Ġk iss +c at +Ġup set +ang le +it ches +ect or +olog ists +ĠGal axy +Ġcor ruption +Ġh int +ent er +ĠH ospital +Ġgreat ly +Ġbeg un +es y +Ġso il +ĠAnt on +Ġmain tenance +ãĥ © +Ġdo zens +Ġhuman ity +ĠAl abama +Ġr om +w orth +ap ing +sylv ania +l ah +Ġg athered +G A +Ġattack ing +f ound +ĠSqu are +Ġar bit +ict ions +ĠW isconsin +Ġd ance +ĠS aint +arch y +Ġbase ball +Ġcontribut ions +Ġliter ature +Ġex ha +per ty +t est +Ġb ab +Ġcontain er +let ter +Ġfall en +Ġwebs ites +Ġbott le +ĠS ac +Ġbre ast +ĠP L +Ġveter an +Ġinterview s +ĠA le +Ġb anned +eng ers +ĠRev olution +in th +Ġconc erning +IV E +Ġexp enses +ĠMatt hew +ĠColumb ia +d s +ist ance +Ġent ity +.. ." +Ġrel iable +Ġpar alle +ĠChrist ians +Ġopin ions +Ġin du +l ow +Ġcompet e +Ġth orough +Ġemploy ed +Ġestablish ment +ig en +ĠC ro +Ġlawy ers +ĠSt ation +T E +ĠL ind +ĠP ur +it ary +Ġeffic iency +âĢ IJ +ĠL y +Ġm ask +Ġdis aster +Ġag es +ER E +es is +ĠH old +Ġcas ual +b led +Ġen abled +ĠEn vironment +ĠInt elligence +i per +ĠM ap +ĠB E +Ġemer ged +is dom +Ġc abin +Ġregist ration +Ġfing ers +Ġro ster +Ġfram ework +ĠDo ctor +et ts +Ġtransport ation +Ġaware ness +H er +Ġattempt ing +O ff +ĠSt ore +ÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤ +ĠK now +Ġdef ence +Ġsc an +ĠT en +ĠCh air +ĠP H +ĠAtl anta +Ġfuck ing +Ġans wered +b n +ĠK ar +Ġcateg ories +Ġr ational +Ġc ust +Ġrob ot +Ġcorrect ly +Ġg if +Ġgraph ics +m ic +Ġground s +ĠO pp +i ate +Ġdist ributed +Ġsan ctions +Ġchalleng ing +ut o +Ġingred ients +Ġinv ited +Ġfound ed +ĠRe qu +d ed +Ġb owl +Ġbrother s +ĠH a +I O +Ġw ages +im ore +oc ial +Ġse ed +ative ly +Ġaddress es +ĠI owa +ab eth +Ġatt itude +is d +ch ild +Ġm ole +Ġdisco very +y ard +B r +Ġ8 2 +Ġsuppl ies +ell ing +Ġdist ingu +C R +Ġre cept +Ġ vert +Ġsw im +b ec +d oor +ĠY eah +Ġg al +Ġinter act +ĠE SP +ĠC S +amp s +Ġconvin ced +Ġobject ive +Ġdis h +ĠPhot os +l ad +Ġdownt own +o il +in ction +Ġto morrow +ĠC OM +Ġsurv ival +sh ot +Ġsett lement +C ons +ĠX box +int erest +ĠS M +arg o +en ess +Ġeth nic +b ered +M in +ĠT ok +Ġinc ent +ĠComm and +Ġmain tained +Ġbreak s +br idge +at ar +ag g +ĠF inally +un icip +ĠO nt +le ft +Ġrecogn ition +Ġ* / +ĠP ers +Ġwe lf +Ġaddress ed +ĠK ansas +Ġvir us +Ġwhere as +Ġp apers +ram s +ĠMin istry +Ġple asure +Ġacqu ired +Ġd uration +j pg +Ġcal m +ĠN HL +Ġburn ing +Ġfold er +ick ed +ĠP y +ĠIll inois +Cl ass +ĠGodd ess +Ġperform ing +Ġwelf are +j ar +In ter +Ġl in +Ġenh ance +Ġnot ion +f are +yp es +ĠAre a +Ġcann abis +ĠDie go +f s +ĠM anchester +com m +in ite +Ġcover ing +ĠS ound +Ġ19 60 +Ġ8 4 +e lect +z ing +Ġcitiz en +Ġph ones +Ġr aid +Ġign ored +ĠOb ject +Ġu pload +c ard +Ġmod ified +Ġroom s +ia h +r ange +he ast +ach us +Ġsuggest ing +âĢ ĭ +gr ade +E l +Ġclot hing +Ġr h +ĠH an +un ity +en cing +ĠAust in +sec ution +t ra +d em +ĠQ ual +Ġhe aven +Ġst ages +Ġw edd +pl us +ific ial +ĠIm m +ĠH o +iet ies +Ġphr ase +Ġbr ill +act ory +Ġprov iders +Ġsil ence +Ġa er +ĠA I +ĠAd venture +Ġplatform s +Ġdemonstr ated +Ġinter f +ing ton +Ġr aces +Ġgr ade +ult ane +ĠTh rough +f alse +Ġb ow +ĠA B +Ġfl avor +Ġhistor ic +g ov +Ġcol our +Ġview ed +ĠEm ail +el come +Ġinter vention +Ġd iversity +Ġperiod s +Ġre verse +ĠV ery +Ġqu ote +ĠLe ft +th rough +Ġsc rew +Ġland ing +Ġp ill +Ġw et +Ġprot esters +Ġrepe at +av ed +er k +Ġsal ary +ĠPenn sylvania +St ill +Ġmay or +Ġkit chen +Ġfeat uring +ĠM useum +ĠT ournament +ĠF al +Ġser vers +U C +Ġany body +im g +ĠTr ade +ixt ure +the less +Ġfin ance +Ġcl osing +ĠPat ri +i ac +ab el +Ġ> > +or ous +Ġf irms +sc reen +un a +Ġemb arrass +ul se +Ġlet ting +Ġth rew +ile y +Ġch annels +l an +ĠVeg as +Ġse ar +Ġfant astic +ar re +uzz le +ĠD er +Th ose +Ġsw ing +Ġshe et +ind ex +co ver +og an +Ġvari ables +ĠTe ch +Ġsp oken +ac hel +ĠD a +ĠMount ain +Ġload ed +Ġfoot age +vers ion +Ġun l +ĠPh oenix +Ġthrow ing +Ġf iring +Ġtrack ing +Ġw idth +Ġstrugg ling +ro oms +ot ion +Ġmonth ly +ĠSer ver +Ġegg s +op en +M C +Ġ199 3 +Ġh ired +Ġstay ed +ĠAll en +Ġst ro +Ġ9 8 +st ep +ĠTurk ish +Ġfab ric +ist ing +ĠD om +Ġd ates +Ġpr on +Ġbasket ball +Ġl ucky +ĠArab ia +Ġassum ed +est y +Ġaff airs +Ġgl ad +ĠInd eed +ĠF A +ĠW ord +Ġjo ining +if ice +p read +ir ts +ĠSe lect +Ġpop ulations +aw are +Ġn ose +Ġcompl aints +st art +Ġsc oring +Th anks +Ġmin ing +Ġvisit ors +S H +Ġdam aged +Ġcharacter istics +ĠP ent +D C +Ġ8 3 +ĠS ix +r ates +Ġfl ags +ĠB rew +d og +M ark +// // +Ġexec ution +Ġj oke +ph ones +Ġtestim ony +Ġob st +Q L +ĠC ut +Ġstud ied +ĠN intendo +ick et +ĠN BC +Ġl ad +ĠB ra +ĠM oh +Ġk ernel +Ġoverwhel ming +Ġag ed +Ġapplic able +ĠC ond +Ġroad s +ĠBl ock +m ade +od ge +Ġcomm ands +Ġoff ices +vel and +Ġt ut +Ġrece iver +ĠF ro +Ġsho pping +Ġi P +ĠSt re +ĠA BC +Ġentertain ment +ĠB ow +ort ed +M c +Ġread s +gr ad +ĠCol lect +Ġâ ĪĴ +ĠCap ital +eder ation +Ġemploy er +Ġinvolve ment +Ġanx iety +al ia +Ġro of +ĠAm ong +ĠDemocr at +Ġstat s +ĠV ill +Ġconst itutional +Ġrefer ring +itt y +Ġtack le +out ube +Ġback ed +ĠH ong +ĠBro ad +Ġe le +ĠO tt +Ġ199 2 +h our +achus etts +C al +Ġdefe ated +Ġ8 1 +es p +Ġseem ingly +w as +ĠJ enn +ĠK urd +Ġg ene +Ġdisc ount +R et +EC T +( ); +Ġclub s +Ġs id +ĠM arsh +Che ck +Ġp p +ĠE ag +ides pread +Ġbe ings +F T +Ġintrodu ction +ĠCh ange +AR D +Ġ1 10 +ad ows +ier ce +Ġme al +a uthor +ĠB ang +lah oma +Ġr anks +201 1 +?? ?? +m ax +Ġcoll apse +Ġop ens +Ġe cho +Ġs oph +Ġrac ist +Ġenorm ous +Ġw aves +Ġt ap +Ġcomprehens ive +. -- +ĠR oy +Ġfarm ers +Rel ated +a ired +ron es +ĠC rim +Ġproport ion +Ġdesign s +Ġnegoti ations +Ġvirt ually +ĠBat man +Ġwar n +Ġlegit imate +m ate +Ġcon vention +, , +net ic +ĠS D +Ġconsist ently +Ġcompens ation +Ġpunish ment +Ġy e +Ġt ie +ĠB ureau +ir lf +ĠB u +ĠA ren +ĠPh ilipp +Ġkn ife +Ġmem ories +ĠR oss +Ġang le +Ġ8 6 +ĠTh under +Ġre nd +ĠT our +Ġcount s +s ung +ĠIm p +Ġeduc ational +Ġaccess ible +C OM +Ġd rew +y er +G l +am ine +OR T +O B +I B +m aster +Ġtri als +og y +h ar +ĠTr ust +Ġprefer red +irlf riend +ĠN ev +Ġb in +Ġc ow +P age +Ġsign ature +ĠB L +7 00 +Ġret ired +Ġby tes +Ġneigh b +ĠLeg end +Ġdev ast +Ġsuspect ed +is ons +ĠPoké mon +sc ale +Ġcap abilities +Ġre vel +Ġche ese +d y +igr ant +Ġfail ing +b its +ĠHer oes +ĠG host +ĠS cient +Ġappoint ed +ur i +Ġinst itution +Ġexpand ed +g reg +Ġmonitor ing +Ġp odcast +Ġcoal ition +Ġ9 6 +J o +Ġst olen +ĠS ab +Ġstop s +Ġhol iday +Ġint r +C ar +Bl ack +ĠL GBT +Ġwar ming +ĠAnd erson +Ġ8 9 +Ġprodu cer +M ed +Ġaccur acy +ĠMar vel +iz abeth +ĠPat rick +m ony +Ġmin i +ac les +Ġover t +the y +Ġmembers hip +ĠV en +Ġex ch +Ġrem oval +ĠD ave +T Y +m ad +ĠF ind +Ġad equ +Ġe c +Ġte eth +Ġemot ion +Ġper m +Ġsole ly +d b +Ġextra ord +IG HT +c al +Ġgu idelines +Ġd ying +Ġsusp ended +ĠPrem ier +ĠAnth ony +el ve +Ġd ad +ĠE th +ĠFoot ball +Ġabandon ed +Ġ< < +Ġm arch +Ġhor ror +âĢ¦ " +Ġchild hood +Ġcampaign s +Ġl unch +ĠAl bert +bl ock +âĸĪ âĸĪ +ound ing +Ġb one +or gan +ad ers +ĠFl ash +ĠDri ve +Ġton ight +Ġw ars +ĠF L +Ġform ation +con st +New s +Ġcom pe +or ious +ĠSt aff +Ġdiscuss ions +ĠProt ection +ĠJ am +Ġcrit eria +Ġinstall ation +Ġaccompl ish +iz za +Ġpub lisher +Ġresc ue +ĠT ry +U LL +ĠS om +ĠH op +ore t +th s +ord on +Ġp ocket +ĠIn v +Down load +ĠCr ime +Ġb ene +ĠGu ide +ĠAs sembly +Ġparam eters +I E +ĠAlex ander +Ġconc ert +ĠSc he +Ġsh oes +Ġvis iting +Ġrec all +Ġb ub +Ġr ural +Ġconc rete +ĠR os +N ext +R uss +Ġlo ans +ĠSh ield +Ġtre m +hem at +k g +ĠHar ris +is ition +ĠM ove +ĠF C +Ġf ate +ĠCh o +Ġt ired +Ġprinc ipal +h ist +ien ces +ath y +Ġse vent +Ġm ood +Ġstrateg ic +Ġdise ases +Ġfor um +Ġtem por +Ġhead quarters +P ar +ig e +fl ix +Ġgu itar +Ġ9 4 +On ly +Ġrele ases +ro ph +================ ================ +Ġ6 00 +ĠContin ue +ig ate +ĠC rit +sy stem +Ġdis abled +Ġunex pected +ith ub +Ġuncle ar +ĠE st +Ġcontr ad +Ġstrateg ies +vent ures +Ġpass age +AM E +Ġimpro ving +Ġreve als +Ġdecre ase +ov a +Ġann oy +ĠSh ort +ĠL ibrary +Ġcy ber +n ell +ĠH ur +ĠC B +Ġphot ograp +U I +Ġs ed +G e +Ġ8 7 +Ġd iverse +Ġencour aged +Ġcons piracy +Ġbird s +Ġoper ator +Ġhand ful +Ġclass ified +? ) +Ġdram atic +Ġinvestig ators +it o +Ġw idespread +ĠR oom +-------------------------------- -------------------------------- +Ġcollect ive +Ġjournal ist +St ring +Ġtemper atures +il a +Ġgu id +Ġins pect +Ġmiss ile +ĠMay or +Ġman ual +Ġsim ultane +Ġrat ings +Ġsu ck +Ġ9 7 +Ġunivers al +Ġph arm +Ġdis rupt +ian o +A V +Ġf t +Ġstat ist +old s +ĠWalk er +ph p +Ġunder t +ĠL as +ish op +nt il +res hold +ĠWhe ther +M s +Ġden y +ĠCl oud +Ġprov ider +Ġsurv iv +ĠUp date +h as +Ġmist akes +ch arge +pl ed +r ity +Ġn ode +ĠMass achusetts +ool s +lic ation +Ġf ails +em ale +or i +back s +Ġsh irt +Ġ' ' +ĠN AT +Ġwat ers +els on +Ġe ase +Ġsc ar +Ġcont ents +m ind +Ġcont ribution +Ġsh r +Ġhand ed +Ġst ability +Ġtra ve +E m +Ġmir ror +12 3 +Ġwe igh +Ġf iction +ou ver +ist ant +r ition +ĠF ed +Ġphys ically +Ġst ake +ĠArt icle +ĠAr c +ĠLew is +ĠM ind +Ġdemonstr ate +Ġprof its +v ision +om ic +ol id +Ġbatt les +Ġdri ves +Ġeas tern +ĠS ony +!! ! +ar ation +v ard +ĠG L +port ation +Ġ9 2 +Ġlaw makers +Ġprotect ing +ĠE PA +Ġy eah +Ġsh ame +ol ph +e ven +x it +Ġatt ach +Ġrepresent ing +Ġob s +ĠUt ah +iff s +ĠFre edom +à ³ +A K +Ġinc idents +it age +Ġview ers +c d +Ġm ouse +Ġcl ar +Ġaccord ance +Ġb ot +c or +ĠSum mer +he ld +Ġinnoc ent +Ġiniti ative +ol s +________________ ________________ +Ġsp ots +p ace +Ġconvent ional +Ġcorpor ations +Ġblock ed +H D +at tered +Ġref ers +Ġbu ck +ĠDig ital +12 0 +Ġtop ics +T F +Ä ģ +br id +re ement +Ġunder lying +ĠM ember +Ġinvestig ating +Ġpregn ancy +Ġtouch down +ĠB and +ĠCall er +Ġinst ances +P P +w a +G ood +Ġ199 1 +ĠC old +Ġfear s +Ġrem arks +Ĩ Ĵ +at al +Ġm it +Ġexper iments +i pt +Col or +ind u +Up date +Ġ9 3 +A g +Ġ å +anc ouver +B oth +Ġjud ges +Ob ject +Ġst ere +umb n +Ġparticip ation +ĠSt ars +ĠJ ere +Ġweek ly +ĠB an +Ġconvers ations +ĠP itt +u z +ĠIndian a +ĠK ick +Ġinf ection +Ġhero es +Ġsett led +Ġstri p +Ġh al +Ġd ump +ĠS ci +Ġl es +Ġref erences +ĠU RL +ĠBr idge +Ġwant ing +For ce +Ġex clus +Me anwhile +m n +Ġg entle +m aker +sen al +ĠG ro +ou ri +ĠR ain +ĠAll iance +Ġl ift +el a +S D +ĠCle veland +Ġrank ed +Ġst adium +Ġdead ly +ä ¸ +Ġr iding +ar ia +ĠAr mor +Ġdocument ation +ĠGree ce +ree k +Ġl ens +ĠS a +Ġg ross +ĠE mer +ag ers +ĠD ub +ĠR h +ĠAM D +Ġarri val +Ġdes ert +Ġsupp lement +ĠRes p +Ġkn ee +Ġmarg in +f ont +og g +201 0 +ĠP ir +ĠP rom +iv als +Ġint ake +Ġdifferent ly +ug s +Ġb its +clud ed +Ġsearch ing +ĠD u +um ble +Ġfunction al +ĠBalt imore +ĠC ould +Ġdes ired +Ġcirc uit +ĠL yn +ĠG O +ĠF alse +re pre +' : +alt ies +Ġmin im +Ġdro ve +ĠSh ould +Ġh ip +Ġpro s +Ġut ility +ĠN ature +ĠM ode +P resident +o pp +r at +form ance +Ġconcent ration +Ġf ont +ĠB ud +Ġam id +Ġre vers +ĠM L +B ar +Ġinter action +Ġjur isd +Ġspell s +d ep +f il +Ġcivil ians +ut ter +ĠCo oper +ĠBel ow +Ġent rance +Ġcon vert +Ġcontrovers y +ow ered +Ġcontr ary +Ġar c +ĠExec utive +ĠOffic er +Ġpack ages +Ġprog ressive +w idth +Ġreserv ed +v ol +ĠSam sung +Ġprint ed +Ġcent ers +Ġintrodu ce +ĠKenn edy +Ġodd s +Ġsure ly +Ġindepend ence +Ġpass engers +repre ne +ĠBe h +Ġl oves +ĠESP N +Ġfac ilit +Ġident ical +Ġdo ct +Ġpartners hip +con f +ĠH ide +Ġconf used +ĠC ow +M en +Ġw rest +ĠIraq i +Ġh oles +ĠStud ies +Ġpregn ant +h ard +Ġsign als +I X +Ġpull ing +Ġgrad uate +Ġnomine e +D ate +Ġper mitted +Ġâ Ĥ¬ +ĠOk lahoma +St art +Ġauthor ized +Ġal arm +ĠC os +v an +Ġgener ations +c ular +Ġdr agon +ĠSoft ware +ĠEd ward +Ġcontro ller +S en +ge red +ĠV ik +Ġappro ached +Th ank +Ġcan ce +Ġform ula +ĠSm all +Ġweak ness +Ġr amp +it udes +j ud +Ġbrill iant +Ġacc us +s ource +Ġ8 00 +ĠE vil +S w +Ġhom eless +we ek +i ens +r ics +ĠTh ird +T O +Ġorgan ic +Ġpresent ation +ag h +ĠDown load +v ation +Ġas sembly +or able +hold ers +ĠBern ie +ĠHel p +Ġt ong +ĠF ight +Ġbe ach +B ook +ĠL ic +Ġr ush +ĠR ound +ou p +ĠMar x +Ġcalcul ated +ĠDe vil +ĠSar ah +Ġoccasion ally +Ġbul let +Av ailable +g ate +Ġ9 1 +Ġh osp +Ġprom ises +ĠH IV +ĠSt adium +ĠSt ock +ĠCorpor ation +g age +N G +ĠC redit +Ġs ne +ib l +Ġacc um +s uch +Ġterror ists +Ġconscious ness +ĠZ h +Ġdram a +ool a +pir ation +Ġlab our +ĠN in +Ġut ter +Ġdemocr atic +Ġass ass +il ation +Ġg est +Ġab road +Ġmet ab +Ġs orts +Ġfl av +U B +Ġm g +ĠNot hing +ĠO d +Ġmus ical +200 9 +Ġdro ps +oc ated +ater al +0000 00 +Ġg re +Ġequ ality +Ġburd en +Ġv ig +ĠLe ader +-------- ---- +Ġcere mony +Ġf ighter +Ġact ors +Ġ æ +am an +F i +Ġal ign +put er +Ġe lder +ĠN SA +Ġrepresent ation +ĠOnt ario +IT H +usal em +Ġharass ment +itz er +Ġsy mp +Ġbox es +ĠD R +Ġman ifest +at re +Ġ ^ +Ġd ies +le ton +Ġmiss ions +et he +Ġres olve +Ġfollow ers +Ġas c +Ġk m +l ord +am med +Ġsil ent +ĠAssoci ated +Ġtim ing +Ġprison ers +ĠK ings +ĠF ive +Ġtow er +Ġappro aches +Ġprecise ly +Ġb ureau +ĠM other +ĠI ss +Ġkey board +it ual +Ġfund ed +Ġstay ing +Ġpsych ological +Ġm ile +ĠLe on +ĠBar b +w ill +Ġw ider +ĠAtl antic +Ġt ill +ĠR ome +ro t +Ġaccomp an +Ġfl our +ac o +W orld +ĠExp ress +ĠY u +C or +Ġple ased +part y +Ġpoint ing +Ġinf lation +Ġro y +Ġ ), +ain er +Ġwedd ing +orm on +Ġrequ iring +Ġqual ified +Ġse gment +EN D +Ġs izes +e als +Ġcor rupt +ass ador +Ġcele b +Ġdream s +ĠM ess +Ġcheck ing +ĠV ersion +Ġprep aring +Ġact ively +ĠD iff +Ġl ux +ĠW inter +act eria +ĠN E +Ġdep uty +Ġtrans gender +Ġsum mary +Ġin her +er ies +ch ar +ĠY an +Ġkn ock +ĠP ath +Ġl ip +roll er +Ġimp ression +Ġcelebr ate +Ġsl ide +Ġgu ests +Ġcl ip +F S +Ġsav ings +Ġcapt ain +Ġleg acy +ĠDen ver +Ġw ounded +tab oola +AC T +Ġpurs ue +Ġo xy +Ġ q +Ġsem i +ĠN eed +ĠAff airs +Ġob sc +Ġcheck ed +Ġd ual +C ode +ĠM D +le m +ult y +Ġ © +ĠEl izabeth +Ġcent uries +ard ed +s rc +Ġev ident +enn is +at in +Ġunemploy ment +ĠMar io +Ġint im +Ch rist +Ġbi ological +Ġsold ier +ĠAdd ed +Ġm ath +ĠG il +Ġbi as +Ġd ating +ĠO cean +Ġm ice +M us +h ire +ĠT es +Ser ver +lim ited +S ize +Ġmet ers +Ġrock et +es see +Ġcertific ate +ĠIran ian +AS S +Ġgr id +D ec +Ġro lling +com mun +ĠSwed en +b ury +Ġtiss ue +Ġrac ism +ĠL ocal +Ġmyster y +Ġexam ine +Ġst em +Ġs its +Ġhop ed +ot ing +Ġdial ogue +Ġpers u +W atch +l ay +M AN +Ġch ronic +ĠPort land +mark et +ĠS EC +Ġparalle l +Ġsc andal +Ġcar ries +Ġphenomen on +h uman +ack er +ĠO x +Ġretire ment +tain ment +ov ie +ĠG ear +Ġd uties +Ġdo se +Ġsc roll +M B +in f +Ġsa uce +Ġland scape +red dit +ĠChampions hip +ĠRed dit +al id +Ġco in +Ġover s +Ġpost ing +ab out +Ġf el +and y +Ġb old +Ġfocus ing +e ffect +G R +Ġde emed +Ġrecommend ations +Ġste pped +Ġvot er +ĠDe ep +ĠInst agram +Ġmoder ate +ĠMary land +Ġrestrict ed +ĠM B +ĠCh all +Ġto b +Ġc ir +ĠO cc +ĠE ver +Ġcoll aps +IN FO += - +ĠP ict +ĠAcc ount +n c +Ġo ught +Ġex port +Ġdr unk +( ' +Ġw ise +ĠM ort +ne cess +Ġan cest +ĠInc re +Ġfrequ ent +m ir +Ġinterpret ation +Ġdepend ent +Ġco ins +ĠB ol +V ideo +ĠJust in +Ġfat al +Ġcook ing +Ġconf usion +ip her +Ġcust ody +ĠMor gan +om ach +ĠGovern or +Ġrestaur ants +el ing +Ġacknowled ged +Ġthe r +Ġgen es +ch ing +He y +Ġtact ics +ĠMex ican +Ġv end +Ġhe s +qu er +Ġnot ing +ĠCamer on +Ġtarget ing +ro ck +Ġcred its +Ġemot ions +Ġrepresent atives +new s +Ġlegisl ative +Ġrem oving +Ġtweet ed +ĠCar ter +ĠF ixed +Ġfor cing +Ġspeak er +Ġm ales +ĠViet nam +l ined +Ġconcept s +Ġvo ices +o ir +ĠT rib +W he +ĠJer usalem +ĠS ant +Ġc ul +Ġl ady +ĠHaw ai +Ġar ts +ĠIn n +ĠMach ine +ĠEm peror +Ġsl ot +g ly +ĠPro cess +II I +Ġathlet es +ĠTem ple +ĠRep resent +Ġpres c +Ġt ons +Ġgold en +Ġp unch +ĠG R +iver pool +Ġen act +Ġlob by +Ġm os +Ġpick ing +Ġlif etime +Ġcogn itive +E ach +z o +Ġd ub +Ġcons ists +ol n +Ġf estival +am ous +Ġint ellig +w ords +ĠSm art +Ġde le +Ġl apt +Ġmag ical +ĠS in +b us +ur ities +igh th +ĠRub y +ĠS ure +ol ving +Ġj un +O ST +Ġimp osed +Ġast ron +Ġcor rel +ĠN S +ĠK it +ĠF uture +b urn +Ġimm une +oc us +Ġcour ses +ĠSt ring +Ġle an +Ġg host +Ġout comes +Ġexp ense +Ġevery day +Ġaccept able +A h +Ġequ ipped +Ġor ange +F R +ĠD utch +Th ough +ĠR ank +Q U +ĠRober ts +wh at +re nd +Ġdisapp ear +Ġsp awn +ĠL am +o is +Ġdes erve +Ġmin imal +Ġnerv ous +ĠW ould +Ġro ok +ĠV ancouver +Ġres ign +sh ire +ĠW orks +ĠB uild +Ġafford able +ĠG ary +ĠAren a +Ġh anging +Ġimpl ications +ĠS ong +Ġmain taining +Ġgu ards +C ON +Ġder ived +Ġexecut ed +Ġthe ories +Ġqu oted +ĠAnd re +og a +sel ess +in fo +ĠBel g +Ġt ears +ĠSur v +Ġbirth day +ig ious +im mer +Ġspect rum +Ġarchitect ure +Ġrec ruit +arm a +T able +Ġmon sters +ĠG ov +Ġdest ination +Ġattract ive +Ġf oss +ĠMore over +Ġpres ents +TH E +Ġrep ly +pt on +Ġc um +Ġdel ight +Ġaffect s +Ġdon ations +ĠT oy +ĠH im +M ENT +Ġover come +it ched +ĠFant asy +ĠH at +ĠBe ast +b ott +Ġinvestig ations +R un +Ġhun ting +d i +f und +Ġs essions +est yle +Ġport ray +oid s +Y eah +Ġcommun icate +Ġcom edy +ĠY ang +Ġbel t +ĠMar ine +Ġpredict ed +Pl ay +Ġimportant ly +Ġremark able +Ġelim inate +D avid +Ġb ind +V ID +Ġadvoc ates +ĠG aza +im p +D B +ĠN a +ĠSim ilar +I ES +Ġchar ity +v as +m ath +Ġâ ĸ +ok er +nd um +Ġcap s +ĠH al +2 000 +e an +Ġfle et +Ġrec re +R ight +Ġsleep ing +ij ing +k ind +Ġdesign ated +à ¤ +Ġanim ation +ke e +ĠInt rodu +Ġ/ > +Ġdelay ed +Ġtrem end +Ġcur ious +U se +Ġle ct +d am +Ġinnov ation +ĠPoint s +Ġload ing +Ġdisp ute +ct ic +ird s +ĠB Y +Ġn urs +ĠVal ue +ION S +ĠH um +Ġtem plate +m ers +Ġappear ances +ĠEnter tainment +Ġtransl ation +Ġsa ke +Ġbene ath +Ġin hib +Ġe uro +abet es +Ġstud ying +ĠM as +Ġper ceived +Ġexam ined +Ġe ager +Ġco aches +Ġim per +ch i +Ġprodu ces +" ). +ĠEvery one +Ġm unicip +Ġg irlfriend +Ġh ire +ĠV ice +Ġsu itable +op y +Ġin equ +ĠD uke +f ish +f irst +ĠO bs +Ġinter ior +ĠBru ce +ĠR y +Ġanal ys +Ġconsider able +Ġfore cast +Ġf ert +ors hip +ĠD rug +ĠA LL +: " +th ur +ĠM ail +Ġball ot +Ġinst antly +ĠCh annel +Ġp icks +Ġ198 9 +Ġt ent +ol i +Ġcivil ian +b ling +ell o +b u +Ġin ch +Ġlog o +Ġcooper ation +Ġwal ks +Ġinvest ments +Ġimp rison +ĠF estival +ĠK y +Ġleg ally +Ġg ri +ch arg +S l +Ġthreat ening +du ction +fl ow +Ġdismiss ed +ibr aries +c ap +e le +ĠMc G +ĠHar vard +ĠConserv ative +ĠC BS +p ng +Ġro ots +ĠH aving +umb led +ĠF un +\ / +ĠS earch +ple x +Ġdiscuss ing +Ġcontin u +ĠT ai +ĠW ik +F ree +f it +Ġref use +Ġmanag ing +Ġsy nd +ip edia +w alk +Ġprofession als +Ġguid ance +Ġunivers ities +Ġas semb +unt u +F inally +AS E +ĠAut o +ĠH ad +Ġann iversary +L D +ĠD ur +ĠUlt imate +ih ad +pro duct +Ġtrans it +Ġrest ore +Ġexpl aining +Ġass et +Ġtransfer red +Ġbur st +ap olis +ĠMag azine +ĠC ra +ĠB R +gg ed +ĠH E +M ich +b et +ĠL ady +yl um +erv es +Ġme ets +wh ite +L og +Ġcorrespond ing +Ġins isted +G G +Ġsurround ed +Ġt ens +Ġl ane +Ġco inc +h ome +Ġexist ed +ect ed +ĠDou ble +lam m +Ġske pt +ex p +Ġper ception +ie v +ĠBe ing +o ft +Ġadop t +. : +] ; +Wind ows +Ġsatell ite +AS H +Ġinf ant +d escription +ĠMe anwhile +c m +oc a +ĠT reat +act or +Ġtob acco +ĠN orm +em ption +Ġfl esh +Ġj e +o op +ĠHe aven +Ġbe ating +an im +Ġgather ing +Ġcult iv +G O +ab e +ĠJon athan +ĠSaf ety +Ġbad ly +pro t +Ġcho osing +Ġcontact ed +Ġqu it +Ġdist ur +Ġst ir +Ġto ken +D et +ĠP a +Ġfunction ality +00 3 +s ome +Ġlimit ations +Ġmet h +b uild +con fig +N T +re ll +ble m +ĠM om +Ġveter ans +ĠH u +Ġtrend s +are r +ĠG iven +ĠCa ption +m ay +AS T +Ġwond ering +ĠCl ark +n ormal +Ġsepar ated +Ġdes p +st ic +b rew +Ġrel ating +ĠN ik +ĠF arm +Ġenthus i +g ood +d eb +Ġactiv ist +Ġm art +Ġexplos ion +ĠEconom ic +L ink +Ġins ight +Ġconven ient +Ġcounter part +su pport +ĠV irt +ag en +ĠTenn essee +ĠSim on +ĠA ward +OC K +ĠF igure +Ġoverse as +Ġpr ide +ĠC as +n ote +m g +C urrent +Ġdispl ays +cont ent +Ġtravel ing +Ġhosp itals +ĠFin ancial +ĠP ast +Ġdefend ant +Ġstream ing +m ble +ĠBer lin +uk i +Ġdist ribut +Ġant ib +Ġch ocolate +ĠCast le +Ġinter rupt +ĠR ow +Ġconvers ion +Ġbug s +ĠR ather +li est +L Y +ĠJe an +com mon +ak h +Ġ1 30 +ot ton +ĠDe an +Ġam endment +Ġgame play +ĠWar ren +od a +Ġhigh lights +Ġir re +ĠNAT O +Ġball s +Ġdemand ing +U RE +ĠL uke +F igure +st op +on ia +z one +iz ers +ĠW R +Ġaward ed +Ġregul atory +ĠH art +ĠS N +pl ing +Ġs our +ĠP ixel +us ive +Ġf et +ĠS ent +Ġautom atic +Ġf er +vern ment +ĠKh an +T ON +f ather +Ġextraord inary +th rop +ĠP ython +ĠG PU +Ġsex ually +Ġdesk top +it ivity +ĠAnton io +Ġo rient +Ġe ars +ob by +ous es +vertis ements +Ġmanufacture rs +ic ient +min ute +Ġconv iction +Ġg arden +p ublic +Ġsatisf ied +f old +O K +Ġin hab +ĠTh ink +Ġprogram me +Ġst omach +Ġcoord in +Ġh oly +Ġth reshold +Ġr het +Ġser ial +Ġemploy ers +ĠEvery thing +ra h +Ġb other +Ġbr ands +Val ue +ĠT ed +ĠPlan et +Ġp ink +ĠFurther more +s a +P E +re ck +ĠUS D +ot te +Ġ& & +Ġland ed +g ets +Ġprodu cers +Ġhealth care +Ġdomin ant +Ġdest ro +Ġam ended +ch ron +Ġf its +ĠSy d +ĠAuthor ity +AT CH +Ġfight s +ĠL LC +Ġ-- - +ĠCor p +Ġtox ic +spe cific +ĠC orn +ĠChe l +Ġtele phone +ĠP ant +Ġmyster ious +aun ch +od ox +med ia +Ġwitness es +ag u +Ġquestion ed +ĠBre xit +ĠRem ember +ene z +Ġend orse +iat ric +ĠId ent +Ġridic ulous +1 10 +Ġpr ayer +Ġscient ist +Ġ19 50 +ĠA qu +Ġunder ground +ĠU FC +m are +ĠL ater +w ich +Ġsubsc rib +Ġhost s +Ġer r +Ġgr ants +ant om +Ġsum mon +ear ly +ĠC lear +ĠPr im +Ġsusp ension +Ġguarant eed +app er +Ġr ice +ĠSe an +ĠSh in +Ġrefere ndum +Ġfl ed +r ust +Ġ3 60 +ter y +Ġsh ocked +B R +ĠO il +ĠAll ah +Ġpart ly +Ġign or +Ġtrans mission +Ġhom osexual +ivers al +Ġhop efully +ãĤ ¤ +Ġless on +L eg +Ġ .. +Y et +t able +app ropri +re tt +Ġbo ards +Ġincor rect +Ġb acteria +ar u +am ac +Ġsn ap +.' " +Ġpar ad +t em +he art +Ġav ailability +Ġw isdom +Ġ( + +Ġpri est +ĠÂł ĠÂł +O pen +Ġsp an +Ġparam eter +Ġconv ince +Ġ( %) +r ac +Ġf o +Ġsafe ly +Ġconver ted +ĠOlymp ic +Ġres erve +Ġhe aling +ĠM ine +M ax +Ġin herent +ĠGra ham +Ġinteg rated +D em +Ġpip eline +Ġapp lying +Ġem bed +ĠCharl ie +Ġc ave +200 8 +Ġcons ensus +Ġre wards +P al +ĠHT ML +Ġpopular ity +look ing +ĠSw ord +ĠAr ts +' ) +Ġelect ron +clus ions +Ġinteg rity +Ġexclus ively +Ġgr ace +Ġtort ure +Ġburn ed +tw o +Ġ18 0 +P rodu +Ġent reprene +raph ics +Ġg ym +ric ane +ĠT am +Ġadministr ative +Ġmanufacture r +Ġ vel +ĠN i +Ġisol ated +ĠMedic ine +Ġback up +Ġpromot ing +Ġcommand er +Ġfle e +ĠRus sell +Ġforg otten +ĠMiss ouri +Ġres idence +m ons +Ġrese mb +Ġw and +Ġmeaning ful +P T +Ġb ol +Ġhe lic +Ġwealth y +Ġr ifle +str ong +row ing +pl an +as ury +âĢ¦ . +Ġexpand ing +ĠHam ilton +Ġrece ives +S I +eat ures +ĠAn im +RE E +P ut +Ġbrief ly +ri ve +Ġstim ul +Ġ`` ( +Ġ __ +Ġch ip +Ġha z +Ġpri ze +ĠTh ings +AC E +ul in +d ict +ok u +Ġassoci ate +ock ets +y outube +St ory +ateg ory +Ġm ild +ail ing +ĠY e +O rig +ĠK a +or ig +Ġpropag anda +Ġan onymous +Ġstrugg led +Ġout rage +AT ED +ĠBe ijing +r ary +Ġle ather +Ġworld s +Ġbroad er +12 5 +id al +ĠBet ter +Ġt ear +E xt +Ġpropos als +Ġit er +ĠSqu ad +Ġvol unt +m i +D id +ĠP u +p in +Ġspeak ers +Ġb orders +Ġfig ured += ' +Ġsimultane ously +aed a +Ġcharg ing +Ġur ged +Ġcon j +25 6 +ĠG ordon +mer ce +Ġdocument ary +Sh are +it ol +ON E +ĠG arden +h att +ĠThom pson +ane ous +ap ore +Ġt anks +Ġless ons +tr ack +Ġout standing +Ġvolunte ers +Ġsp ray +Ġmanag ers +l arge +Ġcamp s +Ġart ificial +ĠR u +Ġb ags +th al +Ġcompat ible +ĠBl ade +Ġf ed +Ġarg ues +F I +Ġunf air +Ġcor n +Ġoff set +Ġdirect ions +Ġdisappoint ed +ĠCon vention +Ġview ing +M E +oc ity +Ġtown s +Ġlay ers +Ġro lled +Ġjump ed +Ġatt ribute +Ġun necess +inc oln +Ġsupp ose +ĠNet her +ch a +Ġbur ied +Ġsix th +B en +ress ing +OU R +Ġw ound +Ġcy cl +Ġmechan isms +Ġcongress ional +ĠE lement +Ġagre ements +Ġdec or +Ġclos est +ĠM it +Go ogle +} } +Ġm ixture +Ġflu id +S ign +ĠSch olar +Ġp ist +ask et +ab ling +Ġrac ing +he ro +ri el +ass y +Ġche aper +b en +Ġvert ical +amac are +ĠRead ing +g ments +Ġhelic op +Ġsacr ifice +ay a +p aren +V A +ĠL es +ĠStud io +Ġviol ations +ĠAn na +ac er +é ¾ +ĠR at +ĠBe ck +ĠD ick +ĠA CT +Ġcomp osition +Ġtext ure +ĠO wn +Ġsmart phone +ĠN A +Ġfor b +im port +Ġdef ending +il st +re r +Ġo h +ĠJere my +Ġbank ing +cept ions +Ġrespect ive +/ . +Ġdr inks +ĠW i +Ġb ands +ĠL iverpool +Ġg rip +ĠB uy +Ġopen ly +Ġreview ed +per t +Ġver ify +ĠCo le +ĠW ales +M O +Ġun pre +Ġshel ter +ĠIm perial +Ġgu i +ĠD ak +Ġsuggest ions +Ġexplicit ly +Ġsl ave +Ġblock chain +Ġcompet ing +Ġprom ising +S ON +Ġsoc cer +Ġconst itution +4 29 +Ġdist ract +ĠU ser +es ides +ĠMet hod +ĠTok yo +Ġaccompan ied +Cl ient +s ur +al og +Ġident ification +Ġinv asion +as ma +Ġindust ries +pp ers +Ġsub tle +ĠUn it +n atural +Ġsurv ived +Ġfl aw +ĺ ħ +ĠH oll +Ġdef icit +Ġtut orial +ĠCh ance +Ġarg uing +Ġcontem porary +Ġinteg ration +for ward +Ġt um +it is +Ġh iding +ĠD omin +ĠT an +ĠB uilding +ĠV in +Ġspokes person +ĠNot es +Ġemer ging +Ġprepar ation +Ġpro st +Ġsuspect s +Ġaut onom +D escription +Ġdeal t +ĠP ear +Ġstead y +Ġdecre ased +Ġso vere +ĠCl in +Ġgrad ually +ors es +ĠW AR +S erv +ãĤ ¢ +h r +Ġd irty +ĠB arn +ĠB C +Ġd il +Ġcal endar +Ġcompl iance +Ġch amber +b b +Ġpass enger +ate ful +ĠT itle +ĠSyd ney +ĠG ot +Ġdark ness +Ġdef ect +Ġpack ed +ass ion +Ġgod s +Ġh arsh +IC K +le ans +Ġalgorith m +Ġoxy gen +Ġvis its +Ġbl ade +Ġkil omet +ĠKent ucky +Ġkill er +P ack +enn y +Ġdiv ine +Ġnom ination +be ing +Ġeng ines +Ġc ats +Ġbuff er +ĠPh ill +Ġtra ff +AG E +Ġtong ue +Ġrad iation +ere r +m em +ĠExpl icit +é¾ į +Ġcou ples +Ġphys ics +ĠMc K +Ġpolit ically +aw ks +ĠBl oom +Ġwor ship +e ger +ut er +ĠF O +Ġmat hemat +Ġsent enced +Ġdis k +ĠM arg +Ġ/ * +P I +Ġoption al +Ġbab ies +Ġse eds +ĠScott ish +Ġth y +] ] +ĠHit ler +P H +ng th +Ġrec overed +ing e +Ġpow der +Ġl ips +Ġdesign er +Ġdis orders +Ġcour age +Ġch aos +" },{" +Ġcar rier +b ably +H igh +ĠR T +es ity +l en +Ġrout es +u ating +F il +N OT +w all +s burgh +Ġeng aging +ĠJava Script +ore r +li hood +Ġun ions +ĠF ederation +ĠTes la +Ġcomple tion +ĠT a +Ġprivile ge +ĠOr ange +Ġne ur +paren cy +Ġb ones +Ġtit led +Ġprosecut ors +ĠM E +Ġengine er +ĠUn iverse +ĠH ig +n ie +o ard +Ġheart s +ĠG re +uss ion +Ġmin istry +Ġpen et +ĠN ut +ĠO w +ĠX P +in stein +Ġbul k +S ystem +ic ism +ĠMarket able +Ġpre val +Ġpost er +Ġatt ending +ur able +Ġlicens ed +ĠG h +et ry +ĠTrad able +Ġbl ast +à ¤ +ĠTit an +ell ed +d ie +H ave +ĠFl ame +Ġprof ound +Ġparticip ating +Ġan ime +ĠE ss +Ġspec ify +Ġregard ed +ĠSpe ll +Ġs ons +own ed +Ġm erc +Ġexper imental +land o +h s +ĠDun geon +in os +Ġcomp ly +ĠSystem s +ar th +Ġse ized +l ocal +ĠGirl s +ud o +on ed +ĠF le +Ġconstruct ed +Ġhost ed +Ġsc ared +act ic +ĠIs lands +ĠM ORE +Ġbl ess +Ġblock ing +Ġch ips +Ġev ac +P s +Ġcorpor ation +Ġo x +Ġlight ing +Ġneighb ors +ĠU b +ar o +Ġbe ef +ĠU ber +F acebook +ar med +it ate +ĠR ating +ĠQu ick +Ġoccup ied +Ġaim s +ĠAdd itionally +ĠInt erest +Ġdram atically +Ġhe al +Ġpain ting +Ġengine ers +M M +ĠM ust +Ġquant ity +P aul +Ġearn ings +ĠPost s +st ra +ãĥ¼ ãĥ +Ġst ance +Ġdro pping +sc ript +Ġd ressed +M ake +Ġjust ify +ĠL td +Ġprompt ed +Ġscr ut +Ġspeed s +ĠGi ants +om er +ĠEd itor +Ġdescrib ing +ĠL ie +ment ed +Ġnow here +oc aly +Ġinst ruction +fort able +Ġent ities +Ġc m +ĠN atural +Ġinqu iry +Ġpress ed +iz ont +for ced +Ġra ises +ĠNet flix +ĠS ide +Ġout er +Ġamong st +im s +ows ki +Ġclim b +ne ver +Ġcomb ine +d ing +Ġcomp r +Ġsignific ance +Ġremem bered +ĠNev ada +ĠT el +ĠSc ar +ĠWar riors +ĠJ ane +Ġcou p +b as +Ġtermin al +, - +O H +Ġt ension +Ġw ings +ĠMy ster +�� �� +ĠUn like +val id +viron ments +ĠAl i +Ġn aked +book s +ĠM un +ĠG ulf +Ġd ensity +Ġdim in +Ġdesper ate +Ġpres idency +Ġ198 6 +h y +IN D +Ġun lock +im ens +Ġhand led +ĠE b +Ġdisapp eared +Ġgen re +Ġ198 8 +Ġdetermin ation +St ream +ik o +ap ters +Ġacknow ledge +J an +Ġcapital ism +P at +Ġ20 20 +Ġpain ful +Ġcur ve +Ġbom bs +st orm +ĠMet al +en cer +ĠF ig +ĠA aron +anc hes +Ġins piration +Ġexha ust +t ains +ash i +Ġdesc ript +Ġr itual +ĠChel sea +Ġpromot ion +ĠH ung +ĠW ard +iv a +ĠE T +Ġto ss +all ow +ĠFranc is +D ep +Ġhapp iness +ĠGl ass +Ġbet a +Ġstreng then +N E +o a +Ġbutt ons +ĠMur ray +Ġkick ed +Qu est +ĠT alk +ĠS everal +ĠZ ero +Ġdr one +ul k +Ġc am +ĠM obile +Ġprevent ing +Ġret ro +ĠA x +Ġcru el +Ġflo at +. ), +Ġfil ing +ĠGr ant +ĠB or +Ġr ib +Ġchampions hip +ĠM erc +Ġsty les +Ġc ake +Ġbuild s +ĠS elf +io x +Ġep ic +oy d +B el +ĠSt ew +. ( +ah u +ĠBe yond +Ġout s +Ġsol o +ĠT ree +Ġpres erve +Ġt ub +AR E +ro c +ĠIm pro +ĠW right +Ġbu nd +Ġtr aged +Ġoccas ional +b ian +Sec ond +r ons +Ġinter actions +form ed +s ing +Ġown s +Ġh ockey +Gener al +Ġlog ical +Ġexp end +Ġesc al +ĠGr iff +ĠC rown +ĠRes erve +Ġsto pping +Ġexc use +sec ond +Ġoper ated +Ġre aches +ĠMal ays +Ġpoll ution +ĠBrook lyn +Ġde lete +Ġhas h +Bl ock +ah a +âĢ ³ +Ġsh orter +p iece +> >> +ĠM ormon +t or +Ġpartic les +ĠB art +ry ption +Ġad min +Ġsqu ee +VID IA +Ġcreat or +iam eter +ic ular +N BC +Ġgrab bed +Ġn odd +Ġr ated +Ġrot ation +Ġgr asp +Ġexcess ive +ĠE C +ĠWh it +Ġinvent ory +ault s +ĠF B +Ġe cosystem +Ġbill ions +Ġvent ure +n amed +Ġdef ender +out e +Inst ead +ir able +W ar +Ġassum ption +Ġb ite +Ġearth qu +t ail +sp ace +Ġgif ts +boy s +Ġinev itable +Ġstruct ural +Ġbenef icial +Ġcompe lling +h ole +erv ation +Ġco at +o j +inc arn +ĠY ears +Ġdetermin ing +Ġrhet oric +Ġbound aries +Ġwh ites +A nt +add y +) - +ra ham +eter min +Ġhar vest +ĠCon c +Ġlapt op +ĠM atch +Ġenjoy ing +cc a +oll ar +Ġtri ps +Ġadd iction +ĠS ak +Ġpow ered +Ġc ous +ĠRuss ians +ie re +Ġret rie +qu ality +Ġdiff er +Ġking dom +ĠL aur +ĠCap itol +Ġcon clusions +ĠAl tern +ĠN av +Ġtrans parent +B ER +G roup +ĠCom plete +Ġinf er +Ġint rig +Ġins ane +R O +oph ob +is en +qu al +Mich ael +Ġm useum +ĠP ope +Ġres et +r ative +f ive +Ġagg reg +itte es +osit ory +Ġcar b +ĠRec ord +Ġdec ides +ĠF ix +Ġexcept ions +ĠCommission er +un s +ĠEnvironment al +Ġlegend ary +ist ence +Ġtun nel +k m +Ġins ult +Ġt roll +Ġsh ake +Ġdet ention +qu es +ĠCh rome +ĠF iles +Ġsub t +Ġprospect s +Ġpro l +re nder +pro of +Ġperform ances +St r +Ġh ref +ern ame +Ġachieve ment +Ġf ut +F ull +ĠLe ban +go ogle +ãĥ Ī +amp a +May be +Ġproject ed +ĠE mb +Ġcol leg +Ġa wards +Ġâ Ķ +G old +ĠBl ake +ĠR aj +if ting +Ġp ending +Ġinst inct +Ġdevelop ments +Con nect +ĠM and +ĠW ITH +ĠPhilipp ines +prof ile +Ġalt ogether +ĠB und +ĠT D +oo oo +amp ed +ip h +Ġste am +Ġold est +Ġdet ection +ul pt +Ġ ç +ĠWay ne +200 6 +f a +Ġcir cles +ĠF u +Ġdon ors +appropri ate +ĠDak ota +j amin +Ġmotiv ated +Ġpurch ases +ĠLouis iana +ĠS pl +Ġgl obe +Ġ10 5 +z ip +c all +Ġdepart ments +Ġsustain able +10 5 +ĠO P +if iers +Ġprevent ed +Ġinc omp +ĠComm ander +Ġdom inated +Ġ » +Ġinvest ed +Ġcomplex ity +Ġin cl +Ġens uring +Ġreal m +yn c +ĠInd ependent +r ained +ĠJ en +ĠFl ight +Ġat he +Ġspec ulation +ĠT E +oc ate +t ic +Ġpl aint +her ry +Ġto y +Ġ1 11 +Ġpl ates +st atus +ĠIs a +Ġdev oted +C op +ĠE S +25 5 +ur rency +M ain +Ġsl aves +Ġpe pper +Ġqu otes +Ġce iling +ĠF ish +Ġtrans formation +Ġfra ction +Ġadvant ages +Ġto ile +Ġstun ning +Ġmo ist +bre aking +s i +ĠL ocation +ĠMed ium +Ġtext s +Ġu gly +Ġb io +. âĢĶ +ĠB ased +Ġtr ains +ĠW ing +ĠAn cient +ĠRec ords +ĠH ope +Spe cial +ades h +ob i +[ / +Ġtempor arily +V er +h u +os er +Ġover night +Ġm amm +ĠTre asury +ĠV enezuel +ĠMeg a +Ġt ar +Ġexpect s +bl ack +or ph +\\ \\ +Ġaccept ance +Ġrad ar +s is +Ġjun ior +Ġfram es +Ġobserv ation +ac ies +P ower +ĠAdv anced +M ag +olog ically +ĠMe chan +Ġsent ences +Ġanaly sts +augh ters +force ment +Ġv ague +Ġcl ause +Ġdirect ors +Ġeval uate +Ġcabin et +M att +ĠClass ic +A ng +Ġcl er +ĠB uck +Ġresear cher +Ġ16 0 +Ġpoor ly +Ġexperien cing +ĠP ed +ĠMan hattan +Ġfre ed +Ġthem es +ad vant +Ġn in +Ġpra ise +10 4 +ĠLib ya +b est +Ġtrust ed +Ġce ase +Ġd ign +D irect +Ġbomb ing +Ġm igration +ĠSci ences +Ġmunicip al +ĠA verage +Ġgl ory +Ġreve aling +Ġare na +Ġuncertain ty +Ġbattle field +ia o +G od +Ġc inem +ra pe +el le +ap ons +Ġlist ing +Ġwa ited +Ġsp otted +ke ley +ĠAud io +e or +ard ing +idd ing +ig ma +ĠN eg +Ġl one +Ġ ---- +ex e +d eg +Ġtrans f +Ġwas h +Ġsl avery +Ġexpl oring +ĠW W +ats on +Ġen cl +l ies +ĠC reek +Ġwood en +Man ager +ĠBr and +um my +ĠAr thur +Ġbureau cr +Ġbl end +ar ians +F urther +Ġsupposed ly +Ġwind s +Ġ19 79 +Ġgrav ity +Ġanalys es +ĠTra vel +ĠV eter +Ġd umb +Ġaltern ate +g al +Ġconsum ed +Ġeffect iveness +.' ' +Ġpath s +ond a +L A +ĠStr ong +Ġen ables +Ġesc aped +Ġ" " +Ġ1 12 +Ġ198 3 +Ġsm iled +Ġtend ency +F ire +Ġp ars +ĠR oc +Ġl ake +Ġf itness +ĠA th +ĠH orn +Ġh ier +Ġimp ose +m other +Ġp ension +ic ut +bor ne +ic iary +. _ +ĠS U +Ġpol ar +is y +eng u +itial ized +AT A +w rite +Ġexerc ises +ĠD iamond +ot ypes +Ġharm ful +on z +Ġprint ing +st ory +Ġexpert ise +ĠG er +Ġtraged y +ĠF ly +Ġd ivid +amp ire +st ock +M em +Ġre ign +Ġun ve +Ġam end +ĠProp het +Ġmut ual +ĠF ac +Ġrepl acing +H ar +ĠCirc uit +Ġthro at +ĠSh ot +Ġbatter ies +Ġto ll +Ġaddress ing +ĠMedic aid +Ġp upp +ĠN ar +ol k +Ġequ ity +M R +ĠHis pan +ĠL arge +m id +D ev +Ġexp ed +Ġdem o +ĠMarsh all +erg us +Ġf iber +Ġdiv orce +ĠCre ate +Ġsl ower +ĠPark er +ĠStud ent +ĠTr aining +Ret urn +ĠT ru +Ġc ub +ĠRe ached +Ġpan ic +Ġqu arters +Ġre ct +Ġtreat ing +Ġr ats +ĠChristian ity +ol er +Ġsac red +Ġdecl are +ul ative +et ing +Ġdeliver ing +est one +Ġt el +ĠL arry +Ġmet a +ac cept +art z +ĠRog er +hand ed +Ġhead er +Ġtra pped +ĠCent ury +Ġkn ocked +ĠOx ford +Ġsurviv ors +b ot +Ġdemon stration +Ġd irt +Ġass ists +OM E +ĠD raft +ortun ate +fol io +pe red +ust ers +g t +ĠL ock +Ġjud icial +ver ted +Ġsec ured +out ing +ĠBook s +Ġhost ing +Ġlif ted +l ength +Ġj er +Ġwhe els +ĠR ange +umbn ails +Ġdiagn osis +te ch +ĠStew art +ĠP ract +Ġnation wide +Ġde ar +Ġoblig ations +Ġgrow s +Ġmand atory +Ġsusp icious +! ' +A pr +G reat +Ġmort gage +Ġprosecut or +Ġeditor ial +ĠK r +Ġprocess ed +ung le +Ġflex ibility +Ear lier +ĠC art +ĠS ug +Ġfoc uses +Ġstart up +Ġbre ach +ĠT ob +cy cle +ãĢ Į +ro se +Ġb izarre +ãĢ į +Ġveget ables +$ $ +Ġret reat +osh i +ĠSh op +ĠG round +ĠSt op +ĠHawai i +ĠA y +Per haps +ĠBe aut +uff er +enn a +Ġproduct ivity +F ixed +cont rol +Ġabs ent +ĠCamp aign +G reen +Ġident ifying +Ġreg ret +Ġpromot ed +ĠSe ven +Ġer u +ne ath +aug hed +ĠP in +ĠL iving +C ost +om atic +me ga +ĠN ig +oc y +Ġin box +Ġem pire +Ġhor izont +Ġbr anches +Ġmet aph +Act ive +ed i +ĠFil m +ĠS omething +Ġmod s +inc ial +ĠOrig inal +G en +Ġspir its +Ġear ning +H ist +Ġr iders +Ġsacr ific +M T +ĠV A +ĠS alt +Ġoccup ation +ĠM i +Ġdis g +lic t +Ġn it +Ġn odes +e em +ĠP ier +Ġhat red +ps y +ãĥ ī +Ġthe ater +Ġsophistic ated +Ġdef ended +Ġbes ides +Ġthorough ly +ĠMedic are +Ġbl amed +arent ly +Ġcry ing +F OR +pri v +Ġsing ing +ĠI l +Ġc ute +o ided +olit ical +ĠNe uro +å ¤ +Ġdon ation +ĠEag les +ĠG ive +T om +Ġsubstant ially +ĠLic ense +ĠJ a +Ġg rey +ĠAn imal +ĠE R +ĠU nd +Ġke en +Ġconclud e +ĠMississ ippi +Eng ine +ĠStud ios +P ress +o vers +ll ers +Ġ3 50 +ĠR angers +Ġr ou +ert o +E p +iss a +iv an +Ġse al +ĠReg ist +dis play +Ġwe aken +u um +ĠComm ons +ĠS ay +Ġcult ures +Ġl aughed +Ġsl ip +Ġtreat ments +iz able +m art +ĠR ice +Ġbe ast +Ġob esity +ĠLa ure +ig a +Wh ich +hold er +Ġelder ly +Ġp ays +Ġcompl ained +Ġc rop +Ġpro c +Ġexplos ive +ĠF an +ĠAr senal +A uthor +ef ul +Ġme als +Ġ( - +id ays +Ġimag ination +Ġann ually +Ġm s +as ures +H ead +ik h +m atic +Ġboy friend +ĠCom puter +Ġb ump +Ġsur ge +ĠCra ig +ĠKir k +D el +medi ate +Ġscen arios +ĠM ut +ĠSt ream +Ġcompet itors +Ù Ħ +ĠStan ford +ĠRes ources +az ed +b age +Ġorgan is +ĠRe lease +Ġsepar ately +Ġha bits +Ġmeasure ments +ĠCl ose +Ġaccomp any +Ġg ly +Ġt ang +ĠR ou +Ġplug in +Ġcon vey +ĠChall enge +oot s +j an +Ġcur s +ĠRel ations +ke eper +Ġapproach ing +p ing +Spe aking +Ġarrang ement +ĠV I +are ttes +Ġaffect ing +Ġperm its +b ecause +Ġu seless +ĠH us +!! !! +Ġdestro ying +Un fortunately +Ġfasc inating +S em +Ġelect oral +Ġtrans parency +ĠCh aos +Ġvolunte er +Ġstatist ical +Ġactiv ated +ro x +We b +H E +ĠHamp shire +is ive +M ap +Ġtr ash +ĠLaw rence +st ick +C r +Ġr ings +EX T +Ġoper ational +op es +D oes +ĠEv ans +Ġwitness ed +P ort +Ġlaunch ing +ec onom +w ear +ĠPart icip +um m +cul es +ĠR AM +ĠT un +Ġass ured +Ġb inary +Ġbet ray +Ġexpl oration +ĠF el +Ġad mission +it ated +S y +Ġav oided +ĠSim ulator +Ġcelebr ated +ĠElect ric +¥ ŀ +Ġcl uster +itzer land +he alth +L ine +ĠN ash +at on +Ġsp are +Ġenter prise +ĠD IS +clud es +Ġfl ights +Ġreg ards +ĠÃ Ĺ +h alf +Ġtr ucks +Ġcontact s +Ġunc ons +ĠCl imate +Ġimm ense +N EW +oc c +ect ive +Ġemb od +Ġpat rol +Ġbes ide +Ġv iable +Ġcre ep +Ġtrig gered +ver ning +Ġcompar able +q l +Ġg aining +ass es +Ġ( ); +ĠG rey +ĠM LS +s ized +Ġpros per +" ? +Ġpoll ing +Ġsh ar +ĠR C +Ġfire arm +or ient +Ġf ence +Ġvari ations +g iving +ĠP i +osp el +Ġpled ge +Ġc ure +Ġsp y +Ġviol ated +Ġr ushed +Ġstro ke +ĠBl og +sel s +ĠE c +,' ' +Ġp ale +ĠColl ins +ter ror +ĠCanad ians +Ġt une +Ġlabor atory +Ġn ons +t arian +Ġdis ability +ĠG am +Ġsing er +al g +ĠSen ior +Ġtrad ed +ĠWar rior +Ġinf ring +ĠFrank lin +Ġstr ain +ĠSwed ish +Ġsevent h +ĠB enn +ĠT ell +Ġsynd rome +Ġwond ered +id en +++ ++ +ig o +Ġpur ple +Ġjournal ism +Ġreb el +Ġf u +bl og +Ġinv ite +ren cies +ĠCont act +Is rael +ĠCont ent +Ġche er +Ġbed room +ĠEngine ering +ĠQue ens +Ġd well +ĠPlay Station +ĠD im +ĠCol on +l r +Ġoper ates +Ġmotiv ation +US A +ast ered +C ore +ĠTr uth +ol o +OS E +ĠMem ory +Ġpred ec +Ġan arch +Ġ19 20 +ĠY am +à ¨ +b id +Ġgr ateful +Ġexc itement +Ġtre asure +Ġlong est +ct ive +Ġdes erves +Ġreserv es +Ġcop s +ĠOtt awa +ĠEgypt ian +ank ed +Ġart if +Ġhypot hesis +: / +Ġpurch asing +Ġlove ly +H P +Ġdiv ide +Ġstrict ly +Ġquestion ing +Ġtaxp ayers +ĠJ oy +Ġroll s +ĠHe avy +Ġp orts +Ġmag netic +Ġinf lamm +Ġbr ush +t ics +â ĪĴ +Ġbott les +pp y +Ġp add +ãĤ ¯ +m illion +Ġdevast ating +Ġcomp iled +Ġmed ication +Ġtw elve +ĠPer ry +Sp ace +im b +y our +Ġle aked +ĠT ar +Ġun ity +Ġinfect ed +Ġtravel ed +ID E +ĠMc Donald +t xt +ĠPr inc +Ġinter ven +ĠTai wan +ĠP ow +Ġbe aring +ĠTh read +Ġz ones +iz ards +un ks +Ch apter +ll or +Ġ · +Ġw ounds +Ġdisc retion +Ġsucceed ed +ik ing +Ġicon ic +C all +Ġscreen ing +ĠM is +ict s +Ġmin isters +Ġsepar ation +Pl ayer +Ġb ip +Ġbel oved +Ġcount ing +ĠE ye +ar ound +ing ing +Ġtable t +Ġoff ence +in ance +h ave +ĠInf o +ĠNin ja +Ġprotect ive +ĠC ass +M ac +ĠQual ity +N orth +Ġ ic +ĠCub a +ĠChron icle +ĠPro perty +Ġfast est +ot os +ĠG erm +OW N +Ġbo om +ĠStan ley +ergus on +Ġcle ver +Ġent ers +m ode +ter ior +ĠS ens +Ġlin ear +AR K +Ġcomp aring +Ġpure ly +Ġsaf er +ĠPot ter +Ġc ups +R T +Ġgl uc +Ġatt ributed +Ġdu pl +ĠP ap +Ġprec ious +Ġp a +iction ary +ĠT ig +ĠTo o +ol utions +st an +Ġrob ots +Ġlob b +Ġstat ute +Ġprevent ion +w estern +16 0 +ĠAct ive +ĠMar ia +h al +N one +ell ar +ĠK B +ĠPart ners +ĠSing le +ĠFollow ing +ang o +ac ious +Ġth ou +Ġk g +Ġinflu ential +ĠFriend s +S ur +ain ted +Ġfor ums +Ġst arter +Ġcitizens hip +ĠE lection +on ge +ot ation +os ph +;; ;; +ut ical +p ur +ere n +Ġaccus ations +bit ious +ab bit +ĠOr d +Post ed +ir k +Ġsens itivity +ic he +ĠAm y +ĠF ab +Ġsum mit +Ġped est +Ġrub ber +Ġagric ultural +Ġcan cel +A E +Ġin aug +Ġcont am +Ġfirm ly +i w +st age +ĠK an +Ġt ier +Ġinv ention +Ġtransl ated +ĠR ules +B ox +Tw itter +ID S +Ġp izza +Ġdeb ug +ĠD rop +v s +Ġh orses +b ig +Ġb oring +Ġh ood +ĠMcC ain +at ched +ĠBro s +Ġsk ip +Ġess ay +st at +ĠLeg ends +Ġam munition +au c +Ġshoot er +Ġun h +Ġsuppl ied +Ġgener ic +ĠS K +ib an +yr ics +Ġ25 5 +Ġclim bing +Form er +Ġfl ip +Ġjump ing +Ġfrust ration +ĠTer ry +Ġneighborhood s +Ġmed ian +be an +Ġbr ains +Follow ing +Ġsh aped +Ġdraw s +Ġal tered +J ack +Ġrecip es +Ġsk illed +we alth +ach i +e lection +Ġbehavi ors +de als +ĠU ntil +F e +Ġdecl aration +mar ks +ĠBet ween +cel ona +Ġres on +Ġbub ble +Am ong +Ġim perial +G S +Ġfemin ist +200 5 +ĠK yle +Ġaccount ing +ĠTe le +ĠT yr +Ġconnect ing +Ġre hab +ĠP red +s im +Ġmeant ime +Ġphys ician +M W +ĠCamp bell +ĠBr andon +Ġcontribut ing +ĠR ule +ĠWe ight +ĠN ap +Ġinter active +Ġv ag +Ġhel met +ĠCom b +f our +Ġsh ipped +Ġcomple ting +ĠP D +PD ATE +Ġspread ing +Ġsc ary +erv ing +ĠG as +Ġfr ank +s chool +Ġrom antic +Ġstab il +R ob +Ġaccur ately +Ġac ute +ĠH ann +Ġsymbol s +Ġcivil ization +ĠA W +Ġlight ning +Ġcons iders +Ġven ue +Ġ × +Ġo ven +ĠS F +h is +Ġn u +ĠLear n +Ġpe oples +Ġst d +Ġsle e +Ġs lic +ĠStat istics +Ġcor ners +ĠB aker +Ġ: ) +ment ation +ol ver +Ġlaugh ing +ĠT odd +ond e +ĠH ills +Ġn uts +ĠW oman +pl ane +Ġl iver +ĠIn side +S orry +Ġagre es +Ġfund ament +ĠF isher +Ġa uction +Ġthread s +gl as +ĠBas ic +ĠN at +Ġlack ing +Ġceleb ration +j u +Ġs illy +E uro +Ġt att +ight y +cont rolled +T est +ĠSing h +Ġr age +Ġrh yth +o ffic +ĠPh antom +Ġhead lines +Ġrespond ing +ĠMor ning +Ġvit amin +Ġboot s +ĠS ite +al in +p i +Ġvir al +ĠU C +D ER +ĠSe x +Ġst ocks +c urrent +Ġch urches +ĠR are +ĠMur phy +Ġden ial +ĠG aming +Ġtou g +Ġn ick +Ġm akers +ĠRon ald +Ġgener ous +ĠD oc +ĠMor ris +Ġtransform ed +ĠN ormal +Ġ10 4 +ĠKick starter +ĠUp on +On line +ĠI RS +Ġw rap +Ġl oving +Ġarri ves +ĠD ue +Ġhe ter +ĠM ade +Ġrent al +Ġbelong s +Ġatt orneys +Ġcro ps +Ġmat ched +ul um +ol ine +10 9 +Ġdis par +Ġbuy ers +ĠCam bridge +Ġeth ics +rou ps +Ġjust ified +Ġmarg inal +Ġrespect ed +win ning +Ġnodd ed +ĠSer ge +ĠForm er +C raft +######## ######## +ĠWar ner +Ġd ash +et e +Ġent ert +ĠE scape +out heast +Ġkn ees +ĠB omb +Ġr ug +P ass +Ġatt itudes +go vernment +ĠPri or +Ġqual ities +Ġnot ification +ĠPh one +l ie +Ġanticip ated +ĠCom bat +ĠBar ry +Ġ198 2 +Us ers +on er +Ġcomput ing +ĠConnect icut +Ġless er +Ġpe ers +ĠC u +Ġtechn ically +Ġsub mission +ĠUn iversal +Ġman ually +our ge +Ġrespond ents +ĠB TC +ĠH ost +Ġf are +ĠB ird +Ġrece ipt +al so +Ġj ack +Ġagric ulture +Ġsk ull +Ġ! = +Ġpass ive +ĠC I +Ġsoc ieties +Ġremind ed +Ġinter ference +B uy +Ġâ ľ +g on +Ġscrut iny +ĠW itch +Ġconduct ing +Ġ ãĥ +Ġexch anges +ĠMit chell +Ġinhab it +Ġtw ist +B D +Ġwhere ver +group on +Ġj okes +ĠBen jamin +ĠR andom +fr ame +ĠL ions +Ġhighlight ed +ĠArk ansas +E nt +Ġp ile +Ġpre lim +g s +mind ed +Ġfel ony +ĠG A +ĠL uck +Ġpract ically +ĠB os +Ġact ress +D am +ĠB ou +Ġvis a +Ġembed ded +Ġhy brid +Ġear liest +Ġsoon er +s ocial +ĠH A +Ġste ep +Ġdis advant +Ġexplo it +ĠE gg +ĠUlt ra +Ġnecess ity +L ocal +ie ge +Ġd ated +Ġmass es +Ġsubsc ription +pl ess +Ġan onym +Ġpresum ably +Bl ue +The ir +asket ball +ĠPhil ip +Ġcom ed +load ed +r ane +Ġref lection +Ch ina +Ġext ends +Ġform ing +Ġund ers +200 1 +Ġgr at +Ġconcent rations +Ġins ulin +Ġsec ular +Ġwh ilst +Ġwin ners +Ad vertisements +Ġdeliber ately +ĠWork ing +Ġs ink +et ics +d ale +Ġmand ate +Ġg ram +Ġvac ation +Ġwarn ings +ri pp +ĠTH AT +Ġcomment ary +Ġint u +Ġa est +Ġreason ing +Ġbreak down +ĠZ ombie +Ġ-- > +ĠPolit ical +c ott +Ġthr ust +Ġtechn ological +Ġdec iding +Ġtraff icking +L ong +W elcome +pr ising +ĠCommun ications +Ġend ors +Ġsw ift +Ġmetab ol +co ins +res a +ĠHT TP +Ġen roll +ĠH appy +us r +int age +Ġ[ " +u ably +ĠM aterial +Ġrepe al +Se pt +k h +ĠMod i +Ġunder neath +ĠI L +sh ore +Ġdiagn osed +ace utical +Ġsh ower +au x +ĠSw itch +ĠStre ngth +Ġj ihad +n ational +Ġtra uma +uss y +on i +Ġcons olid +Ġcal ories +ĠF lynn +ag ged +16 8 +ĠP ink +Ġfulf ill +Ġch ains +Ġnot ably +ĠA V +L ife +ĠCh uck +m us +ĠUr ban +ĠH end +Ġdep osit +ĠS ad +Ġaff air +OR K +ie val +ĠF DA +Ġt rop +ĠOver all +Ġvirt ue +Ġsatisf action +au nd +Ġl un +ĠSw itzerland +ĠOper ation +pro cess +Ġsh ook +Ġcount ies +le ased +ĠCharl otte +1 12 +Ġtrans cript +Ġre dd +p ush +ĠHe y +ĠAn alysis +[ " +Ġaltern atives +ard less +Ġele ph +Ġpre jud +ĠLe af +H aving +ĠH ub +Ġexpress ions +ĠVol ume +Ġshock ing +ĠRed s +Ġread ily +Ġplan ets +ad ata +Ġcollaps ed +ĠMad rid +Ġir rit +i pper +ĠEn c +ĠW ire +Ġbu zz +ĠG P +ash a +Ġaccident ally +ur u +Ġfrust rated +ĠS A +Ġhung ry +ĠH uff +Ġlab els +ant o +ĠE P +Ġbar riers +) | +ĠBer keley +ĠJ ets +Ġp airs +ĠL an +J ames +ĠB ear +Ġhum or +ĠLiber ty +Ġmagn itude +Ġag ing +ĠM ason +Ġfriends hip +umb ling +Ġemer ge +Ġnewsp apers +Ġam bitious +ĠRich ards +atern al +Ġ198 1 +Ġcook ies +Ġsc ulpt +Ġpur suit +L ocation +Ġscript s +p c +Ġarrang ements +Ġd iameter +Ġl oses +am ation +Ġl iqu +ĠJ ake +aret te +Ġunderstand s +ĠZ en +v m +Ġappro ve +Ġw ip +Ġult ra +Ġint end +ĠD I +asc ular +Ġst ays +ĠK or +ĠK l +Ġinvest ing +L a +Ġbelie ving +b ad +m outh +Ġtaxp ayer +ãĥ ĥ +ĠQue bec +Ġl ap +ĠSw iss +d rop +Ġdr ain +ir i +et c +ft en +ĠN ex +Ġst raw +Ġscream ing +Ġcount ed +Ġdam aging +Ġamb assador +cent ury +Ġpro x +Ġarrest s +u v +il ateral +ĠCh arg +Ġpresc ribed +Ġindepend ently +Ġf ierce +ĠB aby +Ġb rave +Ġsu its += > +Ġbas eline +ĠR ate +Ġis lands +Ġ( ( +g reen +ix els +Ġname ly +ĠVill age +th an +am y +V ersion +g mail +ential s +ĠS ud +ĠMel bourne +Ġarri ving +Ġquant um +e ff +rop olitan +T ri +Ġfun eral +ĠI R +ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ +ĠC ob +it ably +Ġt urb +Ġcomb o +Re view +Ġdeploy ment +u ity +ĠB ott +Ġinv isible +Ġrender ing +Ġunl ocked +Ġa qu +ĠVlad imir +Ġp ad +ĠBr ain +ĠLeg acy +dr agon +ĠKurd ish +Ġsound ed +Ġdet ained +ĠD M +g ary +Ġd aughters +Ġdistur bing +uk a +ĠPar ad +Ġt ast +Ġunf ortunate +Ġu l +em in +Ġattend ance +tr l +Ġpar ks +ĠMem orial +ĠAl ice +oth y +gu ard +ĠD ise +ĠSh an +ĠFor um +R ich +Ġshif ted +ue z +Ġl ighter +ĠMag n +Ġc od +S ch +ham mad +P ub +3 50 +ĠP okemon +Ġprot otype +Ġun re +B ase +ĠStud ents +ĠRep ly +ĠCommun ist +Ġg au +ĠTy ler +I Z +Ġparticip ated +Ġsup rem +ĠDet ails +Ġvessel s +ro d +Ġt ribe +ke ep +Ġassum ptions +Ġp ound +Ġcr ude +ĠAv ailable +Ġswim ming +Ġin clusion +Ġadv ances +c ulation +Ġconserv ation +Ġover d +ĠBuff alo +Art icle +ed ge +Ġaw a +ĠMad ison +Ġsid ew +Ġcat ast +ĠK rist +uc le +ĠHigh way +ĠTer ror +Ġactiv ation +Ġuncons cious +ĠSat an +ĠSus an +ill ery +Ġarr anged +i op +Ġrum ors +ur ring +th ink +ĠKe ith +ĠK ind +Ġavoid ing +by n +n ut +ĠSpe aker +r us +n ames +Ġgu ilt +ĠOlymp ics +Ġsa il +ĠM es +lev ant +ĠColumb us +a ft +C ity +S outh +ĠHar vey +ĠP un +S everal +Ġment ally +Ġimp ress +m ount +ĠUb untu +âĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶ +ĠSuper man +ĠMP s +Ġintent ions +ĠR acing +Ġlike lihood +Ġ2 40 +T otal +Ġto ys +ĠW atson +Ġur ge +L ear +ĠP aper +Ġoccur ring +ĠB eng +ĠC ert +Ġst ones +T im +ĠTw in +z b +ĠD ynam +Ġpolit ician +k ens +ĠEnter prise +UT ERS +Ġab ol +Ġref resh +Ġarbit rary +pe ction +Ġtrou bles +Ġ} ); +t v +Ġpil ots +Ġdist ribute +Ġaud it +Ġp ause +orig inal +Ġr ivals + £ +F ig +T L +ab il +ry ing +L in +ion ed +l on +Ġf ancy +Ġcr ashed +Ġt ract +Ġshe d +Ġcons ume +B ased +down load +in it +Ġvolt age +Int rodu +Ġcondem ned +ĠFin ance +res pect +Ġex cluded +Ġestablish ing +her ic +Ġher itage +Ġspect acular +Ġun st +ĠSnow den +ĠL ane +S an +Ġprotect ions +st ruction +inc inn +Ġmac ro +C ustom +ios ity +Ġes p +Ġfunction ing +Ġm ush +Ġp uzzle +Ġeth ical +M al +Ġgo verning +ĠF erguson +Ġrest ored +Ġst ressed +ĠCoun ter +ĠK as +cl ip +AN S +Ġse iz +U K +by ss +old own +ap i +Ġperman ently +oun ters +W est +Th rough +L ight +at oes +Ġne at +Ġc ord +ure r +Ġsevere ly +ĠA ven +Ġinter rog +Ġtri ple +G iven +N umber +Ġar ise +Ġs her +pl ant +Ġfl ower +ĠC ou +Ġat e +Ġnew er +b ul +Ġmean while +ĠL air +Ġadjust ment +ĠCop yright +Ġd ivers +i ological +Ġgam ers +o at +Ġhistor ically +Ġanal og +Ġlong time +Ġpres cription +ĠM ist +ĠHy per +ĠM aine +ĠDe ity +Ġmulti pl +ĠRe incarn +ĠH yd +ĠP ic +S il +r ants +ĠC ris +. ; +( { +epend ence +Ġrec y +ate ur +Ġqu ad +Ġgl ob +Ġcon ced +te am +Ġcapital ist +ĠL ot +Ġroy al +ĠCy ber +Ġblack s +met ic +ri v +ĠD anny +Ġsp o +ĠR O +Ġanim ated +rypt ed +ĠDep uty +Ġrend ered +F E +Ġstre ak +Ġcloud s +ĠDou g +~~~~ ~~~~ +Ġdisc our +ĠVe h +Ġpsych ology +ĠJ ourney +Ġcry stal +ĠFro st +Ġsuspic ion +Ġrel ate +or us +ĠC rypt +ĠN VIDIA +com ed +ut ing +incinn ati +Ġvulner ability +ost ic +Ġisol ation +Ġcool ing +ĠCoal ition +Ġ1 19 +F our +ĠDe al +Ġâ ī +se mble +ram ent +ĠBar celona +Ġ10 2 +Ġcoc aine +ocaly pse +F eb +ogen ic +Ġmut ation +Ġcrypt oc +ĠK el +ĠG it +a is +Ġs isters +AN K +Ġactiv ate +T er +Ġd read +yl on +Ġprop ri +A ust +ĠDef ault +Ġout door +Ġshe er +ce ive +Ġg ently +Ð ¾ +Pro gram +Ġâ ĨĴ +Ġve gan +ĠCr us +Ġrespons ibilities +ĠH R +OL D +Ġprev ents +Ġst iff +ĠW ere +Ġathlet ic +ĠSc ore +Ġ) : +Ġcolumn s +ĠL oc +av ailable +ĠF ram +ĠS essions +Ġcompan ion +Ġpack s +14 0 +ĠKn ights +Ġf art +Ġstream s +Ġsh ore +Ġapp eals +ĠPer formance +h aul +ĠSt ra +ĠN ag +10 3 +ĠTrans portation +B B +E v +z an +P ublic +Ġtw in +uls ion +M ult +Ġelect ro +Ġstat ue +ation ally +ĠN ort +Ġins pection +/ * +ig ue +Ġcomp assion +ĠT ales +ĠSte in +ĠSc reen +ĠB ug +ĠL ion +g irl +Ġwithdraw al +Ġobject ives +Ġblood y +Ġprelim inary +Ġj acket +Ġdim ensions +ĠC ool +ĠOcc up +Ġw reck +Ġdoub led +ank ing +Ġ19 75 +Ġglass es +ĠW ang +pro v +P ath +connect ed +ĠMult i +ĠNor way +agon ist +Ġfe ared +Ġtouch ing +Ġarg uably +¯¯¯¯ ¯¯¯¯ +ĠNC AA +che m +Ġsp at +ĠW WE +ĠC el +ig ger +Ġattack er +ĠJo in +ob ject +ett a +Ġelim inated +d et +Ġdest ruct +ĠLuc as +ct uary +18 0 +ĠBr ady +ĠBl ues +B ay +au kee +Ġtim eline +Ġdeleg ates +w ritten +uff icient +Ġsh apes +Cop yright +ou ble +serv ice +Ġp ione +Ġcolleg es +Ġrow s +Ġsp ite +Ġassess ed +3 60 +Ġle ase +Ġconfident ial +ck er +ĠMan ning +ĠV oice +Ġse aled +Ġcalcul ate +N O +ĠAss istant +Ġteen ager +ul ent +ather ine +Ġm ock +Ġd iamond +Ġf est +Ġsw itched +Ġres ume +ĠPu erto +Ġl anes +ir ation +ĠSimilar ly +Ġro d +ĠS el +ĠPal ace +ĠLim ited +e ous +Ġvar iant +Ġw ard +Ġ) ) +Sh ow +OO K +A lex +ĠN ep +br is +ĠWik ipedia +Ġexcept ional +Ġman ages +ĠD raw +Ag ain +Ġco pper +ut t +Ġex ports +Ġport folio +Ġelev ated +R ated +ĠOther wise +ĠT act +ĠShe l +ĠT X +" âĢĶ +Ġres ur +ĠW a +ven ant +Ġmon etary +pe ople +E mail +Ġfif ty +ĠS weet +ĠMalays ia +Ġconf using +ĠR io +ud a +uten ant +" ); +Ġpra ised +Ġvol umes +t urn +Ġm ature +Ġnon profit +Ġpassion ate +ĠPriv ate +Ġ10 3 +Ġdesc end +ç ¥ŀ +uff y +head ed +Whe ther +ri en +ze ch +be it +Ġch rom +ĠMc M +Ġd ancing +Ġe leg +ĠNot iced +11 5 +Ġadvoc acy +ENT S +amb ling +ĠMin or +ĠF inn +Ġprior ities +Ġthere of +ĠSt age +ĠRog ers +Ġsubst itute +ĠJ ar +ĠJeff erson +Ġlight ly +10 2 +ĠL isa +u its +ys ical +Ġshif ts +Ġd rones +Ġwork place +Ġres id +ens ed +ah n +Ġpref erences +ser ver +Ġdeb ates +d oc +ĠGod s +Ġhelicop ter +Ġhon our +Ġconsider ably +ed ed +ĠF emale +ĠAn ne +Ġre un +ĠF ace +ĠHall ow +ĠBud get +Ġcondem n +Ġt ender +Pro f +ocr atic +ĠTurn er +ĠAg ric +Ġ19 76 +Ġa pt +d isc +ĠF ighter +ĠA ur +Ġgar bage +in put +ĠK arl +ĠOl iver +ĠL anguage +k n +N on +ĠCl ar +Ġtrad itions +Ġad vertisement +ĠS or +Ġarch ive +Ġvill ages +7 50 +Ġimplement ing +w aukee +Ġdiet ary +Ġswitch ing +Rep ublic +Ġvel ocity +Ġc it +ĠA wards +Ġfin ancing +Ġlast ed +) ] +Ġrem inder +P erson +Ġprec ision +Ġdesign ers +ĠF ried +ĠB order +Ġtr agic +Ġw ield +Ġiniti atives +ĠT ank +w er +Ġjo ins +R o +in ery +Ġar row +Ġgener ating +found er +Ġsear ches +Ġrandom ly +A ccess +Ġb atch +Ġp osed +l at +Ġpursu ing +as a +Ġtest ified +form ing +ĠSh ar +w iki +ĠE ither +S ometimes +Ġsen ators +ĠJohn ny +ĠTal iban +ĠG PS +":" / +ãģ® å +Ġanaly zed +ĠRub io +ĠMove ment +op ard +ii i +St and +f ight +Ġign oring +i ang +ĠG N +so ever +ĠST AT +Ġref using +Ġswe at +Ġb ay +P ORT +ir med +ak y +Ġdis pro +Ġlabel ed +Ġ10 8 +H ello +Ġple asant +ab a +Ġtri umph +Ġab oard +Ġinc om +ĠC row +le tt +Ġfol k +Ġch ase +` ` +ĠBr us +Ġte ens +c ue +Ġter rain +h yd +il ight +OR Y +Su pport +ew s +ll i +rain ts +ĠC and +Ġab used +ach ment +l arg +B as +ĠC ancer +Ġ19 78 +Ġsupp orter +ac cess +ĠTer min +ĠT ampa +ĠAN Y +Ġnew est +ĠCrim inal +ed u +Ġ19 30 +Ġadm its +Ġend e +Ġfail ures +ur ate +ful ness +cy cl +ĠSub ject +Ġinf inite +th ree +W A +p it +ĠInst all +R ad +ili ation +G M +Ġcontin ent +Ġaccommod ate +ĠCl ay +Ġp up +ĠF unction +Ġham mer +ĠAlbert a +Ġrev ised +Ġminor ities +Ġmeasure ment +Con nell +Ġdis able +ĠM ix +In cre +Ġfor k +ĠR osen +Ġimpl ies +umb lr +AN G +Ġprote ins +Ġagg ression +Ġfacilit ate +S N +Ġilleg ally +u er +Ġacad em +Ġp uzz +ĠSh ift +p ay +oll o +Ġaud iences +B uild +Ġno ble +Ġsynt ax +â ĺħ +Ġbe am +ĠB ed +ĠA ld +Ġorig ins +v ideo +Ġ19 77 +ĠAss ault +Ġgar age +Te am +Ġver dict +Ġd war +ĠVirt ual +e vent +Ke ep +Ġsent iment +Ġwild life +sh irt +Ġb urg +Ġrecommend ation +rep resent +Ġgall ery +own ers +Ġsch olar +Ġconven ience +ĠSw ift +Ġconv inc +C ap +Ġwar fare +ĠVis ual +Ġconst itute +Ġab ort +ĠWe ather +ĠLook ing +ĠH em +Ġmart ial +Ġinc oming +et ition +Ġtoler ance +ĠCre ated +Ġfl ows +ĠE lder +Ġsoul s +Ġf oul +ĠP ain +ĠC AN +Ġ2 20 +b c +he nd +Ġgen ius +R eal +ĠW r +omet er +p ad +Ġlim iting +ĠS i +ĠL ore +ĠAd ventures +Ġvar ied +D isc +f in +ĠPerson al +Ch ris +Ġinv ented +Ġd ive +ĠR ise +Ġo z +ĠCom ics +Ġexp ose +ĠRe b +let ters +s ite +im ated +Ġh acking +Ġeduc ated +ĠNob ody +Ġdep ri +Ġincent ive +ãĤ · +Ġovers ight +Ġtrib es +ĠBelg ium +Ġlicens ing +our t +Produ ct +ah l +ĠG em +Ġspecial ist +Ġc ra +ann ers +ĠCor byn +Ġ19 73 +RE AD +Ġsum mar +Ġover look +ĠApp lication +Ġin appropriate +Ġdownload ed +Q ue +ĠB ears +Ġth umb +ĠChar acter +ĠReincarn ated +ĠS id +Ġdemonstr ates +s ky +ĠBloom berg +ĠAr ray +ĠRes ults +ĠFour th +ĠED T +ĠO scar +c end +Ġ10 6 +ĠN ULL +ĠH ERE +m atch +ĠBr un +Ġgluc ose +ie g +eg u +Ġcert ified +Ġrel ie +Ġhuman itarian +Ġpr ayers +K ing +Ġn an +h ou +10 8 +ul u +Ġrenew able +Ġdistingu ish +Ġd ense +ĠV ent +ĠPack age +ĠB oss +Ġedit ors +Ġm igr +T ra +ĠPet ers +ĠAr ctic +200 4 +ĠC ape +Ġloc ally +Ġlast ing +Ġhand y +. ). +P an +ĠR ES +Ind ex +Ġt ensions +Ġformer ly +Ġide ological +Ġsens ors +Ġdeal ers +Ġdef ines +S k +Ġproceed s +Ġpro xy +az ines +ĠB ash +ĠP ad +ĠC raft +eal ous +Ġshe ets +omet ry +J une +cl ock +T T +ĠThe atre +ĠB uzz +Ġch apters +Ġmill enn +Ġd ough +ĠCongress ional +Ġimag ined +av ior +Ġclin ic +Ġ19 45 +Ġhold er +ro ot +oles ter +Ġrest art +B N +ĠHam as +ĠJ ob +Ġor b +Ġr am +Ġdiscl ose +Ġtransl ate +Ġimm igrant +Ġannoy ing +Ġtreat y +an ium +ĠTe a +ĠLeg ion +Ġcrowd s +ĠB ec +ĠA er +oh yd +B ro +Look ing +Ġl bs +Ġagg ress +Ġse am +Ġinter cept +ĠM I +mer cial +act iv +ĠC it +Ġdim ension +Ġconsist ency +Ġr ushing +ĠDou glas +Ġtr im +Inst all +ick er +Ġsh y +10 6 +Ġment ions +pe lled +ĠT ak +c ost +Ġclass room +Ġfort une +dri ven +Ġun le +ĠWhe el +Ġinvest or +ĠM asters +k it +Ġassoci ations +ĠEv olution +op ing +us cript +Ġprov incial +ĠWal ter +av i +S O +Ġun limited +Eng lish +ĠC ards +ĠEb ola +ne red +Ġreven ge +Ġout right +um per +Ġf itting +ĠSol id +Ġform ally +Ġproblem atic +Ġhaz ard +Ġenc ryption +Ġstraight forward +ĠA K +Ġp se +ĠOr b +ĠCh amber +ĠM ak +Cont ents +Ġloyal ty +Ġl yrics +ĠSy m +Ġwel comed +Ġcook ed +Ġmon op +Ġn urse +Ġmis leading +Ġe ternal +Ġshif ting +Ġ+ = +V is +Ġinst itutional +ill ary +Ġp ant +VER T +ĠA CC +ĠEn h +Ġinc on +ĠRE UTERS +Ġdon ated +âĢ¦âĢ¦ âĢ¦âĢ¦ +In tern +Ġexhib it +Ġt ire +ĠR ic +ĠCh ampion +ĠMu hammad +N ING +ĠSoc cer +Ġmob ility +Ġvary ing +ĠM ovie +Ġl ord +o ak +F ield +Ġve ctor +us ions +Ġsc rap +Ġen abling +m ake +T or +. * +| | +ĠWe bsite +ĠN PC +Ġsocial ist +ĠBill y +ĠAdd itional +Ġc argo +Ġfar ms +ĠSo on +ĠPri ze +Ġmid night +Ġ9 00 +se en +ĠSp ot +Ġshe ep +Ġspons ored +ĠH i +ĠJ ump +Ġ19 67 +Micro soft +ĠAg ent +Ġch arts +d ir +Ġadj acent +Ġtr icks +Ġman ga +Ġex agger +/ > +foot ball +ĠF CC +G C +ĠT ier +and ra +OU ND +% ), +Ġfru its +V C +ĠA A +R ober +Ġmid st +â Ĺ +ank a +Ġlegisl ature +ĠNe il +Ġtour ists +" " +ĠWar ning +ĠNever theless +ĠOffic ial +ĠWh atever +Ġm old +Ġdraft ed +Ġsubst ances +Ġbre ed +Ġt ags +ĠT ask +Ġver b +Ġmanufact ured +com ments +ĠPol ish +Pro v +Ġdetermin es +Ob ama +k ers +Ġutter ly +Ġse ct +sc he +ĠG ates +ĠCh ap +Ġal uminum +Ġz ombie +ĠT ouch +ĠU P +Ġsatisf y +Ġpred omin +asc ript +Ġelabor ate +Ġ19 68 +Ġmeas uring +ĠV ari +any ahu +Ġs ir +ul ates +id ges +ick ets +ĠSp encer +T M +oub ted +Ġpre y +Ġinstall ing +ĠC ab +re ed +re ated +Su pp +Ġwr ist +ĠK erry +10 7 +ĠK le +ĠR achel +Ġc otton +ĠA RE +ĠE le +Cont rol +Ġload s +ĠD od +an as +b one +Ġclass ical +ĠReg ional +ĠInt eg +V M +Ġdes ires +Ġaut ism +support ed +ĠM essage +Ġcomp act +writ er +Ġ10 9 +ĠHur ricane +c ision +Ġcy cles +Ġdr ill +Ġcolle ague +Ġm aker +G erman +Ġmist aken +S un +ĠG ay +Ġwhat soever +Ġsell s +ĠA irl +l iv +ĠO ption +Ġsol ved +Ġse ctors +Ġhorizont al +Ġequ ation +ĠSk ill +ĠB io +g ement +ĠSn ap +ĠLeg al +Ġtradem ark +Ġmake up +Ġassemb led +Ġsa ves +ĠHallow een +ĠVer mont +ĠFR OM +Ġfar ming +ĠP odcast +accept able +ĠHig her +Ġas leep +ull ivan +Ġrefere n +ĠLe v +Ġbul lets +ok o +H C +Ġst airs +Ġmain tains +ĠL ower +ĠV i +Ġmar ine +Ġac res +Ġcoordin ator +ĠJ oh +Ġcounterpart s +ĠBrother s +Ġind ict +b ra +Ġch unk +Ġc ents +H ome +ĠMon th +Ġaccording ly +if les +ĠGerm ans +ĠSy n +H ub +Ġey eb +âĶĢâĶĢ âĶĢâĶĢ +Ġr anges +ĠHoll and +ĠRob ot +f c +M ike +Ġpl asma +Ġsw ap +Ġath lete +ĠR ams +,' " +Ġinfect ions +Ġcor rid +Ġv ib +Ġpat ches +Ġtradition ally +Ġrevel ation +Ġswe ep +Ġgl ance +Ġin ex +200 3 +ĠR aw +work ing +os ures +ĠD at +ĠLyn ch +Ġle verage +ĠRe id +Ġcorrel ation +ian ces +av ascript +Ġrep ository +ret ty +Ġ19 72 +24 0 +Ġo un +p ol +ĠRe ed +Ġtact ical +is ite +App le +ĠQu inn +Ġrap ed +ill o +Euro pe +Ġalgorith ms +ĠRod rig +i u +Ġill um +Ġf ame +Ġintrodu cing +Ġdel ays +ĠRaid ers +Ġwh istle +Ġnovel s +ĠRe ally +Ġder iv +Ġpublic ations +ĠNe ither +ĠCom merce +Ġa ston +l anguage +Not es +ĠR oth +ĠF ear +Ġm ate +Ġpar ade +ĠQ B +Ġman eu +ĠC incinnati +m itting +Ġwa ist +ĠR ew +Ġdisc ont +Ð ° +Ġst aring +Ġal ias +Ġsec urities +Ġtoile t +ĠJ edi +Ġun law +v ised +//// //// +] ( +ĠWe iss +Ġpre st +ĠComp an +Ġmem o +ĠGr ace +J uly +ĠEl ite +cent er +ĠSt ay +Ġgal axy +Ġto oth +ĠS ettings +Ġsubject ed +ãĤ ¦ +Ġline back +Ġretail ers +ĠW ant +Ġd angers +A ir +Ġvolunt ary +ew ay +Ġinterpret ed +ot ine +à § +Ġp el +Serv ice +ĠEvent ually +Ġcare ers +Ġthreat en +Ġmem or +ĠBrad ley +anc ies +s n +ĠUn known +N ational +Ġsh adows +ail and +ĠD ash +Every one +izz ard +M arch += ( +Ġpull s +Ġstr anger +Ġback wards +ĠBern ard +imens ional +Ġch ron +Ġtheoret ical +k top +Ġw are +ĠInvest ig +ĠIn iti +ĠOper ations +o ven +oc ide +* / +Ġfl ames +ĠC ash +sh it +Ġc ab +ĠAn aly +ĠSe ah +Ġdefin ing +Ġorder ing +Ġimm un +Ġpers istent +AC H +Russ ian +m ans +Ġh ind +Ġphot ography + © +Ġh ug +Ġ10 7 +ĠH ence +i ots +ude au +Ġsubsid ies +Ġroutine ly +ĠDev ice +it ic +Ġdisg ust +land er +Ġ19 40 +Ġassign ment +ĠB esides +w ick +ĠD ust +us c +struct ed +11 1 +de velop +Ġf ond +Ġinter section +Ġdign ity +Ġcommission er +With out +re ach +Ġcart oon +Ġsc ales +ãĥ Ń +F IG +Ġsurve ys +ĠIndones ia +Ġart work +Ġun ch +Ġcy cling +un ct +au er +or ate +ĠOb viously +Ġcharacter ized +fe ld +Ġaff irm +Ġinn ings +Ġ é +Ġal iens +Ġcl oth +et ooth +ĠC ertain + § +Ġdig est +k now +ĠX L +Ġpredict ions +Ġd in +W AR +Ġafter math +Ex ample +ĠSu ccess +ĠTh r +IG N +Ġmin er +B us +Ġcl arity +heim er +ĠO UT +ĠS end +ĠCirc le +ĠD iet +Ġpron ounced +Ġcreat ors +Ġearthqu ake +atter y +ge ons +Ġo d +Ġlay ing +or p +U lt +pro ject +Ġunder min +Ġsequ el +S am +ĠDark ness +Ġre ception +b ull +Y S +ĠV ir +Ġsequ ences +ĠCo in +Ġout fit +ĠW ait +1 19 +Ġdel ivers +.... .. +Ġbl own +ĠE sc +ĠM ath +per m +ĠU l +Ġgl im +Ġfac ial +Ġgreen house +Ġto kens +/ - +ĠAnn ual +ĠON E +Ġteen age +ĠPhys ical +ĠL ang +ĠC elt +Ġsu ed +ivid ually +Ġpat ience +ch air +reg ular +Ġa ug +in v +ex cept +ĠL il +Ġn est +f d +s um +ĠCh ase +Russ ia +ĠJenn ifer +Ġoff season +Over all +F ore +Ġr iot +A ud +form er +Ġdefend ers +ĠC T +iot ic +rib ly +Ġautom ated +Ġpen is +Ġins ist +Ġdi agram +ĠS QL +ĠG arc +Ġw itch +cl ient +ier ra +am bers +Ġrec ount +f ar +V ery +oster one +Ġappreci ated +ĠPer fect +S ection +Ġd oses +oca ust +Ġcost ly +Ġg rams +ĠSh i +Ġwrest ling +Ġ19 71 +Ġtro phy +Ġn erve +ĠK az +ĠExper ience +Ġpled ged +Ġplay back +Ġcreat ivity +by e +Ġattack ers +Ġhold ers +ĠCo ach +ĠPh D +Ġtransf ers +Ġcol ored +ĠH indu +Ġd rown +Ġlist ened +ĠW A +ias m +P O +Ġappeal ing +Ġdiscl osed +ĠCh icken +ag ging +Ġple aded +Ġnav igation +ĠReturn s +Ġ[ [ +R OR +E A +Ġphotograp her +ĠR ider +ipp ers +Ġsl ice +Ġe rect +Ġhe d +iss ance +ĠVik ings +ur ious +Ġapp et +oubted ly +Ch ild +Ġauthent ic +o os +ĠM aking +Ġannoun cing +Ġb od +Ġmet er +ĠN ine +ĠR ogue +Ġwork force +Ġrenew ed +Ġorganis ations +ac s +P LE +Sh ort +Ġcomp ounds +ĠVis it +Ġen velop +ear th +Ġsupport ive +gg le +ĠBrus sels +ĠGu ild +Cre ate +RE L +Ġaver aged +Ġ19 69 +ri ages +Ġlength y +Ġforg ot +O kay +ĠE rd +Ġdeal er +Ġrec ession +D D +Ġdesper ately +Ġhun ger +Ġst icks +Ġm ph +ĠF aith +Ġintention ally +Ġdem ol +ue ller +ĠS ale +Ġde bris +s pring +Ġle ap +>> >> +Ġcontain ers +se lling +rane an +atter ing +Ġcomment ed +ĠC M +on ut +Ġwood s +es pecially +Ġorgan ize +iv ic +ĠWood s +ang a +s qu +Ġm aj +am on +Ġax is +Ġ19 74 +ĠDen mark +Ġwar rior +ĠP and +Ġout lined +ĠB O +ins ula +z illa +eb ook +Ġd are +Ġsear ched +Ġnav igate +S n +writ ing +Ġun ited +J apan +ĠHe brew +Ġfl ame +Ġrel ies +Ġcatch ing +ĠSh o +Ġimprison ment +Ġp ockets +Ġclos ure +ĠF am +t im +ade qu +Act ivity +Ġrecru iting +ĠW ATCH +ĠArgent ina +d est +Ġapolog ize +or o +Ġlack s +Ġtun ed +ĠGriff in +Ġinf amous +Ġcelebr ity +ss on +Ġ ---------------------------------------------------------------- +ĠIs is +ĠDis play +Ġcred ibility +Ġeconom ies +Ġhead line +ĠCow boys +Ġind ef +Ġl ately +Ġincent ives +but ton +ĠM ob +A ut +Ġres igned +ĠO m +c amp +Ġprof iles +Ġsche mes +olph ins +ay ed +Cl inton +en h +ĠY ahoo +Ġab st +Ġan k +su its +Ġw ished +ĠMar co +udd en +Ġsp here +ĠB ishop +Ġincorpor ated +ĠPl ant +11 4 +Ġh ated +p ic +Ġdon ate +Ġl ined +Ġbe ans +Ġsteal ing +Ġcost ume +Ġsher iff +Ġfor ty +Ġint act +Ġadapt ed +Ġtrave lling +b art +Ġnice ly +Ġdri ed +Ġsc al +os ity +NOT E +ĠB h +ĠBron cos +ĠI gn +Ġint imate +Ġchem istry +Ġopt imal +D eb +ĠGener ation +Ġ] , +ich i +ĠW ii +ĠYOU R +vent ions +W rite +Ġpop ul +un ning +ĠW or +V ol +Ġqu een +head s +K K +Ġanaly ze +op ic +ear chers +Ġd ot +leg raph +ast ically +Ġupgr ades +Ġca res +Ġext ending +Ġfree ze +Ġin ability +Ġorg ans +Ġpret end +Ġout let +11 3 +ol an +ĠM all +ul ing +t alk +Ġexpress ing +ĠAl ways +ĠBe gin +f iles +Ġlic enses +% % +ĠM itt +Ġfil ters +ĠMil waukee +G N +Ġunf old +M o +Ġnut rition +pp o +B o +Ġfound ing +Ġunder mine +Ġeas iest +ĠC zech +ĠM ack +Ġsexual ity +ĠN ixon +W in +ĠAr n +ĠK in +ãĤ £ +ic er +Ġfort un +Ġsurf aces +agh d +Ġcar riers +ĠP ART +ĠT ib +Ġinter val +Ġfrust rating +ĠSh ip +ĠAr med +ff e +Ġbo ats +ĠAb raham +in is +Ġsu ited +th read +i ov +ab ul +ĠVenezuel a +Ġto m +su per +Ġcast le +alth ough +iox ide +ec hes +Ġevolution ary +Ġnegoti ate +Ġconfront ed +Rem ember +Ġ17 0 +S uch +Ġ9 11 +m ult +ĠA byss +ur ry +ke es +spe c +ĠBarb ara +Ġbelong ing +Ġvill ain +ist ani +Ġaccount able +Ġport ions +ĠDe cl +U r +ĠK ate +g re +Ġmag azines +UC K +Ġregul ate +om on +ĠAl most +Ġover view +Ġsc ram +Ġl oot +ĠF itz +Ġcharacter istic +ĠSn ake +s ay +ĠR ico +Ġtra it +ĠJo ined +au cus +Ġadapt ation +ĠAirl ines +Ġarch ae +ĠI de +Ġb ikes +Ġliter ary +Ġinflu ences +ĠUs ed +C reat +Ġple a +ĠDef ence +ĠAss ass +Ġp ond +UL T +) " +Ġeval uated +Ġob taining +Ġdem ographic +Ġvig il +ale y +Ġsp ouse +ĠSeah awks +resp ons +ĠB elt +um atic +Ġr ises +run ner +ĠMichel le +Ġpot ent +r ace +ĠP AC +F ind +olester ol +IS S +ĠIntrodu ced +ress es +ign ment +O s +ĠT u +ĠDe x +ic ides +Ġspark ed +ĠLaur a +ĠBry ant +Ġsm iling +ĠNex us +Ġdefend ants +ĠCat al +Ġdis hes +sh aped +Ġpro long +m t +( $ +ãĢ Ĥ +Ġcalcul ations +ĠS ame +Ġp iv +H H +Ġcance lled +Ġgr in +Ġterrit ories +ist ically +C ome +ĠP arent +Pro ject +Ġneg lig +ĠPriv acy +Ġam mo +LE CT +olute ly +ĠEp ic +Ġmis under +w al +Apr il +m os +path y +ĠC arson +Ġalbum s +ĠE asy +Ġpist ol +< < +Ġ\ ( +t arget +hel p +Ġinter pre +cons cious +ĠH ousing +ĠJ oint +12 7 +Ġbe ers +s cience +ĠFire fox +effect ive +ĠC abin +ĠO kay +ĠApp lic +Ġspace craft +ĠS R +ve t +ĠStr ange +S B +Ġcor ps +iber al +e fficient +Ġpreval ence +Ġeconom ists +11 8 +Th read +ord able +OD E +ĠC ant +=- =- +if iable +ĠA round +Ġpo le +Ġwilling ness +CL A +ĠK id +Ġcomple ment +Ġsc attered +Ġin mates +Ġble eding +e very +Ġque ue +ĠTr ain +Ġh ij +Ġme lee +ple ted +Ġdig it +Ġg em +offic ial +Ġlif ting +Ð µ +Re qu +it utes +Ġpack aging +ĠWork ers +h ran +ĠLeban on +ol esc +Ġpun ished +ĠJ uan +Ġj am +ĠD ocument +Ġm apping +ic ates +Ġinev itably +Ġvan illa +ĠT on +Ġwat ches +Ġle agues +Ġiniti ated +deg ree +port ion +Ġrec alls +Ġru in +Ġm elt +I AN +Ġhe m +Ex p +Ġb aking +ĠCol omb +at ible +Ġrad ius +pl ug +ĠI F +et ically +Ġf ict +H ER +ĠT ap +atin um +Ġin k +Ġco h +ĠW izard +b oth +te x +Ġsp ends +ĠCurrent ly +ĠP it +Ġneur ons +ig nt +Ġr all +Ġbus es +b uilding +Ġadjust ments +Ġc ried +ibl ical +att ed +ĠZ ion +ĠM atter +Ġmed itation +ĠD ennis +Ġour s +ĠT ab +Ġrank ings +ort al +Ġad vers +Ġsur render +ĠG ob +ci um +om as +im eter +Ġmulti player +Ġhero in +Ġoptim istic +Ġindic ator +ĠBr ig +Ġgro cery +Ġapplic ant +ĠRock et +v id +Ex ception +p ent +Ġorgan izing +Ġenc ounters +ĠT OD +Ġjew el +S ave +ĠChrist ie +Ġhe ating +Ġl azy +ĠC P +Ġcous in +Con fig +Ġreg ener +Ġne arest +Ġachie ving +EN S +th row +ĠRich mond +ant le +200 2 +Ġan ten +b ird +13 3 +Ġn arc +r aint +un ny +ĠHispan ic +ourn aments +Ġprop he +ĠTh ailand +ĠT i +Ġinject ion +Ġinher it +rav is +Ġmed i +Ġwho ever +ĠDE BUG +G P +ĠH ud +C ard +p rom +Ġp or +Ġover head +L aw +Ġviol ate +Ġhe ated +Ġdescript ions +Ġachieve ments +ĠBe er +ĠQu ant +W as +Ġe ighth +ĠI v +Ġspecial ized +U PDATE +ĠD elta +P op +J ul +ĠAs k +oph y +Ġnews letters +ĠT ool +Ġg ard +ĠConf eder +ĠGM T +ĠAb bott +Ġimm unity +ĠV M +Is lam +Ġimpl icit +w d +Ġ19 44 +rav ity +omet ric +Ġsurv iving +ur ai +ĠPr ison +Ġr ust +ĠSk etch +Ġbe es +ĠThe ory +Ġmer it +T ex +ch at +Ġm im +Ġpast e +ĠK och +Ġignor ance +ĠSh oot +Ġbas ement +Un ited +ĠAd vis +he ight +Ġf oster +Ġdet ain +in formation +Ġne ural +' ; +Ġprov es +all ery +Ġinv itation +um bers +Ġc attle +Ġbicy cle +z i +Ġconsult ant +Ġap ology +ĠT iger +Ġ12 3 +99 9 +Ġind ividually +r t +ig ion +ĠBrazil ian +Ġdist urb +Ġentreprene urs +Ġfore sts +cer pt +pl ates +p her +clip se +Ġtw itter +Ġac ids +ograph ical +h um +ĠB ald +if ully +Ġcomp iler +ĠD A +Ġdon or +as i +Ġtrib al +l ash +ĠCon fig +Ġapplic ants +Ġsal aries +13 5 +Put in +ĠF ocus +ir s +Ġmisc onduct +ĠH az +Ġeat en +M obile +Mus lim +ĠMar cus +v iol +Ġfavor able +Ġst ub +ad in +ĠH ob +Ġfaith ful +Ġelectron ics +Ġvac uum +w ait +back ed +econom ic +d ist +Ġten ure +Ġsince re +ĠT ogether +ĠW ave +Ġprog ression +Ġden ying +Ġdist ress +br aska +th ird +Ġmix ing +Ġcolon ial +Ġpriv ately +Ġun rest +atern ity +Ġprem ises +ant i +greg ation +Ġlic ence +ĠH ind +ĠSam uel +Ġconvinc ing +ĠA ce +ĠR ust +ĠNet anyahu +Ġhand les +ĠP atch +orient ed +ah o +ĠG onz +Ġhack ers +claim er +Ġcustom s +ĠGr an +f ighters +Ġl uc +Ġman uscript +aren thood +Ġdev il +Ġwar riors +Ġoff enders +Will iam +Ġhol idays +Ġnight mare +Ġle ver +iff erent +St at +Ġexhib ition +put ed +ĠP ure +Ġal pha +Ġenthus iasm +ĠRepresent atives +E AR +ĠT yp +Ġwhe at +ĠAl f +Ġcor rection +Ġev angel +AT T +M iss +Ġs oup +Ġimpl ied +par am +Ġsex y +ĠL ux +Ġrep ublic +p atch +ab lish +Ġic ons +Ġfather s +ĠG ET +ĠCar ib +Ġregul ated +ĠCo hen +ĠBob by +Ġn er +Ġb ent +vent ory +ĠAl ong +ĠE ST +ĠWall ace +Ġmurd ers +r ise +ke ll +ĠCommon wealth +Ġn asty +et a +ĠM IT +Ġadminist ered +Ġgenuine ly +Ed itor +n ick +Ġhyd ro +**************** **************** +ĠB le +Ġfin es +Ġg orge +aus ible +r h +Ġapp le +ment ioned +Ġro pe +ot yp +H R +Ġdisappoint ing +Ġc age +n ik +Ġdoub ts +ĠF REE +print s +ĠM UST +Ġvend ors +ĠIn qu +Ġliber als +Ġcontract or +Ġup side +child ren +Ġtrick y +Ġregul ators +charg ed +l iter +Ġ *** +Ġreb ell +l ang +Ġloc als +Ġphys icians +Ġhe y +ar se +t m +ĠLe x +Ġbehavior al +success ful +F X +Ġbr ick +ov ic +Ġcon form +Ġreview ing +Ġins ights +Ġbi ology +ĠRem ove +ĠExt ra +Ġcomm itting +indu ced +ignt y +ig m +Ġat omic +Comm on +ĠE M +ĠP ere +ĠIt ems +e h +Ġpres erved +ĠH ood +Ġprison er +Ġbankrupt cy +Ġg ren +us hes +Ġexplo itation +Ġsign atures +Ġfin an +] ," +ĠM R +Ġme g +rem lin +Ġmusic ians +Ġselect ing +Ġexam ining +IN K +l ated +H i +Ġart ic +Ġp ets +Ġimp air +ĠM AN +Ġtable ts +in clude +R ange +Ġca ut +Ġlog s +Ġmount ing +Ġun aware +Ġdynam ics +ĠPalest ine +ĠQu arter +ĠPur ple +Ġm a +ĠIm port +Ġcollect ions +ci ation +Ġsuccess or +Ġcl one +Ġaim ing +Ġposs essed +Ġstick ing +Ġsh aking +Ġloc ate +ĠH ockey +T urn +17 0 +Ġfif teen +ĠHar rison +Ġcontinu ously +ĠT C +ĠVal ent +ĠRes cue +Ġby pass +am ount +Ġm ast +Ġprotect s +Ġart istic +Ġsomet ime +Ġsh oe +Ġshout ed +ific ant +et itive +ĠReg ister +ĠJ in +Ġconcent rated +ling ton +on ies +Ġgener ator +yr im +ĠAr men +Ġclear ing +id o +ĠT W +al ph +Ġlad ies +H ard +Ġdial og +Ġinput s +æ ľ +Ġpos es +Ġsl ots +ĠPrem ium +Ġle aks +Ġboss es +Ġ11 3 +c ourse +A cc +ĠNew ton +ĠAust ria +ĠM age +Ġte aches +ab ad +Ġwe ars +Ġc yl +Ġcur se +ĠS ales +ĠW ings +Ġp sy +Ġg aps +ĠIce land +ĠP interest +Ġland lord +Ġdefin itions +ĠK er +Ġsufficient ly +ĠP ence +ĠArch itect +Ġsur pass +Ġ11 4 +Ġsuper hero +ĠDise ase +Ġpri ests +ĠC ulture +Ġdefin itive +Ġsecret ly +ĠD ance +inst all +ch ief +ĠJess ica +W ould +Up dated +Ġlock er +ĠK ay +Ġmem orial +è ¦ +f at +Ġdis gu +Ġflav ors +ĠBase ball +ĠRes istance +Ġk icks +Ġen v +Ġteen agers +D ark +ĠC AR +Ġh alt +ĠL G +ĠGab riel +Ġfe ver +Ġs atur +Ġm all +Ġaffili ate +ĠS leep +ĠSpe cific +ĠV el +Ġj ar +ĠSac red +ĠEd wards +ĠA CL +Ġret ained +ĠG iant +Ġlim itation +in ces +Ġref usal +ĠT ale +ĠBut ler +Ġacc idents +ĠC SS +Ġimport ed +ĠCop y +Î ± +ER T +z el +Ġdiv isions +h ots +ĠAl b +ĠD S +Load er +W ashington +at isf +ĠCreat ive +\ . +ĠAut om +red ict +Ġrecept or +ĠCarl os +Met hod +ok a +Ġmal icious +Ġste pping +, [ +ĠD ad +Ġatt raction +ĠEffect s +ĠPir ate +ĠC er +ĠIndust ry +ĠR ud +Ġchar ter +Ġd ining +Ġins ists +Ġconfig ure +Ġ( # +ĠSim ple +ĠSc roll +UT C +17 5 +ĠK on +Ġmarket place +Ġ ãĤ +Ġref res +Ġg ates +er red +ĠP od +Ġbeh ave +Fr ank +n ode +Ġendors ed +he tt +as ive +ĠHom eland +Ġr ides +ĠLe ave +er ness +Ġflood ing +A FP +Ġris en +Ġcontin ually +Ġun anim +ĠCont ract +ĠP as +Ġgu ided +ĠCh ile +b d +Ġsu cc +pt ic +Ġcomm ittees +ĠL uther +ĠAny one +Ġs ab +12 4 +Ġp ixel +ĠB ak +ĠT ag +ĠBenn ett +En ter +sm all +ĠPresident ial +Ġp ul +Ġcontr ace +arch ive +Ġcoast al +ĠK ids +19 2 +âĢ ² +ick y +ING TON +Ġw olf +ĠSt alin +T ur +id get +am as +ĠUn less +Ġspons or +Ġmor ph +ĠCho ose +Ġrun ner +Ġun bel +Ġm ud +ĠMan a +Ġdub bed +Ġg odd +ure rs +wind ow +Ġrel ied +Ġcelebr ating +os c +Ġ13 5 +Ġlobb ying +Ġincom plete +Ġrestrict ion +Ġinc ap +it us +Ġexpect ation +ĠAp ollo +Ġint ens +Ġsyn c +G H +Ġmanip ulation +B Y +Ġspe ar +Ġbre asts +Ġvol can +il ia +M aterial +Ġform ats +ĠB ast +Ġparliament ary +Ġsn ake +Ġserv ants +ĠTr udeau +ĠGr im +ĠArab ic +ĠSC P +ĠBoy s +st ation +Ġprospect ive +ord e +in itialized +Ġb ored +AB LE +Ġaccess ed +Ġtax i +ĠShe ll +aid en +urs ed +in ates +ĠIns urance +ĠPet e +Sept ember +6 50 +Ġad ventures +ĠCo ver +Ġt ribute +Ġsk etch +Ġem power +Ġ Ø +ĠGl enn +ĠD aw += \" +ĠPolit ics +Ġgu ides +Ġd ioxide +ĠG ore +ĠBr ight +ĠS ierra +Ġval ued +c ond +Ġpo inter +Se lect +Ġrisk y +Ġabsor b +im ages +Ġref uses +Ġbon uses +__ _ +Ġh ilar +ĠF eatures +2 20 +ĠCollect or +F oot +Ġ19 64 +cul us +Ġd awn +Ġwork out +ĠL O +Ġphilosoph ical +ĠSand y +ĠYou th +Ġl iable +A f +bl ue +Ġovert urn +less ness +ĠTrib une +ĠIn g +Ġfact ories +Ġcat ches +Ġpr one +Ġmat rix +Ġlog in +Ġin acc +Ġex ert +s ys +Ġneed le +ĠQ ur +Ġnot ified +ould er +t x +Ġremind s +Ġpublisher s +Ġn ort +Ġg it +Ġfl ies +ĠEm ily +Ġflow ing +ĠAl ien +ĠStr ateg +Ġhard est +Ġmod ification +AP I +ĠM Y +Ġcr ashes +st airs +n umber +Ġur ging +ch annel +ĠFal con +Ġinhabit ants +Ġterr ifying +Ġutil ize +Ġban ner +Ġcig arettes +Ġsens es +ĠHol mes +Ġpract ition +ĠPhill ips +ott o +Ġcomp ile +Mod el +ĠK o +Ġ[ ] +Americ ans +ĠTer ms +Ġmed ications +ĠAn a +Ġfundament ally +ĠNot ice +Ġwe aker +Ġ 0000 +Ġgar lic +Ġout break +Ġeconom ist +ĠB irth +Ġobst acles +ar cer +ĠOr thodox +Ġplace bo +ĠC rew +asp berry +ĠAng els +Ġdis charge +Ġdestruct ive +11 7 +ĠR ising +Ġd airy +l ate +Ġcoll ision +ĠTig ers +ean or +ocument ed +ĠIn valid +Ġd ont +ĠL iter +ĠV a +Ġhyd rogen +Ġvari ants +ĠBrown s +Ġ19 65 +Ġind igenous +Ġtrad es +Ġremain der +Ġswe pt +ĠImp act +Ġred ist +Ġun int +grad uate +ãĥ ķ +ĠW ILL +ãģ® ç +ĠCrit ical +Ġf isher +Ġv icious +Ġrevers ed +Y ear +ĠS ox +Ġshoot ings +Ġfil ming +Ġtouchdown s +ai res +m el +Ġgrand father +Ġaffect ion +ing le +Ġover ly +Add itional +Ġsup reme +ĠGr ad +Ġsport ing +Ġmer cy +ĠBrook s +ount y +Ġperform s +Ġtight ly +Ġdem ons +Ġkill ings +Ġfact ion +ĠNov a +aut s +Ġund oubtedly +ar in +Ġunder way +ra k +Ġl iv +ĠReg ion +Ġbrief ing +s ers +cl oud +ĠM ik +us p +Ġpred iction +az or +Ġport able +ĠG and +Ġpresent ing +Ġ10 80 + » +ush i +ĠSp ark +there um +Ġjust ification +ĠN y +Ġcontract ors +ming ham +ĠSt yle +å ħ +ĠChron icles +ĠPict ure +Ġprov ing +Ġw ives +set t +Ġmole cules +ĠFair y +Ġconsist ing +Ġp ier +al one +in ition +Ġn ucle +j son +Ġg otta +Ġmob il +Ġver bal +ar ium +Ġmon ument +uck ed +Ġ25 6 +T ech +mine craft +ĠTr ack +Ġt ile +Ġcompat ibility +as is +Ġs add +Ġinstruct ed +ĠM ueller +Ġle thal +Ġhorm one +Ġor che +el se +Ġske let +Ġentert aining +Ġminim ize +ag ain +Ġunder go +Ġconst raints +Ġcig arette +ĠIslam ist +Ġtravel s +ĠPant hers +l ings +C are +Ġlaw suits +ur as +Ġcry st +Ġlow ered +Ġaer ial +Ġcomb inations +Ġha un +Ġch a +Ġv ine +Ġquant ities +Ġlink ing +b ank +Ġso y +B ill +ĠAngel a +Ġrecip ient +ĠProt est +Ġs ocket +Ġsolid arity +Ġâ Ĩ +m ill +Ġvar ies +ĠPak istani +Dr agon +Ġun e +Ġhor izon +³³³³ ³³³³ +Ġprov inces +Ġfrank ly +Ġenact ed +not es +[ ' +Ġ19 2 +ocr acy +Ġendorse ment +Ġover time +Tr ue +L ab +lic ted +ĠD NC +Ġbe ats +ĠJam ie +15 2 +ĠIN T +Cont act +Ġaccount ed +h ash +ĠPack ers +p ires +Ġles bian +Ġamend ments +Ġhop eful +ĠFin land +Ġspot light +Ġconfig ured +Ġtrou bled +Ġg aze +ĠCal gary +Ġrel iability +Ġins urg +sw er +b uy +ĠSk in +Ġp ixels +Ġhand gun +Ġpar as +Ġcateg or +ĠE L +ĠRe x +Ind eed +Ġkind a +Ġconj unction +ĠBry an +ĠMan ufact +y ang +Pl us +S QL +ish ment +Ġdom inate +Ġn ail +Ġo ath +Ġeru pt +ĠF ine +it bart +ĠCh ip +ĠAb d +ĠN am +Ġbuy er +Ġdiss ent +Le aks +Cont in +Ġr ider +ĠSome one +Ġill usion +c in +ĠBoe ing +Ġin adequ +ov ation +i ants +Ġreb uild +4 50 +ĠDest iny +S W +ĠT ill +H it +ia z +ĠBang l +acher s +ĠRe form +Ġse gments +Ġsystem atic +d c +ĠConserv atives +Ġport al +h or +ĠDragon bound +Ġdrag ged +om o +Ġthe e +ad vert +ĠRep orts +ĠE t +Ġbarrel s +Aug ust +Ġcompar isons +Ġhe x +Ġan throp +" [ +bor ough +ab i +Ġpict ured +play ing +ĠAdd ress +ĠMir ror +Sm ith +Ġt ires +ĠN PR +AA AA +Ġclass ification +ĠTh an +ĠH arm +ĠR A +Ġreject ion +min ation +Ġr anged +ĠF alls +D I +H ost +ãĤ ´ +ĠEx ample +list ed +th irds +Ġsaf egu +br and +Ġprob able +Can ada +IT ION +ĠQ aeda +Ġch ick +Ġimport s +h it +l oc +W W +Ġble w +Ġany time +Ġwh oles +ik ed +Ġcal culation +cre ate +ĠO ri +Ġupgr aded +Ġapp ar +ut ory +ĠM ol +B rit +ĠJ ong +IN AL +ĠStart ing +Ġd ice +urt le +Ġre lying +cl osure +Ġprof itable +Ġsl aughter +ĠMan ual +c aster +Ġ" $ +Ġfe ather +ĠSim ply +ie ves +Ġdeter ior +ĠPC I +Ġst amp +Ġfl aws +Ġsh ade +ham mer +Ġpass port +Ġcont ing +am el +Ġobser vers +Ġneg lect +ĠR B +ĠBrother hood +Ġskept ical +f amily +us k +Ġemotion ally +â Ļ +ĠBet a +ason able +id ity +ĠM ul +Ġkick ing +ĠC arm +oll ah +VERT IS +ĠAt hen +Ġlad der +ĠBul let +å £ +00 01 +ĠWild life +ĠM ask +ĠN an +R ev +Ġun acceptable +leg al +Ġcrowd ed +ag i +ĠC ox +j e +Ġmor ality +Ġfu els +Ġc ables +Ġman kind +ĠCarib bean +Ġanch or +Ġby te +ĠO ften +ĠO z +Ġcraft ed +Ġhistor ian +ĠW u +Ġtow ers +ĠCitiz ens +Ġhel m +Ġcred entials +Ġsing ular +ĠJes se +Ġtack les +Ġcont empt +Ġa fore +ĠSh adows +Ġn il +Ġur gent +app le +bl ood +Ġv on +Ġoff line +Ġbreat he +Ġj umps +Ġirre levant +ox ic +om al +import ant +J im +Ġgl oves +arm ing +dep th +Ġtal ents +ook ie +ĠS B +Ġpal m +uff s +est a +IG H +Ġcan on +ĠVer izon +ĠP le +Ġcou pled +vel t +Ġfundra ising +ĠGet ting +ĠD LC +Ġmathemat ical +ĠH S +ĠCard inals +te lling +Ġspons ors +Ġ Ï +ĠBull s +op tion +Ġprop ose +Ġmem orable +Ġembr aced +Ġdecl ining +He alth +ed a +Ġ} ; +Ġsp am +m ile +Ġpit cher +ĠE ight +Ġcar ing +ut ic +ro le +Ġair line +ernand ez +ĠAth let +Ġcert ification +ux e +rig er +Ġem pir +Ġsens ation +Ġdis m +Ġb olt +Ġev olve +H ouse +Ġconsult ation +ĠD uty +Ġtou ches +ĠN athan +Ġf aint +h ad +" ( +ĠCons umer +ĠExt reme +Ġ12 7 +ĠHer m +ĠSac rament +iz oph +Ġanx ious +ul ously +Ġsoc ially +ĠU TC +Ġsol ving +ĠLet ter +Hist ory +ed uc +Pr ice +) ); +Ġrel oad +am ic +Ġp ork +Ġdisc ourse +Ġt ournaments +ai ro +ĠK ur +ĠCost a +Ġviol ating +Ġinterf ere +Ġrecre ational +uff le +Ġspe eches +Ġneed ing +Ġremem bers +Ġcred ited +n ia +f ocused +amer a +Ġb ru +um bs +ĠCub an +Ġpreced ing +Ġnons ense +ac ial +Ġsmart phones +ĠSt ories +S ports +ĠEmer gency +oun cing +ef ined +Ġb er +Ġconsult ing +Ġm asters +he astern +." [ +ĠRun ning +Ġsus cept +ĠF eng +Americ a +pr ises +st itial +ĠWeek ly +ĠGreat er +mod ules +if ter +G raphics +ul er +Ġwho lly +Ġsupp ress +Ġconce aled +Ġhapp ily +Ġaccept s +ĠEn joy +Ġr ivers +ĠEx cept +2 25 +ĠN HS +ĠMc Connell +Ġp ussy +fer red +ut able +Ġatt ain +Ġ> = +Ġdepos its +roph ic +Ġnot orious +ĠSh aw +il itation +Ġepid emic +all ic +Ġsmall est +ov ich +Ġaccess ories +per ties +Ġsur plus +ĠMe ch +Ġamb ig +ĠImm igration +Ġch im +ev al +Ġpract icing +ĠMyster y +Ġdom ains +ĠSil icon +app s +Ġkilomet ers +e a +ĠSm ash +Ġwarrant y +Ġn ost +s il +re v +J on +ĠDub lin +Ġtast es +Ġb out +g reat +er ror +Ġsw itches +ĠB apt +D O +ok i +Ġsour ced +pro du +Ġattach ment +ĠIss ue +ĠQuest ion +Jo in +Ġf itted +Ġunlaw ful +^ ^ +ere k +Ġauthent ication +Ġst ole +Ġaccount ability +l abel +S earch +Ġal beit +atic an +fund ed +ĠAdd ing +ĠI Q +Ġsub mar +l it +a que +ĠLear ning +Ġint eger +M aster +ĠCh rom +Ġprem ier +O p +ĠLi u +Ġbl essed +ĠGl obe +ĠResp onse +Ġlegit im +ĠMer kel +Ġdispos al + ´ +Ġgau ge +pe at +Ġindu ced +Ġquestion able +arth y +ĠV it +ĠF eed +U ntil +U t +worth y +R Y +ĠH erald +ĠHam mer +Ġmed al +ĠR ivers +ĠH ack +Ġclar ify +Ġtrack ed +Ġautonom ous +Ġten ant +ĠQ atar +er ie +Ġgr im +ĠMon itor +Ġresist ant +ĠSpe c +ĠWell s +N AS +14 8 +Ġmin ers +iot ics +Ġmiss es +11 6 +g ian +g it +ĠE yes +p res +Ġgrad uated +Ġang el +Ġsyn chron +Ġefficient ly +Ġtrans mitted +H arry +Ġglob ally +EN CE +ĠMont ana +r aged +ĠPre vention +Ġp iss +ĠL l +Ġshe lf +ĠB JP +ĠTest ament +ĠL ate +ik er +ĠH app +ĠJul ian +h all +Ġsp ont +Ġshut down +Ġincons istent +Ġsubscrib ers +Ġske leton +ĠNe braska +Ġins pire +ĠV oid +F eed +Ġang les +ĠSpr ings +Ġbench mark +Ġvacc ines +izoph ren +se xual +uff ed +Ġsh ine +ĠK ath +Ġgest ure +ine a +Ġr ip +Ġopp ression +Ġcons cience +b t +ĠL um +Ġinc idence +ĠF a +w r +Ġmin eral +ĠSp urs +alk y +Ġth under +Ġop io +Be ing +ĠPal m +Ġwas ted +Ġl b +i aries +ĠIniti ative +Ġcur ric +Ġmark er +ĠMc L +Ġext ensions +ĠP v +ĠAr ms +Ġoffer ings +Ġdef enses +Ġvend or +Ġcontrad ict +ĠCol in +Ġredd it +Ġper ipher +12 2 +Ġs ins +E dit +IC T +So ft +ĠSh ah +Ġadministr ator +ĠT rip +Ġporn ography +Ġtu ition +in ence +ĠPro gress +Ġcat alog +Ġsu ite +Ġh ike +Ġreprodu ctive +eng ine +Ġd rought +ĠNo ah +Ġ2 30 +Ġd ude +Ġrelax ed +Ġpart ition +Ġparticip ant +Ġtel esc +Ġfe as +ĠF F +own er +Ġswe eping +Ġl enses +Ġmatch up +ĠRe pl +ourn als +Ġcred ible +Ġgrand mother +Ġther mal +Ġsubscrib ing +Ġident ities +col m +U CT +Ġreluct ant +us ers +ĠC ort +Ġassist ed +OS S +ATION S +IS H +Ġpharm aceutical +ic able +ad ian +ĠSon ic +ĠF ury +ĠM ong +A H +ĠPsych ology +Ġph osph +Ġtreat s +Ń Ķ +Ġstead ily +ĠHell o +Ġrel ates +Ġcl ue +Ex pl +a uth +Ġrev ision +Ġe ld +os ion +Ġbr on +14 4 +ri kes +Ġmin es +Ġblank et +ĠF ail +el ed +ĠIm agine +ĠPl anned +a ic +Re quest +M ad +ĠHor se +ĠEag le +Ġcap ac +15 7 +Ġl ing +ĠN ice +ĠP arenthood +min ster +og s +ens itive +Not hing +Ġcar n +F in +ĠP E +Ġr ifles +ĠL P +S and +Ġgui Active +Ġtour ist +C NN +Ġunve iled +Ġpredec essor +} { +u ber +Ġoff shore +Ġopt ical +ĠR ot +ĠPear l +et on +Ġst ared +Ġfart her +at ility +cont in +ĠG y +ĠF oster +ĠC oc +ri ents +Ġdesign ing +ĠEconom y +ON G +W omen +ĠN ancy +er ver +Ġmas cul +Ġcasual ties +Ġ2 25 +ĠS ullivan +ĠCh oice +Ġa ster +w s +Ġhot els +Ġconsider ations +Ġcou ch +ĠSt rip +ĠG n +Ġmanip ulate +l ied +Ġsynt hetic +Ġassault ed +Ġoff enses +ĠDra ke +Ġim pe +Oct ober +ĠHer itage +h l +ĠBl air +Un like +Ġg rief +Ġ4 50 +Ġopt ed +Ġresign ation +il o +Ġver se +ĠT omb +Ġu pt +Ġa ired +ĠH ook +ĠML B +Ġassum es +out ed +ĠV ers +Ġinfer ior +Ġbund le +ĠD NS +ograp her +Ġmult ip +ĠSoul s +Ġillust rated +Ġtact ic +Ġdress ing +Ġdu o +Con f +Ġrel ent +Ġc ant +Ġscar ce +Ġcand y +ĠC F +Ġaffili ated +Ġspr int +yl an +ĠGarc ia +Ġj unk +Pr int +ex ec +C rit +Ġport rait +ir ies +ĠOF F +Ġdisp utes +W R +L ove +ãģ Ħ +ĠRe yn +Ġh ipp +op ath +Ġflo ors +ĠFe el +Ġwor ries +Ġsett lements +ĠP os +Ġmos que +Ġfin als +Ġcr ushed +ĠPro bably +ĠB ot +ĠM ans +ĠPer iod +Ġsovere ignty +Ġsell er +Ġap ost +Ġam ateur +Ġd orm +Ġconsum ing +Ġarm our +ĠRo ose +Ġint ensive +Ġelim inating +ĠSun ni +ĠAle ppo +j in +Ġadv ise +p al +ĠH alo +Ġdes cent +Ġsimpl er +Ġbo oth +ST R +L ater +ĠC ave +== = +Ġm ol +Ġf ist +Ġshot gun +su pp +Ġrob bery +E ffect +Ġobsc ure +ĠProf essional +Ġemb assy +Ġmilit ant +Ġinc arcer +Ġgener ates +Ġlaun ches +Ġadministr ators +Ġsh aft +Ġcirc ular +Ġfresh man +ĠW es +ĠJo el +ĠD rew +ĠDun can +ĠApp arently +s ight +ĠIntern al +ĠInd ividual +ĠF E +Ġb ore +ĠM t +Ġbroad ly +ĠO ptions +ount ain +ip es +ĠV ideos +20 4 +Ġh ills +Ġsim ulation +Ġdisappoint ment +it an +ĠLabor atory +Ġup ward +Ġbound ary +Ġdark er +h art +Ġdomin ance +C ong +ĠOr acle +ĠL ords +Ġscholars hip +ĠVin cent +ed e +ĠR ah +Ġencour ages +ro v +Ġqu o +Ġprem ise +ĠCris is +ĠHol ocaust +Ġrhyth m +Ġmet ric +cl ub +Ġtransport ed +Ġn od +ĠP ist +Ġancest ors +ĠFred er +th umbnails +ĠC E +ON D +Ph il +ven ge +ĠProduct s +cast le +Ġqual ifying +ĠK aren +VERTIS EMENT +Ġmight y +Ġexplan ations +Ġfix ing +D i +Ġdecl aring +Ġanonym ity +Ġju ven +ĠN ord +ĠDo om +ĠAct ually +O k +ph is +ĠDes ert +Ġ11 6 +I K +ĠF M +Ġinc omes +V EL +ok ers +Ġpe cul +Ġlight weight +g ue +Ġacc ent +Ġincre ment +ĠCh an +Ġcompl aining +ĠB aghd +Ġmidfield er +Ġover haul +Pro cess +ĠH ollow +ĠTit ans +Sm all +man uel +ĠUn ity +ĠEv ents +S ty +Ġdispro portion +n esty +en es +ĠC od +Ġdemonstr ations +ĠCrim son +ĠO H +Ġen rolled +Ġc el +ĠBre tt +Ġa ide +Ġhe els +Ġbroad band +Ġmark ing +Ġw izard +ĠN J +ĠChief s +Ġingred ient +Ġd ug +ĠSh ut +urch ase +end or +Ġfar mer +ĠGold man +12 9 +15 5 +Or der +Ġl ion +i ably +Ġst ain +ar ray +ilit ary +ĠFA Q +Ġexpl oded +ĠMcC arthy +ĠT weet +ĠG reens +ek ing +l n +ens en +Ġmotor cycle +Ġpartic le +Ġch olesterol +B ron +Ġst air +Ġox id +Ġdes irable +ib les +Ġthe or +for cing +Ġpromot ional +ov o +b oot +ĠBon us +raw ling +Ġshort age +ĠP sy +Ġrecru ited +Ġinf ants +Ġtest osterone +Ġded uct +Ġdistinct ive +Ġfirm ware +bu ilt +14 5 +Ġexpl ored +Ġfact ions +Ġv ide +Ġtatt oo +Ġfinan cially +Ġfat igue +Ġproceed ing +const itutional +Ġmis er +Ġch airs +gg ing +ipp le +Ġd ent +Ġdis reg +ç Ķ +st ant +ll o +b ps +aken ing +Ġab normal +ĠE RA +å£ « +ĠH BO +ĠM AR +Ġcon cess +Ġserv ant +Ġas pir +l av +ĠPan el +am o +Ġprec ip +Ġrecord ings +Ġproceed ed +Ġcol ony +ĠT ang +ab lo +Ġstri pped +Le ft +to o +Ġpot atoes +Ġfin est +% ). +Ġc rap +ĠZ ach +ab ases +ĠG oth +Ġbillion aire +w olf +Ġsan ction +S K +Ġlog ged +P o +ey ed +un al +Ġcr icket +Ġarm ies +Ġunc overed +Cl oud +ó n +Ġreb ounds +Ġm es +O per +P ac +Ġnation ally +Ġinsert ed +p ict +Ġgovern ance +Ð ¸ +Ġprivile ges +G ET +Ġfavor ites +im ity +Ġlo ver +the m +em pl +Ġgorge ous +An n +Ġsl ipped +Ġve to +B ob +Ġsl im +u cc +ĠF ame +udden ly +Ġden ies +ĠM aur +Ġdist ances +Ġw anna +t ar +ĠS ER +Ġâ Ī +Ġle mon +at hetic +Ġlit eral +Ġdistingu ished +Ġansw ering +G I +Ġrelig ions +ĠPhil os +ĠL ay +Ġcomp os +ire ments +ĠK os +ine z +roll ing +Ġyoung est +and ise +ĠB orn +Ġalt ar +am ina +ĠB oot +v oc +Ġdig ging +Ġpress ures +Ġl en +26 4 +Ġassass ination +ĠBir mingham +ĠMy th +Ġsovere ign +ĠArt ist +ĠPhot ograph +Ġdep icted +Ġdisp ens +orth y +Ġamb ul +int eg +ĠC ele +ĠTib et +Ġhier archy +Ġc u +Ġpre season +ĠPet erson +Ġcol ours +Ġworry ing +Ġback ers +ĠPal mer +ĠÎ ¼ +Ġcontribut or +Ġhear ings +Ġur ine +Ġ Ù +ourge ois +Sim ilar +ĠZ immer +s omething +ĠUS C +Ġstrength s +ĠF I +Ġlog ging +As ked +ĠTh ai +in qu +ĠW alt +Ġcrew s +it ism +3 01 +Ġshar ply +um ed +Ġred irect +r ators +In f +ĠWe apons +Ġte asp +19 99 +L ive +ĠEs pecially +ĠS ter +ĠVeter ans +Ġint ro +other apy +Ġmal ware +Ġbre eding +Ġmole cular +ĠR oute +ĠCom ment +oc hem +Ġa in +Se ason +Ġlineback er +Ä « +ĠEconom ics +es ar +ĠL ives +ĠEm ma +Ġk in +ĠTer rit +Ġpl anted +ot on +ĠBut ter +ĠSp ons +P ER +Ġdun geon +Ġsymb olic +Ġfil med +Ġdi ets +Ġconclud es +Ġcertain ty +ĠForm at +Ġstr angers +form at +ĠPh ase +Ġcop ied +Ġmet res +ld a +ĠUs ers +Ġdeliber ate +Ġwas hed +ĠL ance +im ation +Ġimpro per +ĠGen esis +ick r +ĠK ush +Ġreal ise +Ġembarrass ing +alk ing +b ucks +Ġver ified +Ġout line +year s +ĠIn come +20 2 +Ġz ombies +F inal +ĠMill enn +Ġmod ifications +ĠV ision +ĠM oses +ver b +iter ranean +ĠJ et +Ġnav al +ĠA gg +Ġur l +Ġvict ories +Ġnon etheless +Ġinj ust +ĠF act +ç ļ +Ġins ufficient +re view +face book +Ġnegoti ating +Ġguarant ees +im en +uten berg +Ġg ambling +Ġcon gr +Load ing +Ġnever theless +Ġpres idents +ĠIndust rial +Ġ11 8 +Ġp oured +ĠT ory +Ġ17 5 +Ġ: = +Sc ott +ange red +T ok +Ġorgan izers +M at +ĠG rowth +Ġad ul +Ġens ures +Ġ11 7 +é¾į å +Ġmass acre +Ġgr ades +be fore +AD VERTISEMENT +ĠSl ow +ĠM MA +âĢĶ " +ĠV atican +Q aeda +Ġo we +66 66 +ĠS orry +ĠGr ass +Ġbackground s +Ġexha usted +Ġcl an +Ġcomprom ised +ĠE lf +ĠIsa ac +ens on +In vest +IF A +Ġinterrupt ed +ãĥī ãĥ© +Ġtw isted +ĠDrag ons +M ode +ĠK remlin +Ġfert il +he res +ph an +ĠN ode +f ed +ĠOr c +Ġunw illing +C ent +Ġprior it +Ġgrad uates +Ġsubject ive +Ġiss uing +ĠL t +Ġview er +Ġw oke +Th us +bro ok +Ġdep ressed +Ġbr acket +ĠG or +ĠFight ing +Ġstri ker +Rep ort +ĠPortug al +Ġne o +w ed +19 9 +Ġflee ing +sh adow +ident ified +US E +Ste am +Ġstret ched +Ġrevel ations +art ed +ĠD w +Ġalign ment +est on +ĠJ ared +S ep +Ġblog s +up date +g om +r isk +Ġcl ash +ĠH our +Ġrun time +Ġunw anted +Ġsc am +Ġr ack +Ġen light +on est +ĠF err +Ġconv ictions +Ġp iano +Ġcirc ulation +ĠW elcome +Ġback lash +ĠW ade +Ġrece ivers +ot ive +J eff +Ġnetwork ing +ĠPre p +ĠExpl orer +Ġlect ure +Ġupload ed +ĠMe at +B LE +ĠNaz is +ĠSy nd +st ud +ro ots +ri ans +Ġportray ed +Ġ ?? +ĠBudd ha +s un +Rober t +ĠCom plex +Ġover see +Ġste alth +T itle +ĠJ obs +ĠK um +Ġappreci ation +ĠM OD +Ġbas ics +Ġcl ips +Ġnurs ing +Ġpropos ition +Ġreal ised +ĠNY C +Ġall ocated +ri um +ar an +ĠPro duction +ĠV ote +Ġsm ugg +Ġhun ter +az er +ĠCh anges +Ġfl uct +y on +Ar ray +Ġk its +W ater +Ġuncom mon +Ġrest ing +ell s +w ould +Ġpurs ued +Ġassert ion +omet own +ĠMos ul +ĠPl atform +io let +Ġshare holders +Ġtra ils +P ay +ĠEn forcement +ty pes +ĠAn onymous +Ġsatisf ying +il ogy +Ġ( ' +w ave +c ity +Ste ve +Ġconfront ation +ĠE ld +C apt +ah an +ht m +ĠC trl +ON S +2 30 +if a +hold ing +Ġdelic ate +Ġj aw +ĠGo ing +or um +S al +Ġd ull +ĠB eth +Ġpr isons +Ġe go +ĠEl sa +avor ite +ĠG ang +ĠN uclear +Ġsp ider +ats u +Ġsam pling +Ġabsor bed +ĠPh arm +iet h +Ġbuck et +ĠRec omm +O F +ĠF actory +AN CE +Ġb acter +H as +ĠObs erv +12 1 +Ġprem iere +De velop +Ġcur rencies +C ast +Ġaccompany ing +ĠNash ville +Ġfat ty +ĠBre nd +Ġloc ks +Ġcent ered +ĠU T +augh s +or ie +ĠAff ordable +v ance +D L +em et +Ġthr one +ĠBlu etooth +Ġn aming +if ts +AD E +Ġcorrect ed +Ġprompt ly +ĠST R +Ġgen ome +Ġcop e +Ġval ley +Ġround ed +ĠK end +al ion +p ers +Ġtour ism +Ġst ark +v l +Ġblow ing +ĠSche dule +st d +Ġunh appy +Ġlit igation +ced es +Ġand roid +Ġinteg ral +ere rs +ud ed +t ax +Ġre iter +ĠMot ors +oci ated +Ġwond ers +ĠAp ost +uck ing +ĠRoose velt +f ram +Ġyield s +Ġconstit utes +aw k +Int erest +Ġinter im +Ġbreak through +ĠC her +Ġpro sec +ĠD j +ĠM T +Res p +ĠP T +Ġs perm +ed it +B T +Lin ux +count ry +le ague +Ġd ick +Ġo ct +Ġinsert ing +Ġsc ra +ĠBrew ing +Ġ19 66 +Ġrun ners +Ġpl un +id y +ĠD ian +Ġdys function +Ġex clusion +Ġdis gr +Ġincorpor ate +Ġrecon c +Ġnom inated +ĠAr cher +d raw +achel or +Ġwrit ings +Ġshall ow +Ġh ast +ĠB MW +ĠR S +Ġth igh +Ġ19 63 +Ġl amb +Ġfav ored +ag le +Ġcool er +ĠH ours +ĠG U +ĠOrig in +Ġglim pse +---------------- ---- +L im +Ġche ek +Ġj ealous +- ' +Ġhar ness +ĠPo ison +Ġdis abilities +ne apolis +Ġout look +Ġnot ify +ĠIndian apolis +Ġab rupt +ns ic +Ġenc rypted +Ġfor fe +reat h +Ġr abb +Ġfound ations +Ġcompl iment +ĠInter view +ĠS we +Ġad olesc +Ġmon itors +ĠSacrament o +Ġtime ly +Ġcontem pl +Ġposition ed +Ġpost ers +ph ies +iov ascular +v oid +ĠFif th +Ġinvestig ative +OU N +Ġinteg rate +ĠIN C +ish a +ibl ings +ĠRe quest +ĠRodrig uez +Ġsl ides +ĠD X +Ġfemin ism +Ġdat as +Ġb end +ir us +ĠNig eria +F ox +Ch ange +Ġair plane +ĠLad en +Ġpublic ity +ixt y +Ġcommit ments +Ġaggreg ate +Ġdisplay ing +ĠAr row +Ġ12 2 +Ġrespect s +and roid +s ix +ĠSh a +Ġrest oration +) \ +W S +oy s +Ġillust rate +with out +12 6 +ĠâĶ Ĥ +Ġpick up +n els +Ġ .... +f ood +ĠF en +) ? +Ġphenomen a +Ġcompan ions +ĠW rite +Ġsp ill +Ġbr idges +ĠUp dated +ĠF o +Ġinsect s +ASH INGTON +Ġsc are +il tr +ĠZh ang +Ġsever ity +Ġind ul +14 9 +ĠCo ffee +Ġnorm s +Ġp ulse +ĠF T +Ġhorr ific +ĠDest roy +ĠJ SON +Ġo live +Ġdiscuss es +R est +E lect +ĠW inn +ĠSurv iv +ĠH ait +S ure +op ed +Ġro oted +ĠS ke +ĠBron ze +Ġl ol +Def ault +Ġcommod ity +red ited +Ġliber tarian +Ġforb idden +Ġgr an +à ¨ +Ġl ag +en z +dri ve +Ġmathemat ics +Ġw ires +Ġcrit ically +Ġcarb ohyd +ĠChance llor +ĠEd die +Ġban ning +ĠF ri +Ġcompl ications +et ric +ĠBangl adesh +Ġband width +St op +ĠOrig inally +Ġhalf way +yn asty +sh ine +Ġt ales +rit ies +av ier +Ġspin ning +ĠWH O +Ġneighbour hood +b ach +Ġcommer ce +ĠS le +B U +Ġentreprene ur +Ġpecul iar +ĠCom ments +f re +3 20 +IC S +Ġimag ery +ĠCan on +ĠElect ronic +sh ort +( ( +D ig +Ġcomm em +u ced +Ġincl ined +ĠSum mon +Ġcl iff +ĠMed iterranean +Ġpo etry +Ġprosper ity +ĠRe ce +Ġp ills +m ember +Ġfin ale +un c +ĠG ig +ä ½ +Ġl od +Ġback ward +- + +ĠFor ward +Ġth ri +s ure +Ġso ap +ĠF X +R ES +ĠSe xual +oul os +Ġfool ish +Ġright eous +Ġco ff +terror ism +ust ain +ot er +Ġab uses +ne xt +Ġab usive +Ġthere after +Ġprohib ition +ĠS UP +Ġd ip +Ġr ipped +Ġinher ited +Ġb ats +st ru +G T +Ġflaw ed +ph abet +Ġf og +do ors +Ġim aging +Ġdig its +ĠHung ary +Ġar rog +Ġteach ings +Ġprotocol s +ĠB anks +à ¸ +p ound +ĠC urt +." ) +. / +Ġex emption +end ix +ĠM ull +Ġimpro ves +ĠG amer +d imensional +I con +ĠMarg aret +St atus +d ates +Ġint ends +Ġdep ict +Ġpark ed +J oe +ĠMar ines +chn ology +! ). +Ġjud ged +Ġwe ights +R ay +Ġapart ments +he ster +Ġrein force +Ġoff ender +occ up +Ġs ore +e pt +ĠPH P +ĠB row +Ġauthor ization +ĠR isk +ĠDel aware +ĠQ U +Ġnot ifications +Ġsun light +Ġex clude +d at +Ġm esh +ĠSud an +Ġbelong ed +Ġsub way +Ġno on +ĠInter ior +ol ics +ĠL akers +Ġc oding +Dis claimer +Cal if +O ld +Ġdis l +???? ? +Ġconfir ms +Ġrecruit ment +Ġhom icide +Cons ider +ĠJeff rey +ft y +} ; +Ġobject ion +do ing +ĠLe o +W ant +Ġgl ow +ĠClar ke +ĠNorm an +Ġver ification +Ġpack et +ĠForm ula +Ġpl ag +es ville +Ġshout ing +Ġo v +ĠR EC +ĠB ub +Ġn inth +Ġener g +Ġvalid ity +Ġup s +j ack +Ġneighbor ing +ĠN ec +ew orks +ĠH ab +are z +Ġsp ine +Ġevent ual +ĠLe aders +ĠC arn +Ġprob ation +Ġrom ance +ms g +ĠMechan ical +ER Y +R ock +Ġpart isan +N ode +ass ets +min ent +Ġforeign ers +Ġtest ify +ĠUs ually +l ords +ĠG ren +ĠPow ell +BI L +Ġs r +Ġadd ict +Ġshell s +Ġs igh +ĠY ale +tern ity +Ġ7 50 +E U +ĠR ifle +Ġpat ron +em a +ĠB annon +an ity +Ġtrop ical +ĠV II +c ross +Every thing +ĠIS O +Ġhum ble +ass ing +ĠF IG +Ġupd ating +ys on +Ġcal cium +Ġcompet ent +Ġste ering +Pro t +ĠS Y +ĠFin als +ĠR ug +15 9 +13 7 +ĠG olf +Ġ12 6 +Ġaccommod ation +ĠHug hes +Ġaest hetic +art isan +ĠTw ilight +Ġpr ince +ĠAgric ulture +ĠDis co +Ġpreced ent +Ġtyp ing +author ized +O ption +ĠA ub +l ishes +ach t +m ag +P eter +ĠU FO +mont on +ĠL ith +Ġa rom +Ġsec uring +Ġconf ined +priv ate +Ġsw ords +Ġmark ers +Ġmetab olic +se lect +ĠCur se +ĠO t +g ressive +Ġinc umb +ĠS aga +Ġpr iced +Ġclear ance +Cont ent +Ġdr illing +Ġnot ices +Ġb ourgeois +Ġv est +Ġcook ie +ĠGuard ians +ry s +in yl +Ġ12 4 +Ġpl ausible +on gh +ĠOd in +Ġconcept ion +ĠY uk +ĠBaghd ad +ĠFl ag +Aust ral +ĠI BM +Ġintern ationally +ĠWiki Leaks +I ED +Ġc yn +Ġcho oses +ĠP ill +Ġcomb ining +Ġrad i +ĠMoh ammed +def ense +atch ing +Sub ject +ic iency +Fr ame +Ġ{ " +Ġche ss +Ġtim er +19 0 +Ġt in +Ġord inance +emet ery +Ġacc using +Ġnotice able +Ġcent res +Ġl id +ĠM ills +img ur +Ġz oom +erg ic +Ġcomp ression +pr im +f ind +Ġsur g +Ġp and +ĠK ee +ĠCh ad +cell ence +oy le +Ġsocial ism +ĠT ravis +ĠM Hz +Ġgu ild +ALL Y +ĠSub scribe +ĠRel ated +Ġoccur rence +itch ing +Ġfict ional +Ġcr ush +ĠE A +c od +m ix +ĠTri ple +Ġretrie ve +Ġstimul us +Ġpsych iat +ĠDo or +Ġhomosexual ity +Ġelement ary +Ġcell ular +id ian +ĠL aun +Ġintrig uing +Ġfo am +ĠB ass +id i +its u +Ġass ure +Ġcongr at +Ġbusiness man +ĠBo ost +cl ose +Ġl ied +Ġsc iences +ĠO mega +ĠG raphics +Ġ< = +sp oken +Ġconnect ivity +S aturday +ĠAven gers +Ġto ggle +Ġank le +Ġnational ist +mod el +ĠP ool +ophob ia +V ar +ĠM ons +ator ies +Ġaggress ively +C lear +For ge +act ers +Ġhed ge +Ġpip es +Ġbl unt +Ġs q +Ġremote ly +W ed +as ers +Ġref riger +Ġt iles +Ġresc ued +Ġcompr ised +ins ky +Ġman if +avan augh +Ġprol ifer +Ġal igned +x ml +Ġtri v +Ġcoord ination +ĠP ER +ĠQu ote +13 4 +b f +ĠS aw +Ġtermin ation +Ġ19 0 +Ġadd itions +Ġtri o +Ġproject ions +Ġpositive ly +Ġin clusive +Ġmem br +19 90 +old er +Ġpract iced +ink le +Ar ch +Ġstar ters +ari us +Ġinter mediate +ĠBen ef +ĠK iller +Ġinter ventions +ĠK il +ĠF lying +In v +Ġprem ature +Ġpsych iatric +Ġind ie +Ġcoll ar +ĠRain bow +af i +Ġdis ruption +ĠFO X +cast ing +Ġmis dem +c ro +Ġw ipe +ard on +Ġb ast +ĠTom my +ĠRepresent ative +Ġbell y +ĠP O +ĠBre itbart +13 2 +Ġmess aging +Sh ould +Ref erences +ĠG RE +ist ical +L P +ĠC av +ĠC razy +Ġintu itive +ke eping +ĠM oss +Ġdiscont in +ĠMod ule +Ġun related +ĠPract ice +ĠTrans port +Ġstatist ically +orn s +Ġs ized +p u +Ġca f +ĠWorld s +ĠRod gers +ĠL un +ĠCom ic +l iving +Ġc ared +Ġclim bed +) { +Ġconsist ed +Ġmed ieval +fol k +Ġh acked +Ġd ire +ĠHerm ione +Ġt ended +ce ans +D aniel +w ent +Ġlegisl ators +Ġred es +g ames +Ġg n +am iliar +Ġ+ + +gg y +th reat +Ġmag net +Ġper ceive +Ġz ip +Ġindict ment +Ġcrit ique +g ard +ĠSaf e +ĠC ream +Ġad vent +ob a +Ġv owed +ous ands +Ġsk i +Ġabort ions +u art +Ġstun ned +Ġadv ancing +Ġlack ed +Ġ\ " +Ġsch izophren +Ġeleg ant +Ġconf erences +Ġcance led +ĠHud son +ĠHop efully +Ġtr ump +Ġfrequ encies +Ġmet eor +ĠJun ior +ĠFle et +ĠMal colm +ĠT ools +Ġ ........ +Ġh obby +ĠEurope ans +Ġ15 00 +ĠInt o +Ġs way +ĠApp ro +ĠCom pl +Comm unity +Ġt ide +ĠSum mit +ä » +Ġinter vals +ĠE ther +Ġhabit at +ĠSteven s +lish ing +ĠDom ain +Ġtrig gers +Ġch asing +Ġchar m +ĠFl ower +it ored +Ġbless ing +Ġtext ures +F ive +Ġliqu or +R P +F IN +Ġ19 62 +C AR +Un known +Ġres il +ĠL ily +Ġabund ance +Ġpredict able +r ar +Ġbull shit +le en +che t +M or +M uch +ä ¹ +Ġemphas ized +Ġcr ust +Ġprim itive +Ġenjoy able +ĠPict ures +Ġteam mate +pl er +ĠT ol +ĠK ane +Ġsummon ed +th y +ram a +ĠH onda +Ġreal izing +Ġquick er +Ġconcent rate +cle ar +Ġ2 10 +ĠErd ogan +ar is +Ġrespond s +ĠB I +Ġelig ibility +Ġpus hes +ĠId aho +Ġagg rav +Ġru ins +ur ations +Ġb ans +Ġan at +sh are +Ġgr ind +h in +um en +Ġut ilities +ĠYan kees +Ġdat abases +ĠD D +Ġdispl aced +Ġdepend encies +Ġstim ulation +h un +h ouses +ĠP retty +ĠRaven s +ĠTOD AY +Ġassoci ates +Ġthe rape +cl ed +Ġde er +Ġrep airs +rent ice +Ġrecept ors +Ġrem ed +ĠC e +Ġmar riages +Ġball ots +ĠSold ier +Ġhilar ious +op l +13 8 +Ġinherent ly +Ġignor ant +Ġb ounce +ĠE aster +REL ATED +ĠCur rency +E V +ãĥ ŀ +ĠLe ad +Ġdece ased +B rien +ĠMus k +J S +Ġmer ge +heart ed +c reat +m itt +m und +ĠâĢ ĭ +ĠB ag +Ġproject ion +Ġj ava +ĠStand ards +ĠLeon ard +Ġcoc onut +ĠPop ulation +Ġtra ject +Ġimp ly +Ġcur iosity +ĠD B +ĠF resh +ĠP or +Ġheav ier +ne ys +gom ery +Ġdes erved +Ġphr ases +ĠG C +Ġye ast +d esc +De ath +Ġreb oot +Ġmet adata +IC AL +Ġrep ay +ĠInd ependence +Ġsubur ban +ical s +Ġat op +Ġall ocation +gener ation +ĠG ram +Ġmoist ure +Ġp ine +ĠLiber als +Ġa ides +Ġund erest +ĠBer ry +Ġcere mon +3 70 +ast rous +ĠPir ates +Ġt ense +ĠIndust ries +ĠApp eals +ĠN ear +Ġè£ı ç +Ġlo vers +ĠC AP +ĠC raw +Ġg iants +Ġeffic acy +E lement +ĠBeh avior +ĠToy ota +Ġint est +P riv +A I +Ġmaneu ver +Ġperfect ion +Ġb ang +p aper +r ill +Ge orge +b order +in ters +ĠS eth +Ġcl ues +ĠLe vi +ĠRe venue +14 7 +Ġv apor +Ġfortun ate +Ġthreat ens +Ġve t +Ġdepend ency +ers ed +art icle +ĠBl izzard +Ġch lor +Ġmin us +ĠB ills +Ġcryptoc urrency +Ġmetabol ism +ter ing +Ġp estic +step s +ĠTre asure +ract ed +ĠConst ant +Ġtem p +13 9 +ĠDet ective +ur ally +Ġrecover ing +Ġcort ex +Ġ14 4 +cl osed +Ġprejud ice +aun ted +Ġstorm s +ĠN OW +Ġmach inery +Add ress +Ġcompe lled +27 0 +Ġdesp air +b ane +Ġveget able +Ġbed s +Lear n +Ġcolor ful +Ġsp ike +Ġmarg ins +Ġsymp athy +Ġworks hop +ĠC BC +S at +Ġburn s +ĠG ender +Ġ12 9 +ĠC able +Ġdeb ts +ĠThe resa +Ġreflect ing +Ġa irst +Ġr im +ram id +Ġweakness es +W rit +ogg le +t i +ĠCh arge +Ġwe ighed +Ġ( . +Ġl aughter +Ġrou ter +ĠDemocr acy +D ear +Ġhas ht +Ġd y +Ġhint s +run ning +Ġfin ishes +ar us +M ass +res ult +asc us +Ġv intage +Ġcon qu +Ġwild ly +ac ist +Ġl ingu +Ġprot agonist +st rom +te enth +ĠSol o +m ac +f illed +Ġre nown +it ives +Ġmot ive +ĠAnt ar +ĠM ann +ĠAd just +Ġrock ets +Ġtrou bling +e i +Ġorgan isms +ass is +Christ ian +Ġ14 5 +ĠH ass +Ġsw all +Ġw ax +ĠSurv ival +V S +ĠM urd +v d +stand ard +Ġdrag ons +Ġacceler ation +r ational +f inal +Ġp aired +ĠE thereum +Ġinterf aces +Ġres ent +Ġartif acts +Å « +are l +Ġcompet itor +ĠNich olas +ĠSur face +c pp +ĠT ot +Ġeconom ically +Ġorgan ised +Ġen forced +in ho +Ġvar ieties +Ġab dom +ĠBa iley +id av +ĠSal v +p aid +Ġalt itude +ess ert +ĠG utenberg +are a +op oulos +Ġprofess ors +igg s +ĠF ate +he y +Ġ3 000 +D ist +Ġtw ins +c ill +ĠM aps +Ġtra ps +Ġwe ed +ĠK iss +Ġy oga +Ġrecip ients +ĠWest minster +Ġpool s +ĠWal mart +18 8 +ĠSchool s +att ack +ĠAR M +par agraph +W arning +j l +Ġself ish +anche z +ĠHe ights +F re +ĠS oph +Ġ -------------------------------- +t ml +33 3 +Ġraid s +Ġsatell ites +KE Y +Ġlast s +Ñ Ĥ +In s +ĠD ame +Ġunp redict +// / +gh ai +Ġart illery +Ġcru ise +Ġg el +ĠCabin et +Ġbl ows +ĠE sp +Ġprox imity +ot he +ĠSk ills +ĠU pper +ob o +ĠN DP +Ġenjoy s +Ġrepe ating +ĠConst ruction +ĠQuest ions +H illary +Ġu int +Ġprocess ors +ĠGib son +ĠMult iple +q a +ĠB om +ĠM iles +vent ional +Ġhur ts +s kin +ĠA IDS +Ġadvis ers +ĠR oot +Ġmethod ology +ĠD ale +Ġdet on +ĠKnow ledge +sequ ently +Ġ12 1 +Ġconnect s +C y +ĠD anger +Ġcontribut ors +ĠB ent +Ġbr ass +ĠGun s +int o +ĠFort une +Ġbro ker +bal ance +Ġlength s +Ġv ic +Ġaver aging +Ġappropri ately +ĠCamer a +Ġsand wich +ĠCD C +Ġcoord inate +Ġnav ig +Ġgood ness +l aim +Ġbra ke +Ġextrem ist +ĠW ake +ĠM end +ĠT iny +ĠC OL +ĠR F +ĠD ual +ĠW ine +C ase +Ġref ined +Ġl amp +L ead +Ġb apt +ĠCar b +ĠS add +ĠMin neapolis +PD F +Ear ly +ĠH idden +I ts +ĠT IME +Ġp ap +Ġcommission ed +ĠF ew +ĠCol ts +ĠB ren +Ġbot hered +Ġlike wise +Ex per +ĠSch w +c ry +n n +ĠM itch +im on +M G +b m +UM P +r ays +Ġregist ry +Ġ2 70 +ach ine +re lla +ant ing +00 000 +Ġru ined +sp ot +Ġt a +Ġmaxim ize +Ġincon ven +D ead +H uman +En abled +ĠMar ie +Ġch ill +ĠParad ise +Ġstar ring +ĠLat ino +ĠProt ocol +ĠE VER +Ġsuppl iers +m essage +ĠBro ck +Ġser um +âĸĪâĸĪ âĸĪâĸĪ +Ġen comp +Ġamb ition +ues e +Ġar rows +And rew +Ġanten na +Ġ19 61 +ĠB ark +Ġb ool +ãĤ ª +ĠSt orage +Ġrail way +Ġtoug her +ĠC ad +Ġwas hing +P y +' ] +em bed +ĠMem phis +ack le +Ġfam ously +ĠF ortunately +ov ies +Ġmind set +Ġsne ak +ĠD h +RA W +ĠSim pson +Ġliv est +Ġland mark +Ġc ement +L ow +Ġthr illed +ĠCour se +in el +Ġch uck +id ate +gl obal +Ġwh it +Ġ � +ad ays +s ki +ĠS V +Ġvir uses +30 6 +ĠResp ons +Ġthe aters +ĠBr anch +ĠGene va +ĠM K +Ġunbel iev +Ġcommun ist +Orig inal +ĠRe ceived +ĠTrans fer +ĠAr g +In put +ĠStr ategy +Ġpal ace +the ning +D ri +Ġsent encing +umbn ail +Ġp ins +re cy +Ġs iblings +Get ting +ĠB U +ĠNorth west +Ġprolong ed +ĠSak ura +C omb +ĠB our +Ġinadequ ate +ĠK ash +Ġus ername +ĠImpro ve +Ġbatt ling +ĠM AC +Ġcurric ulum +Ġs oda +ĠC annon +Ġsens ible +sp ons +De cember +Ġw icked +ĠP engu +Ġdict ators +ĠHe arts +og yn +Ġsimilar ities +ĠSt ats +Ġh ollow +it ations +": [ +Ġh over +ĠList en +s ch +S und +Ġc ad +ĠPar ks +Ġl ur +Ġhy pe +ĠL em +N AME +is ure +Fr iday +Ġshoot s +Ġclos es +Ġd b +ĠR idge +ĠDiff erent +Ġrepl ies +ĠBroad way +op ers +Ġint oler +ĠZe us +akes pe +Ġpropri etary +Ġrequest ing +Ġcontro llers +ĠM IN +im edia +be cca +Ġexp ans +Ġoil s +B ot +ĠCh and +Ġpr inter +Ġto pped +ĠP OL +ĠEar lier +S ocial +av in +Ġdecre ases +ĠSe b +Ġspecific ations +ĠBl ast +ĠK urt +Ġfre el +B rown +Ġdil ig +ro e +ĠPro blem +ĠQu ad +Ġdecent ral +ĠV ector +an ut +Ġplug ins +ĠGreg ory +Ġfuck ed +el ines +ĠAmb assador +t ake +Ġcle ans +ong yang +An onymous +st ro +" } +al ine +ĠO dd +ĠE ug +2 16 +Ġbo il +ĠP owers +Ġnurs es +Ob viously +ĠTechn ical +Ġexceed ed +OR S +Ġextrem ists +Ġtr aces +ex pl +Ġcom r +ĠS ach +) / +Ġm asks +Ġsc i +B on +Ġreg ression +we gian +Ġadvis or +it ures +ĠV o +ex ample +ĠInst ruct +Ġs iege +Ġredu ctions +pt r +Ġstat utory +Ġrem oves +Ġp uck +red its +Ġbe e +Ġsal ad +Ġpromot ions +ĠJosh ua +with standing +ET H +ĠCh a +im us +Ġexpend iture +aun ting +Ġdelight ed +Ġ15 5 +be h +Ġcar pet +ĠSp art +Ġj ungle +l ists +Ġbull ying +ĠNob el +ĠGl en +Ġreferen ced +Ġintrodu ces +se in +Ġcho pped +gl ass +ĠW rest +Ġneutral ity +Ġâ Ļ +Ġinvestig ator +Ġshel ves +Ġun constitutional +Ġreprodu ction +Ġmer chant +m ia +Ġmet rics +Ġexplos ives +ĠSon ia +Ġbod ily +Ġthick ness +Ġpredomin antly +ĠAb ility +Ġmon itored +IC H +Ġ] . +ĠMart inez +Ġvis ibility +Ġqu eries +Ġgen ocide +ĠWar fare +Qu ery +Ġstud ios +Ġemb ry +Ġcorrid or +Ġclean ed +com plete +ĠM H +Ġenroll ment +ING S +Ġimpact ed +Ġdis astrous +ĠY un +ĠCl aire +ĠBas ically +y t +uster ity +Ġindirect ly +w ik +Ġd od +ĠCar r +Ġam p +Ġprohib it +ĠIn itial +ĠR d +ij i +Ġeduc ate +c orn +i ott +ĠBeaut y +Ġdetect ive +ĠCon n +s ince +Ġst agger +Ġob ese +Ġb ree +olog ic +is se +walk er +Ġbl ades +Ġlaw ful +fun c +ĠBeh ind +Ġappet ite +Ġ( * +Ġt ennis +Ġoff spring +Ġj ets +Ġstruct ured +Ġafore mentioned +N ov +Ġsc aling +f ill +Ġst ew +Ġcur b +ĠStep han +ed In +S F +ob ic +é ŃĶ +ou g +ĠM M +Ġgen etically +ope z +13 6 +Ġu mb +anc ers +Ġcoh ort +Ġmerch andise +Ġimp osing +ĠLegisl ature +ĠArch ive +iv ia +ĠN aval +Ġoff ences +Ġmir acle +Ġsn apped +Ġf oes +Ġextensive ly +ĠR af +Ġc ater +ed ience +K it +ĠB in +Ġrecomm ends +ĠC ities +Ġrig id +ĠRE AD +ĠNob le +ĠT ian +Ġcertific ates +ant is +o iler +ĠBudd hist +d id +Ġsurvey ed +Ġdown ward +Ġprint s +ĠMot ion +ron ics +ĠS ans +oss ibly +u ctions +Ġcolon ies +ĠDan ish +un it +Ġsp oil +Ġadvis ory +ber ries +Pl an +Ġspecific ation +op hers +ĠRes ource +Ġsh irts +prising ly +commun ications +Ġtriv ial +Ġmention ing +ise xual +Ġsupp lements +Ġsuper vision +B P +v or +Ġw it +Ġco oldown +Ġplaint iff +ĠReview s +ĠS ri +ĠM int +ĠSug ar +Ġafter ward +ĠPri est +ĠInvest ment +og ene +ĠT aking +Ġstretch ing +Ġinflamm ation +ĠTe hran +Ġl ining +Ġfree zing +ĠEnt ity +Ġins piring +spe cial +pr ice +Ġsu e +ĠP orter +oun ge +ET A +ĠD erek +ĠLu is +u o +ym ph +Ġex terior +ih il +ĠAsh ley +in ator +Ġnut rients +ĠTh rones +Ġfin ances +ĠIn spect +Ġspe cially +ĠRequ ired +ĠP TS +ĠViol ence +oint ed +sh ots +Ġex cerpt +co on +IN S +ĠG ri +Ġrecogn ised +We ek +You ng +Ġv om +is le +ĠCur ry +ĠBudd h +Ġnot ebook +Ġd urable +/ ? +ĠG ad +ĠP upp +Ġforg ive +p ark +Ġpersonal ities +an alysis +cl amation +Ġelev ator +Ġware house +ĠR ole +un n +Ġillust ration +ĠSc an +Ġatmosp heric +Im port +AN C +rict ed +f u +01 0 +Ġar che +Ġreward ed +akespe are +Ġintern ally +ĠR BI +alk er +Ġeleph ant +ow itz +ĠP izza +Ġbip artisan +é s +Ġslow ed +ĠSt ark +Ġover ride +OU S +Ġ3 20 +undred s +ĠDe ck +ĠC ensus +be e +14 6 +ot or +Ġ ip +Ġu b +oc ations +ĠBut ton +r ice +Ġc ripp +ff f +Ġorig inated +Ġoverwhel med +app a +Ġfore most +âĢ ij +ĠL EG +re lease +eat ured +at ches +Ġre ps +Ġl ending +ĠRe ference +ĠCl ient +16 5 +vent h +Com plete +ĠPat rol +Ġsw orn +c am +Ġshut tle +ĠR alph +Ġh ometown +- , +on al +ĠB P +å ı +Ġpersu ade +ĠAlex and +Ġcomb ines +Ġv ivid +ĠL ag +Ġenc oding +Ġsal vation +w en +ĠRec overy +i ya +Un iversity +ĠB iden +Ġbud gets +ĠTex ans +f its +Ġhon ored +Ġp ython +T D +## # +cl one +Ġbl ink +ĠL iquid +Ġunemploy ed +Ġcl ashes +ĠCoun sel +Ġdirect ing +Ġpun ct +ĠFal cons +Ġsh ark +ĠDam ascus +Ġje ans +Ġemb ark +Ġse ize +Ġup wards +2 80 +ĠE z +ĠAny thing +Ġex otic +l ower +ĠCreat or +ĠU m +Ġsubur bs +ber ger +ĠW end +Ġm int +ĠX X +ĠD ro +Ġsuff ers +Ġher b +t ree +Ġfrag ile +Ġflood ed +ĠAl cohol +ole an +ny der +ĠK O +F ram +Ġ13 6 +Ġow ed +ĠMe lee +ĠH ash +Ġwh isk +Ġsu do +r r +Qu ick +app ro +Ġi i +ĠEx amples +he e +Ġpromot es +per ature +k ar +ĠHon or +Ġs odium +ĠL if +ros so +intend ent +Ġcorrespond ent +F ound +sec ret +Ġident ifies +ag ne +Ġl ou +ĠP P +Ġcoinc idence +m ove +Ġmilit ia +Ġinf iltr +ĠPrim ary +Ġpitch ing +ĠI b +ĠGO OD +ãĤ ¸ +ĠW izards +ir al +ĠVen us +R R +ĠâĢ ķ +ĠCase y +Ġsad ly +Ġadm ire +Ġembarrass ed +c b +M el +Ġtub es +Ġbeaut ifully +ĠQueens land +Bel ow +re z +qu et +ple asant +Ġ « +C amp +Ġdec isive +19 98 +ĠL amb +ut ton +h n +ĠJ agu +au nder +ĠC ord +Ġcl erk +Ġca ffe +Ġwip ed +Ġre im +ĠMount ains +Ġimprison ed +Ġdevelop s +ĠP ra +Ġmodel ing +Any one +ance l +ĠS it +Ġshield s +Ġl awn +Ġcard iovascular +Ġdemonstr ating +Ġpar se +ĠIsrael is +Ġeuro s +14 3 +Ġgl orious +ins ki +ec d +Ġcondition ing +Ġhel pless +Ġmicro sc +ĠHar bor +Ġst akes +Ġ2 60 +Ġun equ +ĠFl oyd +Ġd amp +Ġappar atus +ĠLaw s +Ġcoun ters +Ġindu ce +at able +ĠAh med +Ġsl am +N ovember +Ġpers ist +Ġim minent +á n +Ġsh red +Ġph ases +ĠEd monton +ĠArm strong +ĠMe et +ĠK itty +Ñ Ģ +c irc +ĠAd ult +Ġa rose +ĠX en +D an +g ow +Ġsuper f +ĠAd mir +Ġend ure +Ġkey word +yr us +Ġy arn +Ġpath way +ĠHop kins +mid t +Ġcens orship +d ependent +Ġinstruct or +S ources +Ġto e +Ġball oon +N ob +Ġsw ear +ĠCast ro +Ġgl oss +ĠK avanaugh +Ġremark ably +Ph otos +ĠN om +ĠS outheast +y ers +Ġvalid ation +Ġcann on +ĠVict ory +ĠPier re +Ġcaut ious +Aud io +Ġf etch +ĠG ift +ĠH yp +Ġrem edy +Z E +Ġsc ent +Ġbe ard +ĠR ut +- " +Ġpat ents +H y +Ġun just +Ġpot ato +Ġforth coming +Ġche f +ĠR ift +aff e +ĠR OM +ĠL aunch +Ġp ads +ĠNe o +Ġon set +Ġsquee ze +s afe +Ġpref ix +ĠT M +ĠN early +ĠClin ical +ĠM ental +ot iation +ĠUn ic +ant ry +ĠC ir +Ġep it +à ¦ +Ġextract ed +verse ly +ri ad +Ġstr ains +Ġto ps +Ġpo em +ĠRand y +ĠMap le +TH ER +up iter +ĠSS D +ļ é +Ġun con +per ing +Ġsle pt +in ers +Ġunder water +ĠEv idence +g one +20 5 +Ġhistor ians +Ġsynt hesis +Ġf rog +b asketball +Ġvibr ant +Ġsub ord +Ġ3 65 +ĠD ial +Ġcooper ate +HA HA +Ġgreet ed +15 8 +Ġj azz +Ġinto x +ĠWalk ing +Ġsuper visor +ĠF usion +ĠMer cedes +s end +H am +s d +n l +Ġtour s +ĠF IFA +Ġcul p +g d +30 4 +Ġple as +Ġillust rates +ĠColomb ia +Ġhighlight ing +ĠSum mary +Ġexp osing +ĠD ru +Ġir ony +r itional +ĠCar roll +ĠEll is +P ict +ĠR apt +Ġad apter +Ġun m +Ġcor pse +Ġceleb rities +D en +at um +ĠAp ocalypse +ĠW ag +lin ing +Ġhorm ones +R ub +ĠX i +ĠV aults +20 8 +alky rie +inos aur +Ġfeed s +v ity +Ġdefe ating +W ait +Ġemphas ize +ĠSteel ers +yr inth +le ys +ĠWhe never +Current ly +ĠCl ock +Ġcollect ively +any on +ĠJ P +Ġment ality +Ġdownload s +Ġsurround ings +ĠBarn es +Ġflags hip +Ġindic ators +Ġgra pp +Jan uary +ĠElement al +ĠAthen a +ib al +Ġs ights +Ġcap ita +ĠTreat y +Ġvo iced +ĠG az +let te +Ġy a +Ġexp ired +Leg end +H ot +n ature +Ġunst able +Ġ2 80 +à º +Com ment +AL E +Ġquest s +Ġhand ler +n is +Ġvers atile +Ġconce al +enge ance +ĠInter active +Ġobs essed +ĠDog s +Ġcr acked +S ound +s v +ĠD ylan +ro ads +f x +ĠCath olics +ĠH ag +Ġsl ammed +Ġgl owing +s ale +Ġtiss ues +ĠCh i +ne e +Ġc her +s ic +ur rection +Ġb acon +ul atory +) ." +Ġir regular +FOR M +ass ed +Ġintention al +Ġcompens ate +ĠSpe aking +ĠS ets +15 3 +Ġconvent ions +b ands +em ade +Ġe cc +ĠWin ston +ĠAssass in +ĠBelg ian +Ġdepend ence +Ġnic he +Ġb ark +ĠJ azz +Ġdisadvant age +Ġgas oline +Ġ16 5 +çļ Ħ +ess a +mod ule +ang ular +O Y +ĠTreat ment +it as +ol ation +ĠArn old +Ġfe ud +ĠN est +Ġthe atre +ew ater +Ġmin ors +olic y +ĠH aven +div ision +Ġtr unk +F ar +ĠP ull +Ġcapt uring +Ġ18 00 +ĠTe en +Ġex empl +Ġclin ics +ĠB urg +Ġsubst it +Ġpay load +ĠL av +ĠT roy +ĠW itness +Ġfrag ments +Ġpass words +Ġg ospel +ĠG in +Ġten ants +ol ith +S ix +Pre vious +ĠAg es +ĠDar win +Ġbl at +Ġem pathy +sm ith +b ag +ĠE cho +ĠC amb +ĠM add +ĠB oo +Ġred e +ĠBurn ing +Ġsmooth ly +ĠAd rian +ĠV ampire +ĠMon sters +ste am +Sty le +M a +re a +ĠD war +aly st +urs or +Ġelim ination +Ġcrypt o +ch t +ĠE ternal +âĢ¦ ] +ĠS orce +I ll +N ER +Ġu h +Con clusion +w age +Ġresp ir +Ġrem inis +het ical +Ġg y +Ġutil ized +ic idal +Ġ19 00 +Ġhun ters +ĠSw an +ĠRe act +Ġvis itor +ĠThanks giving +30 8 +Post s +Ġh ips +19 97 +om ers +Ġkn ocking +ĠVeh icle +Ġt il +Ġ13 8 +Ġm i +ĠInvest igation +ĠKen ya +Ġcas ino +Ġmot ives +Ġreg ain +re x +Ġweek ends +Ġstab bed +bor o +Ġexplo ited +ĠHA VE +ĠTe levision +c ock +Ġprepar ations +Ġende av +ĠRem ote +ĠM aker +ĠPro du +ĠEv an +Ġinform ational +ĠLouis ville +15 4 +ĠDream s +Ġpl ots +ĠRun ner +Ġhur ting +Ġacad emy +ĠMont gomery +n m +ĠL anc +ĠAl z +2 10 +el ong +Ġretail er +Ġar ising +Ġrebell ion +Ġbl onde +play ed +Ġinstrument al +C ross +Ġret ention +Ġtherape utic +Ġse as +Ġinfant ry +ĠCl int +Ġprompt ing +Ġbit ch +Ġst ems +ĠK ra +Ġthe sis +ĠB og +ru ed +Ġk ings +Ġcl ay +ific ent +ĠY ES +ĠTh ing +ĠCub s +vey ard +els h +in arily +ĠE y +ĠRoll ing +Ġev olving +Ind ia +Ġrecogn izes +Ġgrad uation +is ers +Ġfert ility +ĠMil an +Comm and +Ġbox ing +Ġ19 43 +Ġgl uten +ĠEm ir +Ġid ol +Ġcon ceived +ĠCre ation +Mer it +udd y +uss ions +ĠLie utenant +iet al +Ġunch anged +ĠSc ale +ĠCrime a +ball s +ator ial +Ġdepth s +Ġempir ical +Ġtrans m +Ġuns afe +miss ible +com fort +15 6 +Ġmechan ic +00 2 +l ins +Ġsm oked +P os +Ġslow ing +Ġl av +Tex as +Ġche ating +ĠMet ropolitan +eth yl +Ġdiscover ing +as se +Ġpen cil +ĠPy ongyang +Ġclos et +ĠShe et +ĠEnt ry +ou stic +Ġmy st +er ate +ari at +Ġminer als +Ġmusic ian +ĠP ul +ĠM az +24 9 +Ġper missions +Ġ iv +en ary +ick ers +ĠB ing +he a +en able +Ġgri ev +Ġassert ed +ĠColon el +Ġaff idav +w o +Ġse ated +ĠR ide +Ġpaint ings +ĠP ix +Ġ13 7 +ish i +umb ai +g otten +ĠEar l +Ġin ning +Ġc ensus +Ġtrave lled +ĠCons ult +18 5 +b ind +Ġsimpl icity +Ġoverlook ed +ĠHelp ful +Ġmon key +Ġoverwhelming ly +Bl ood +ĠFl int +ĠJ ama +ĠPres ent +ĠR age +ĠT A +pt ive +Ġturn out +w ald +ĠD olphins +ĠV PN +Ġon ion +Ġcraft ing +m ma +ĠMerc ury +Ġarr ange +Ġalert s +ĠO T +zb ollah +Ġg ases +ĠRichards on +s al +l ar +Ġfro st +Ġlower ing +Ġacc laim +Ġstart ups +ĠG ain +ess ment +Ġguard ian +äº º +ĠP ie +ĠL inks +Ġmer its +Ġaw ake +Ġparent al +Ġexceed s +Ġid le +ĠPil ot +Ġe Bay +ĠAc cept +ipe g +C am +ĠK ot +Ġtrad ers +olit ics +unk er +ĠP ale +os i +an mar +Ġ19 47 +ĠF ell +est ial +it ating +G F +ĠS r +if ted +Ġconnect or +ĠB one +ill es +2 60 +h ma +Ġoverl ap +ĠGit Hub +Ġclean er +ĠBapt ist +ĠW AS +Ġlung s +Ñ ģ +ĠB UT +Ġc ite +Ġpit ched +reat ment +Ġtro phies +ĠN u +38 6 +ĠPr ide +Ġattend ees +[ ] +17 9 +Ġspat ial +Ġpri zes +ĠRel igion +Ġshow case +ĠC ategory +vid ia +T arget +Pro perty +? , +Ġf usion +p ie +ĠU CLA +Ġsound track +Ġprin cess +ĠC aval +sh ould +Ġlim bs +Back ground +Ġlone ly +Ġc ores +ĠT ail +she et +Ġ13 2 +R a +ãĤ « +ĠB olt +Ġbook ed +Ġadmin ister +Ġequ als +w y +Ġobserv ing +ĠBar on +ĠAd obe +Ġv irgin +ĠSocial ist +M ove +gh azi +ĠLind a +2 12 +Ġbre wing +Ġmerch ants +bur se +Ġdiv or +Ġmet als +ĠN er +Ġsum s +ĠEn emy +Ġen vision +Ġgrant ing +ĠH oney +ĠSk yrim +Ġsoc io +gr aded +Ġselect ive +W ASHINGTON +Ġ19 48 +ĠSir ius +ĠG ross +act ivity +ĠI van +Ġfur ious +BS D +ĠPre vious +Ġrespons ive +Ġchar itable +Ġle aning +ĠP ew +Ġviol ates +\\\\ \\\\ +ĠCom ing +w ire +Ġpo et +Ġres olutions +comm and +ĠPortug uese +Ġnick name +Ġde af +Feb ruary +Ġrecogn ise +Ġentire ty +Ġseason al +pl aced +ĠTe legraph +Ġmicro phone +our ing +Ġgr ains +Ġgovern ed +Ġpost p +ĠW aters +in ement +Ġund ocumented +ĠCom cast +Ġf ox +Ġassault s +re on +man y +ĠJen kins +ĠAny way +Ġassess ments +Ġdown s +ĠM ouse +Ġsuper b +k t +ĠD ow +Ġtax ation +4 01 +Ġsm iles +Ġundert aken +Ġex h +Ġenthusi astic +Ġtw ent +Ġgovernment al +Ġautonom y +ĠTechn ologies +ĠCh ain +Ġpreval ent +f b +Ġnic otine +og ram +j ob +Ġawa iting +ĠMen u +Ġdep uties +k ov +ish ops +But ton +ĠShan ghai +Ġdies el +ĠD uck +R yan +ĠPC s +N F +j ury +ent e +Ġinacc urate +edd y +Wh atever +Ġshow c +ĠN ad +od us +et r +Ġplaint iffs +ĠW OR +ĠAss ange +Ġpriv at +Ġpremium s +Ġt am +UR L +Ġel ites +ĠR anger +otten ham +ĠH off +ĠAt hens +Ġdefin ite +Ġs ighed +Ġeven ly +2 11 +ĠAm ber +ak ia +Ġmail ing +Ġcr ashing +ĠConfeder ate +ru gged +W al +ĠDep ths +Ġjuven ile +Ġreact or +Introdu ction +ĠDel uxe +19 95 +ĠS anchez +ĠM ead +iv able +: - +ĠPlan ning +ĠT rap +qu in +ĠProt ect +ve red +In formation +Ġkid ney +inn amon +l as +Ġpolic ing +Ġtoler ate +ĠQ i +Ġbi ased +F ort +ĠK i +s ave +Ġprivile ged +Ġbe asts +ĠGl as +ĠC inem +Ġcome back +Sund ay +Ġext inction +h ops +Ġtrans mit +Ġdoub les +ĠFl at +16 7 +Ġdis puted +Ġinjust ice +f oo +V ict +role um +ĠJul ie +Con text +ĠR arity +iss ue +Comp onent +Ġcounsel ing +an ne +d ark +Ġobject ions +u ilt +Ġg ast +Ġpl ac +Ġun used +ãĥ ĩ +ĠT rial +ĠJ as +hed ral +ob b +Ġtempor al +ĠPR O +ĠN W +ĠAnn iversary +L arge +Ġther m +Ġd avid +Ġsystem ic +ĠSh ir +m ut +ĠNe pt +add ress +Ġscan ning +Ġunderstand able +Ġcan vas +C at +ĠZ oo +Ġang els +L O +ĠStat ement +ĠS ig +ov able +ĠA way +sh aring +ocr ats +st ated +Ġweigh ing +N or +w ild +B ey +Ġaston ishing +ĠReyn olds +Ġop ener +Ġtrain er +Ġsurg ical +p n +Ġadjust ing +whe el +Ġf rown +erv ative +Ġsusp end +With in +te in +Ġobst acle +Ġliber ties +ym es +Ġur anium +ans om +an ol +ub a +ĠL oss +Ġa rous +ĠHend erson +W ow +s pl +c ur +ĠÂ Ń +Ġtheir s +Dam age +Ġdownload ing +Ġdisc ern +ĠSt o +ĠFl a +Ġh ath +ĠA j +Ġun pleasant +Europe an +exp ensive +Ġscreens hot +ĠU V +Ġall ied +ĠPers ian +Ġmonop oly +Ġat om +ĠReds kins +"> < +Ġcan cell +Ġcinem a +13 1 +f air +ĠAlf red +Ġd uck +arg s +22 3 +ĠIS I +Ġsign aling +in ar +Ġlaugh s +Ġfor wards +Ġreck less +Ġlisten ers +at ivity +Ġvast ly +n ant +L ess +ĠHun ting +ĠScient ific +IT ED +Ġkn ight +ĠH TC +us a +t mp +Ġr ude +ĠLegend ary +Ġar ises +B ad +ĠCl aim +pe g +Ġreal ities +Th ink +Ġ ° +Ġro de +Ġstri ve +Ġan ecd +Ġshort s +Ġhypot hes +Ġcoord inated +ĠGand hi +ĠF PS +R ED +Ġsuscept ible +Ġshr ink +ĠCh art +Hel p +Ġ ion +de ep +rib es +ĠK ai +ĠCustom er +Sum mary +Ġc ough +w ife +Ġl end +Ġposition ing +Ġlot tery +ĠC anyon +Ġf ade +Ġbron ze +ĠKenn y +Ġbo asts +ĠEnh anced +rec ord +Ġemer gence +Ġa kin +ĠB ert +it ous +âĸ ij +Ġst ip +Ġexch anged +om ore +als h +Ġreserv oir +Ġstand point +W M +Ġiniti ate +Ġdec ay +Ġbrew ery +Ġter ribly +Ġmort al +lev ard +Ġrev is +N I +el o +Ġconf ess +ĠMS NBC +Ġsub missions +Cont roller +Ġ20 2 +ĠR uth +} ); +ĠAz ure +Ġ ." +20 6 +ĠMarket ing +Ġl aund +ien cies +Ġrenown ed +ĠT rou +ĠN GO +ble ms +Ġterr ified +Ġwar ns +Ġper t +Ġuns ure +4 80 +ale z +ult z +ĠOut side +Ġst yl +ĠUnder ground +Ġp anc +Ġd ictionary +Ġf oe +rim inal +ĠNor wegian +Ġj ailed +Ġm aternal +é e +ĠLu cy +c op +Ch o +Ġuns igned +ĠZe lda +ĠIns ider +ĠContin ued +Ġ13 3 +ĠNar uto +ĠMajor ity +16 9 +ĠW o +ãĤ ĵ +Ġpast or +Ġinform al +Ð ½ +an throp +jo in +ãģ Ĺ +it ational +N P +ĠWrit ing +f n +ĠB ever +19 5 +Ġy elling +Ġdr astically +Ġe ject +Ġne ut +Ġth rive +ĠFre qu +ou x +Ġpossess es +ĠSen ators +ĠD ES +ĠSh akespeare +ĠFran co +ĠL B +uch i +Ġinc arn +Ġfound ers +F unction +Ġbright ness +ĠB T +Ġwh ale +ĠThe ater +m ass +ĠD oll +S omething +Ġecho ed +ĠHe x +c rit +af ia +Ġgodd ess +Ġele ven +ĠPre view +ĠAur ora +Ġ4 01 +uls ive +ĠLog an +in burgh +ĠCent ers +ĠON LY +ĠA id +Ġparad ox +Ġh urd +ĠL C +D ue +c ourt +Ġoff ended +Ġeval uating +ĠMatthew s +Ġto mb +Ġpay roll +Ġextra ction +ĠH ands +if i +Ġsuper natural +ĠCOM M +] = +dog s +Ġ5 12 +ĠMe eting +Rich ard +ĠMax imum +Ġide als +Th ings +m and +ĠReg ardless +Ġhum ili +b uffer +L ittle +ĠD ani +ĠN ak +Ġliber ation +ĠA be +ĠO L +Ġstuff ed +ac a +ind a +raph ic +Ġmos qu +Ġcampaign ing +Ġoccup y +S qu +r ina +ĠW el +ĠV S +Ġphys ic +Ġp uls +r int +oad ed +ET F +ĠArch ives +Ġven ues +h ner +ĠTur bo +Ġl ust +Ġappeal ed +que z +il ib +ĠTim othy +Ġo mn +d ro +Ġobs ession +ĠSav age +19 96 +Gl obal +J es +2 14 +Ġsl iding +Ġdisapp ro +ĠMag ical +Ġvolunt arily +g b +ane y +Ġprop het +ĠRe in +ĠJul ia +ĠW orth +aur us +Ġb ounds +ie u +)) ) +Ġcro re +ĠCitiz en +S ky +Ġcolumn ist +Ġseek ers +ond o +IS A +ĠL ength +Ġnost alg +Ġnew com +Ġdet rim +ent ric +3 75 +ĠG E +Ġaut op +Ġacadem ics +App Data +ĠS hen +Ġid iot +ĠTrans it +Ġteasp oon +W il +K O +ĠCom edy +> , +Ġpop ulated +W D +Ġp igs +ĠO culus +Ġsymp athetic +Ġmar athon +19 8 +Ġseiz ure +s ided +Ġd op +irt ual +L and +ĠFl oor +osa urs +... ] +Ġl os +Ġsubsid iary +E Y +ĠPart s +ĠSt ef +ĠJud iciary +Ġ13 4 +Ġmir rors +Ġk et +t imes +Ġneuro log +Ġc av +ĠGu est +Ġtum or +sc ill +ĠLl oyd +E st +Ġcle arer +Ġstere otypes +Ġd ur +not hing +Red dit +Ġnegoti ated +---------------- -------- +23 5 +Ġfl own +ĠSe oul +ĠRes ident +ĠS CH +Ġdisappear ance +ĠV ince +g rown +Ġgrab s +r il +ĠInf inite +ĠTw enty +Ġpedest rian +Ġjer sey +ĠF ur +ĠInf inity +ĠEll iott +Ġment or +Ġmor ally +Ġob ey +sec ure +iff e +Ġantib iotics +ang led +ĠFre eman +ĠIntrodu ction +J un +Ġm arsh +ic ans +ĠEV ENTS +och ond +W all +icult y +Ġmisdem eanor +Ġl y +Th omas +ĠRes olution +Ġanim ations +ĠD ry +Ġinter course +ĠNew castle +ĠH og +ĠEqu ipment +17 7 +Ġterrit orial +Ġarch ives +20 3 +Fil ter +ĠMun ich +Ġcommand ed +ĠW and +Ġpit ches +ĠCro at +Ġrat ios +ĠM its +Ġaccum ulated +ĠSpecific ally +Ġgentle man +acer b +Ġp enn +Ġa ka +ĠF uk +Ġinterven e +ĠRef uge +ĠAlz heimer +Ġsuccess ion +oh an +d oes +L ord +Ġsepar at +Ġcorrespond ence +Ġsh iny +P rior +Ġs ulf +Ġmiser able +Ġded ication +( ). +Ġspecial ists +Ġdefect s +ĠC ult +ĠX ia +Ġje opard +ĠO re +Ab ility +Ġle ar +Ġamb itions +ĠB MI +ĠArab s +Ġ19 42 +Ġpres ervation +ific ate +Ġash amed +l oss +ĠRest aur +Ġrese mble +Ġen rich +ĠK N +ĠCl an +fl oat +Ġplay able +IT T +Ġharm ony +arr ison +ĠWe instein +w ere +Ġpoison ing +ĠCom put +ĠWord Press +m ajor +ĠVal ve +F an +ĠTh row +ĠRom ans +ĠDep ression +ad os +Ġtort ured +Ġbal ancing +bott om +Ġacqu iring +ĠMon te +ard i +Ġa ura +Ġ# # +ĠStand ing +ĠAtl as +C F +Ġintr ins +ĠBen ghazi +Ġcamp ing +Ġt apped +bl ade +st rous +ĠR abb +ĠW ritten +t ip +ĠNe igh +ster dam +ĠAll ow +ĠHe aling +ĠR hod +n um +Ġcaffe ine +ĠPer cent +Ġbo o +Ġapp les +30 5 +Ġwel coming +Ġappl aud +Ġa usterity + ± +ĠRe ality +ef e +å ® +Ġsu cks +Ġtab s +ĠPay Pal +Ġback pack +Ġgif ted +abul ary +ĠSc out +ir teen +Ġch in +Ġo mitted +Ġnegative ly +Ġaccess ing +ĠE arn +Ġambul ance +Ġhead phones +Ġ20 5 +ĠRef resh +p resident +ĠKit chen +ĠEnt ered +ĠS nyder +00 5 +om ical +Ġborrow ed +ĠN em +Ġav iation +Ġst all +rim ination +Ġuniform s +it ime +ĠSim mons +ener gy +ab lished +y y +qual ified +Ġrall ies +ĠSt uart +fl ight +Ġgang s +r ag +Ġv ault +lu x +ĠCom par +Ġdesign ation +20 9 +ĠJ os +d ollar +z ero +Ġwell s +30 3 +Ġconstitu ents +Ġhe ck +Ġc ows +Ġcommand ers +Ġdifferent ial +ĠC atherine +29 9 +Ġval ve +Ġbr ace +Ġperspect ives +c ert +f act +icular ly +ĠMc N +pl anes +Ġint ric +Ġpe as +ov an +Ġtoss ed +ret ch +ĠL opez +Ġunf amiliar +de ath +ĠA part +ĠCh ang +Ġrelie ved +rop he +Ġair ports +Ġfre ak +ut il +M ill +ĠCh in +ĠOw en +m ale +ĠBro ken +ĠWind s +ro b +r ising +Ġfire fighters +Ġauthor itarian +Ġ14 8 +Bit coin +ex ternal +Ġbrow sers +iche ver +or ian +Ġun b +Ġpo ke +ĠZ ot +M id +ĠPop ular +Ġco vert +Ġcont ributes +Ġ6 50 +Ġcont ention +G ate +Ġcons oles +Ġchrom os +ĠI X +Ġvis ually +ĠE isen +Ġjewel ry +Ġdeleg ation +Ġacceler ate +ĠR iley +Ġsl ope +Ġind oor +it ially +Ġhuge ly +Ġtun nels +Ġfin ed +Ġdirect ive +Ġfore head +ustom ed +Ġsk ate +Mus ic +g as +Ġrecogn izing +am bo +Ġover weight +ĠGr ade +Ù Ĭ +Ġsound ing +Ġlock ing +ĠR EM +St ore +Ġexc av +ĠLike wise +ĠL ights +Ġel bow +ĠSupp ly +w ic +Ġhands ome +19 94 +C oll +Ġadequ ately +ĠAssoci ate +Ġstri ps +Ġcrack down +Ġmar vel +ĠK un +Ġpass ages +@@ @@ +ĠT all +Ġthought ful +names e +Ġprost itution +bus iness +Ġball istic +person al +c ig +iz ational +R ound +ĠÂłĠÂł ĠÂłĠÂł +ĠCole man +Ġadm itting +ĠPl ug +Ġbit coins +ĠSu z +Ġfair ness +Ġsupp lier +Ġcatast rophic +ĠHel en +o qu +M arc +ĠArt icles +g ie +Ġend angered +Ġdest iny +ĠVol t +ol ia +ax is +Ġche at +Ġun ified +IC O +qu ote +30 2 +ĠS ed +Ġsupp ression +Ġanaly zing +Ġsqu at +Ġfig uring +Ġcoordin ates +Ġch unks +Ġ19 46 +Ġsub p +Ġw iki +ĠFor bes +ĠJ upiter +ĠE rik +im er +ĠCom mercial +\ ) +Ġlegitim acy +Ġd ental +ĠMe an +Ġdefic its +5 50 +Orig inally +ĠHor ror +Ġcontam ination +ll ah +Ġconf isc +ĠCl are +T B +ĠF ailed +an ed +Ġrul er +ĠCont roller +Ġfemin ists +F ix +g ay +20 7 +Ġr abbit +Th ird +ownt own +Ġgl ue +Ġvol atile +Ġsh ining +Ġf oll +Ġimp aired +Ġsup ers +æ Ī +Ġcl utch +ļé ĨĴ +Ġpro let +Ġ( ! +Ġy elled +ĠK iev +ĠEr n +ĠSh ock +K B +Ġsit uated +qu ery +ĠN as +Ġan nex +char acter +ĠHol iday +Ġautom ation +ĠJ ill +ĠRem astered +Ġl inem +Ġwild erness +ĠHor izon +ĠGu inea +A Z +Ġmain land +Ġsec recy +LE ASE +Ġp unk +ĠProv ince +( ), +Spe ed +Ġhand ing +ĠSeb ast +S ir +r ase +Ġj ournals +Ġcon gest +ĠT ut +ir rel +Ġschizophren ia +Ġmis ogyn +health y +I ron +Ġreact ed +- $ +25 2 +Ġpl ural +Ġpl um +Ġbarg ain +Ġground ed +f inder +Ġdis se +ĠL az +O OD +Ġat roc +F actory +Ġmin ions +Ġo ri +ĠB rave +ĠP RE +ĠMy anmar +ĠH od +Ġexped ition +Ġexpl ode +ĠCo ord +Ġext r +ĠB rief +ĠAD HD +Ġhard core +feed ing +Ġd ile +ĠF ruit +Ġvacc ination +ĠM ao +osp here +Ġcont ests +- | +Ġf ren +isp here +R om +ĠSh arp +ĠTre nd +Ġdis connect +âĢ¢ âĢ¢ +Ġper secution +Ear th +Ġhealth ier +38 4 +Ġc ob +ĠTr inity +OW S +AN N +Ġspecial ty +Ġg ru +Ġcooper ative +wh y +Start ing +ĠIss ues +st re +ens or +Ġ18 5 +Ad v +! ? +ĠRe vel +em ia +ĠH ulk +Ġcelebr ations +ĠS ou +ra ud +ĠKle in +Ġun real +con text +Ġpartners hips +Ġadop ting +t ical +Ġspl ash +ĠHe zbollah +c ategory +cycl op +xt on +ĠD ot +urd y +t z +Ġenvelop e +ĠN L +â ķ +Ġwhere in +Spe c +18 4 +Ġte lev +al iation +Ġmyth s +å ° +Ġrig orous +Ġcommun icating +Ġobser ver +Ġre he +ĠW ash +Ġapolog ized +ĠT in +Ġexpend itures +work ers +d ocument +Ġhes itate +ĠLen in +Ġunpredict able +Ġrenew al +cl er +ok ia +ĠCON T +Ġpost season +Tok ens +Ġex acerb +Ġbet ting +Ġ14 7 +Ġelev ation +W ood +ĠSol omon +19 4 +00 4 +out put +Ġredu nd +ĠM umbai +Ġp H +Ġreprodu ce +ĠD uration +MA X +Ġb og +C BS +ĠBal ance +ĠS gt +ĠRec ent +Ġc d +Ġpo pped +Ġincomp et +pro p +ay an +g uy +Pac ific +Ġty r +Ġ{ { +ĠMy stic +ĠD ana +Ġmast urb +Ġge ometry +à ¢ +ĠCor rect +Ġtraject ory +Ġdistract ed +Ġf oo +ĠW elsh +L uc +m ith +Ġrug by +Ġrespir atory +Ġtri angle +Ġ2 15 +Ġunder graduate +ĠSuper ior +ch anging +_ - +Ġright ly +Ġrefere e +Ġluc rative +Ġun authorized +Ġresemb les +ĠGN U +ĠDer by +Ġpath ways +ĠL ed +Ġend urance +Ġst int +Ġcollect or +F ast +Ġd ots +Ġnational s +ĠSec urities +Ġwh ip +Par am +Ġlearn s +M agic +Ġdetail ing +m oon +Ġbroadcast ing +Ġb aked +26 5 +hol m +ĠS ah +ĠHus sein +ĠCourt esy +17 4 +Ġ14 6 +Ġge ographic +pe ace +Ġjud ging +ĠS tern +B ur +Ġstory line +G un +ĠSt ick +24 5 +30 7 +ãĤ´ ãĥ³ +ĠAdminist rator +Ġbur nt +Ġp ave +ch oes +Ex ec +Ġcamp uses +Res ult +Ġmut ations +ĠCh arter +Ġcapt ures +Ġcomp ares +Ġbad ge +S cient +Ġer ad +ier y +o i +ett es +ĠE state +Ġst rap +Ġproud ly +Ġf ried +Ġwithd rawn +ĠV oy +ph ony +It ems +ĠP ierce +b ard +Ġann otation +ant on +ill on +Im pro +... ) +Ġhapp ier +---- -- +ad just +Ġstaff ers +Ġactiv ism +Ġper f +Ġal right +N eed +Ġcomm ence +Ġopio id +ĠAm anda +E s +ĠP ars +ĠK aw +W orks +24 8 +Ġind o +t c +end ant +ĠM oto +Ġlegal ization +OT E +Ġtask ed +Ġt sp +ĠACT IONS +16 6 +Ġrefres hing +ĠN R +ĠPere z +Ġinfring ement +S Y +List en +in ning +k u +Ġrot ate +pro gram +ar ah +Des ign +Ġ( £ +Ġst oring +Ġwar rants +Ġjud gement +ĠB rist +us ually +ph oto +ĠR an +ĠP ine +Ġoutrage ous +ĠValent ine +lu ence +ĠEvery body +Al tern +Ġrele vance +Ġtermin ated +Ġd essert +Ġfulf illed +Ġprosecut ed +ĠW ords +Ġm igrant +Ġcultiv ation +ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ +idel ity +ĠV ern +ĠLog in +Ġmetaph or +ĠT ip +Ġrecru its +ĠP ig +rib ing +Ġenthusi asts +ex per +Ġfright ening +ĠH air +ans on +str ate +Ġh i +He ight +Ġown ing +n one +Ġdis like +Ġkn ives +pher d +Ġloud ly +ĠAP Is +Dis play +ĠL ac +ĠUS S +ab l +ver ages +J ew +Ġ17 2 +ĠHist orical +at oon +ĠPhys ics +in tern +Ġwarm th +Ġto pp +D M +Ġgun man +Ġem peror +od i +ãĥ £ +in atory +ĠR ib +Ġ13 1 +ĠSat urn +ĠSh ining +Ġw aking +Qu otes +Ġcomed ian +en berg + ½ +Ġbelie vers +Ġpaper work +c ustom +Ġle v +Ġl ament +Ġpour ing +22 2 +p olitical +ĠSupp lement +m aid +Ġcruel ty +Ġt read +ys ics +A w +rit es +Ġmod ifier +ĠP osition +Ad am +l b +ub s +Ġimper fect +Ġcl usters +ĠEngine er +ĠC herry +Ġinaug uration +ĠS au +Ġembod iment +ĠUn cle +Ġover r +Ġexplos ions +c ule +ĠPrinc eton +ĠAndre a +Ġincorrect ly +Ġearn est +Ġpil gr +ĠS print +Ġslee ve +Ġhe ars +ĠAm azing +Ġbrow sing +ag in +Ġhom eland +Ġha w +Ġd iving +ist ered +17 8 +Ġbarg aining +ĠArc ade +Ġdeleg ate +ters on +................................ ................................ +ĠJackson ville +27 5 +Ġst agn +Ġad am +ĠSher man +C B +Ġsub urb +ĠFood s +Ġconver ting +ĠAr ist +Ġch ambers +l ove +Ġam ino +ĠG an +Ġmad ness +m c +ĠUS E +def ined +Ġul tr +ind ust +Ġw olves +l ance +Add itionally +Ġcr acks +as ia +ĠRe ason +ĠP ump +Ġaccident al +ĠL aser +ĠR id +Ġinitial ized +ell i +Ġun named +Ġn oun +ĠPass ed +Ġhost age +ĠEth iop +sh irts +Ġun rel +ĠEmb assy +Ġ19 41 +Ġat oms +Ġpur ported +16 4 +ĠF i +Ġgall ons +ĠMon ica +Ġp g +en ment +Ġsort ed +ĠG ospel +Ġhe ights +Ġtr aced +Ġunder going +She ll +Ġs acks +Ġproport ions +Ġhall uc +F ont +ac et +Ġwar mer +ĠIN TER +Ġgrab bing +Pl ug +Ġreal ization +ĠBur ke +Ġen chant +AT ER +ĠSe ed +Ġabund ant +F M +Ġc ivic +V s +is i +Ġv ow +Ġre per +ĠPartners hip +Ġpenet ration +Ġax e +Ġsh attered +ĠZ ombies +Ġv inyl +ĠAl ert +e on +Ġoblig ed +ĠIll ust +ĠPl aza +ĠFront ier +Ġdavid jl +ĠSer ial +ĠH av +ĠNut rition +B i +Ġâĸ Ī +ĠJ ays +lin ux +Ġhur ry +Ġv oy +Ġhop eless +ĠSte alth +Ġ ãģ +ess ors +tt le +b org +ĠSaf ari +f ell +Ġw ary +d ue +ĠAb ove +H a +E LL +Ġnot or +ĠW on +T oo +Ġoccup ations +Ġposs essions +Ġinv iting +Ġpred ators +Ġacceler ated +Ġ15 7 +uter te +ĠC ube +e ast +acc ount +G ive +Ġtrans plant +red ients +id able +Ġscreens hots +ĠG und +ĠF S +Ġtravel ers +Ġsens ory +ĠF iat +ĠRock ets +İ ĭ +_ { +F riend +Ġchar ming +AL S +Ġenjoy ment +m ph +Ġ5 000 +ĠRE G +Ù Ĩ +b ia +Ġcomp ilation +ro st +ĠV P +ĠSch ne +201 9 +Ġcop ying +M ORE +ĠFl ore +f alls +2 15 +t otal +Ġdis ciples +d ouble +Ġexceed ing +Ġsm ashed +Ġconcept ual +ĠRom ania +ĠB rent +ĠI CE +ĠT ou +Ġg rap +Ġn ails +18 9 +ãĥ ĺ +Ġproc ure +e ur +Ġconfir ming +ĠC ec +aw i +ĠEd en +Ġn g +Ġengine ered +at ics +Ġhook ed +Ġdisgust ing +ĠMur der +ãĤ ¿ +L ibrary +Ġ16 8 +Al most +hem atic +Men u +ĠNot re +ĠJ ur +Ġkidn apped +Ġhack er +ĠJ ade +Ġcreep y +Ġdraw ings +ĠSpons or +Ġcycl ists +ĠGob lin +Ġoptim ized +Ġst aged +ĠMc D +bet ween +A ge +en o +S ex +ĠW ide +n ings +av is +Ġincap able +ĠK ob +Ġreward ing +ĠL one +oles cent +Ġcontract ed +Ġstick y +J ose +B all +f est +ĠIn put +ĠRec ently +Ġto mat +squ are +App lication +Ġnit rogen +Ġdupl icate +ĠRec on +ĠD ear +L ondon +Ġint ra +Ġd ock +Ġout reach +ĠM illion +Ġmamm als +am pton +V AL +Ġsn aps +Ġd os +ĠWh ole +ĠRead y +T ry +ĠWinn ipeg +ear ance +Ġinc urred +ren ched +ĠNS W +il ot +rain e +Ġc ube +g ot +Ġrun way +etermin ed +ĠHaw ks +Ġsurviv or +ĠW ish +ĠD in +ĠDE F +ĠV ault +18 7 +Ġmush rooms +Ġcris p +be y +ĠDisco very +Ġdevelopment al +Ġparad igm +Ġcha otic +ĠT su +Ġ3 33 +b ons +Ġbacter ial +Ġcomm its +Ġcos mic +Ġme ga +oc ative +ĠP aint +ophob ic +Ġv ain +Ġcar ved +ĠTh ief +ĠG ul +ows hip +Ġc ites +ĠEd inburgh +Ġdimin ished +Ġacknowled ges +ĠK ills +Ġmic row +ĠHer a +Ġsen iors +Ġwhere by +H op +at ron +Ġun available +ĠN ate +Ġ4 80 +Ġsl ated +ĠRe becca +ĠB attery +Ġgram mar +Ġhead set +Ġcurs or +Ġex cluding +any e +aunder ing +eb in +Ġfeas ible +ĠPub lishing +ĠLab s +ĠCl iff +ĠFerr ari +Ġp ac +vis ible +mark ed +pe ll +Ġpol ite +Ġstagger ing +ĠGal actic +Ġsuper st +Ġpar an +ĠOffic ers +ãĢ ģ +Ġspecific s +ul us +23 9 +ĠP aste +AM P +ĠPan ama +ĠDe lete +angu ard +rest rial +Ġhero ic +ĠD y +ا ÙĦ +Ġincumb ent +Ġcr unch +t ro +Ġsc oop +Ġblog ger +Ġsell ers +ure n +Ġmedic ines +ĠC aps +ĠAnim ation +ox y +Ġout ward +Ġinqu iries +22 9 +Ġpsych ologist +ĠS ask +ev il +Ġcontam inated +ãĤ ¨ +he rence +Ġbrand ed +ĠAbd ul +z h +Ġparagraph s +Ġmin s +Ġcor related +er b +Ġimp art +Ġmil estone +ĠSol utions +ot le +Ġunder cover +Ġmar ched +ĠCharg ers +f ax +ĠSec rets +Ġr uth +we ather +Ġfemin ine +Ġsh am +Ġprest igious +igg ins +Ġs ung +hist ory +ett le +gg ie +Ġout dated +ol and +Ġper ceptions +ĠS ession +ĠDod gers +u j +ĠE ND +D oc +Ġdefic iency +Gr and +ĠJ oker +Ġretro spect +Ġdiagn ostic +Ġharm less +Ġro gue +ĠA val +E qu +Ġtrans c +ĠRoberts on +ĠDep ending +ĠBurn s +iv o +Ġhost ility +F eatures +ĵ ĺ +Ġdis comfort +ĠL CD +spec ified +ĠEx pect +3 40 +Ġimper ative +ĠReg ular +Ch inese +Ġstate wide +Ġsy mm +Ġlo ops +Ġaut umn +N ick +Ġsh aping +Ġqu ot +Ġc herry +ĠCross ref +è¦ ļéĨĴ +Stand ard +he ed +ĠD ell +ĠViet namese +Ġo st +ĠV alkyrie +O A +Ass ad +Ġreb ound +ĠTra ffic +pl aces +æ ĺ +ĠB uc +17 2 +Ġshel ters +Ġins isting +ĠCertain ly +ĠKenn eth +ĠT CP +Ġpen al +ĠRe play +he ard +Ġdial ect +iz a +ĠF Y +it cher +ĠD L +Ġspir al +Ġquarterback s +Ġh ull +Ġgo ogle +Ġto dd +ĠSter ling +ĠPl ate +Ġsp ying +mb ol +ĠReal m +ĠPro ced +ĠCr ash +Ġtermin ate +Ġprotest ing +C enter +gu ided +Ġun cover +Ġboy cott +Ġreal izes +s ound +Ġpret ending +ĠV as +19 80 +Ġfram ed +Ġ13 9 +Ġdesc ended +Ġrehab ilitation +Ġborrow ing +ĠB uch +Ġbl ur +R on +ĠFro zen +en za +Ch ief +ĠP oor +Ġtransl ates +M IN +Ġ2 12 +J ECT +Ġerupt ed +Ġsuccess es +S EC +Ġpl ague +Ġg ems +d oms +Ġstret ches +ĠSp y +Ġstory telling +C redit +ĠP ush +Ġtra ction +Ġin effective +ĠL una +Ġt apes +Ġanaly tics +erc ise +Ġprogram mes +ĠCar bon +Ġbeh old +he avy +ĠConserv ation +ĠF IR +Ġs ack +ter min +ric ks +Ġhous ed +Ġunus ually +I ce +Ġexecut ing +ĠMor oc +ed ay +Ġed itions +Ġsm arter +ĠB A +Ġout law +Ġvan ished +ib a +AL SE +ĠSil va +23 8 +C ould +Ġphilos opher +Ġevac uated +Sec ret +14 2 +Ġvis as +ãĤ ¬ +ĠM alt +ĠClear ly +ĠN iger +ĠC airo +ĠF ist +3 80 +ĠX ML +aut o +it ant +Ġrein forced +Rec ord +ĠSurviv or +G Hz +Ġscrew s +parent s +Ġo ceans +ma res +Ġbra kes +vas ive +Ġhell o +ĠS IM +rim p +Ġo re +ĠArm our +24 7 +Ġterr ific +Ġt ones +14 1 +ĠMin utes +Ep isode +Ġcur ves +Ġinflamm atory +Ġbat ting +ĠBeaut iful +L ay +Ġunp op +v able +Ġr iots +ĠTact ics +b augh +ĠC ock +Ġorg asm +ĠS as +Ġconstruct or +et z +G ov +Ġant agon +Ġthe at +Ġde eds +ha o +c uts +ĠMc Cl +Ġu m +ĠScient ists +Ġgrass roots +ys sey +"] => +Ġsurf aced +Ġsh ades +Ġneighb ours +Ġad vertis +oy a +Ġmer ged +Up on +Ġg ad +Ġanticip ate +Any way +Ġsl ogan +Ġdis respect +I ran +ĠT B +act ed +Ġsubp oen +medi ately +OO OO +Ġwa iver +Ġvulner abilities +ott esville +ĠHuff ington +J osh +ĠD H +M onday +ĠEll en +K now +x on +it ems +22 8 +Ġf ills +ĠN ike +Ġcum ulative +and als +I r +Ġ ì +Ġfr iction +ig ator +Ġsc ans +ĠVi enna +ld om +Ġperform ers +P rim +Ġb idding +M ur +Ġlean ed +ĠPri x +al ks +Ġ[ âĢ¦] +ĠTw itch +ĠDevelop er +ĠG ir +Ġcall back +Ab stract +Ġacc ustomed +Ġfreed oms +ĠP G +ur acy +Ġl ump +is man +,, ,, +19 92 +ĠR ED +Ġwor m +M atch +ĠPl atinum +I J +ĠOwn er +Tri via +com pl +Ġnew born +Ġfant as +O wn +Ġ19 59 +Ġsymp ath +Ġub iqu +Ġoutput s +Ġal lev +Ġpr ag +K evin +Ġfav ors +Ġbur ial +Ġn urt +so lete +c ache +Ġ15 6 +Ġunl ocks +te chn +M aking +Ġcon quer +ad ic +æ ĸ +Ġel f +Ġelect orate +ĠKurd s +ĠSt ack +ĠSam urai +Ġâ ĺħ +Ġ{ } +ĠS aid +ĠFall out +Ġkind ness +ĠCustom s +ĠBou levard +Ġhelicop ters +ot ics +ĠVe get +com ment +Ġcritic ised +Ġpol ished +ĠRem ix +ĠC ultural +Ġrec ons +Ġdo i +at em +Sc reen +Ġbar red +Com ments +ĠGener ally +Ġsl ap +7 20 +V ari +p ine +Ġem pt +Ġh ats +ĠPlay ing +l ab +a verage +form s +ĠC otton +Ġcan s +ĠD ON +ĠSom alia +C rypt +ĠIncre ases +E ver +mod ern +Ġsur geon +3 000 +Ġrandom ized +================================ ================================ +B ern +im pl +ĠC OR +Ġpro claim +th ouse +Ġto es +Ġam ple +Ġpres erving +Ġdis bel +gr and +B esides +Ġsil k +ĠPat tern +h m +Ġenter prises +Ġaffidav it +ĠAdvis ory +Ġadvert ised +ĠRel igious +se ctions +psy ch +ĠField s +aw ays +Ġhasht ag +ĠNight mare +Ġv ampire +Ġfore nsic +rosso ver +n ar +Ġn avy +Ġvac ant +ĠD uel +Ġhall way +Ġface book +ident ally +ĠN RA +Ġm att +Ġhur ricane +ĠKir by +ĠP uzzle +Ġsk irt +ou st +du llah +Ġanal ogy +in ion +Ġtomat oes +ĠN V +ĠPe ak +ĠMe yer +Ġappoint ments +Ġm asc +Ġal ley +re hend +Ġchar ities +Ġund o +Ġdest inations +ĠTest ing +"> " +c ats +* . +Ġgest ures +gener al +Le ague +Ġpack ets +ĠInspect or +ĠBer g +Ġfraud ulent +Ġcritic ize +F un +Ġbl aming +nd ra +Ġsl ash +ĠE ston +Ġpropos ing +Ġwh ales +Ġtherap ist +Ġsub set +Ġle isure +EL D +ĠC VE +ĠAct ivity +Ġcul min +sh op +ĠD AY +is cher +ĠAdmir al +ĠAtt acks +Ġ19 58 +Ġmem oir +Ġfold ed +Ġsex ist +Ġ15 3 +ĠL I +Ġread ings +Ġembarrass ment +ĠEmploy ment +w art +ch in +Ġcontin uation +l ia +Rec ently +Ġd uel +Ġevac uation +ĠKash mir +Ġdis position +ĠR ig +Ġbol ts +Ġins urers +4 67 +M ex +Ġret aliation +Ġmis ery +Ġunre asonable +r aining +I mm +ĠP U +em er +Ġgen ital +ãĤ ³ +ĠC andy +Ġon ions +ĠP att +lin er +Ġconced ed +Ġf a +Ġfor c +ĠH ernandez +ĠGe off +deb ian +ĠTe ams +Ġc ries +Ġhome owners +23 7 +A BC +Ġst itch +Ġstat istic +Ġhead ers +ĠBi ology +Ġmot ors +ĠG EN +ĠL ip +Ġh ates +Ġhe el +S elf +i pl +ED IT +ort ing +Ġann ot +ĠSpe ech +old emort +ĠJ avascript +ĠLe Bron +Ġfoot print +Ġf n +Ġseiz ures +n as +h ide +Ġ19 54 +ĠBe e +ĠDecl aration +ĠKat ie +Ġreserv ations +N R +f emale +Ġsatur ated +Ġb iblical +Ġtroll s +Dev ice +ph otos +Ġdr ums +ãĥīãĥ© ãĤ´ãĥ³ +N ight +f ighter +ĠH ak +ri ber +Ġc ush +Ġdiscipl inary +ba um +ĠG H +ĠSch midt +ilib rium +Ġs ixty +ĠKush ner +ro ts +Ġp und +ĠR ac +Ġspr ings +Ġcon ve +Bus iness +F all +Ġqual ifications +Ġvers es +Ġnarc iss +ĠK oh +ĠW ow +ĠCharl ottesville +ed o +Ġinterrog ation +ĠW ool +36 5 +B rian +Ġâľ ĵ +Ġalleg es +ond s +id ation +ĠJack ie +y u +Ġl akes +Ġworth while +Ġcryst als +ĠJud a +Ġcomp rehend +Ġfl ush +Ġabsor ption +ĠO C +Ġfright ened +ĠCh ocolate +Mart in +Ġbu ys +Ġbu cks +Ġapp ell +ĠChampions hips +Ġlist ener +ĠDef ensive +Ġc z +ud s +ĠM ate +Ġre play +Ġdecor ated +Ġs unk +ĠV IP +ĠAn k +Ġ19 5 +aa aa +Nob ody +ĠMil k +ĠG ur +ĠM k +ĠS ara +Ġse ating +ĠW id +Tr ack +Ġemploy s +Ġgig antic +AP P +ãĤ § +in ventory +Ġtow el +at che +l asting +ĠT L +Ġlat ency +Ġkn e +B er +me aning +Ġup held +Ġplay ground +Ġm ant +S ide +Ġstere o +Ġnorth west +Ġexception ally +Ġr ays +Ġrec urring +D rive +Ġup right +Ġab duct +ĠMar athon +Ġgood bye +Ġal phabet +h p +Ġcourt room +ring ton +ot hing +T ag +Ġdiplom ats +Ġbar bar +ĠAqu a +18 3 +33 33 +Ġmat urity +Ġinst ability +ĠAp ache +Ġ= == +Ġfast ing +ĠGr id +Mod Loader +Ġ15 2 +A bs +ĠOper ating +ett i +Ġacqu aint +Don nell +ĠK em +ĠFor ge +Ġarm ored +M il +Ġphilos ophers +in vest +Pl ayers +â Ī +Ġmy riad +Ġcomr ades +R ot +Ġremember ing +Ġcorrespond s +Ġprogram mers +ĠLyn n +Ġo lig +Ġco herent +yn chron +ĠChem ical +Ġj ugg +p air +post s +E ye +ĠIn ner +Ġsem ester +ott est +ĠEmir ates +ric anes +or ously +m its +ĠW is +Ġd odge +l ocation +Ġf aded +Am azon +ĠPro ceed +ĠIN FO +j ournal +ĠTru ck +T en +Ġ2 17 +Ġstat utes +m obile +ĠT ypes +Rec omm +b uster +pe x +Ġleg ends +Ġhead ache +f aced +ĠWi Fi +if ty +ĠH ER +Ġcirc uits +ER ROR +22 6 +ol in +Ġcyl inder +osp ace +ik ers +P rem +Qu ant +Ġconflic ting +Ġslight est +Ġfor ged +ion age +Step hen +ĠK ub +ĠOpp ortun +ĠHe al +Ġbl o +Ġrul ers +Ġh uh +Ġsubmar ine +f y +ass er +Ġallow ance +ĠKas ich +ĠT as +ĠAustral ians +Forge ModLoader +ĠâĨ ij +ĠMat rix +am ins +Ġ12 00 +ĠAc qu +23 6 +D ocument +ĠBre aking +19 3 +ĠSub st +ĠRoll er +ĠPro perties +ĠN I +t ier +Ġcr ushing +Ġadvoc ating +Further more +keep ers +Ġsex ism +x d +Ġcall er +ĠS ense +chie ve +ĠT F +Ġfuel ed +Ġreminis cent +Ġobs ess +ur st +Ġup hold +ĠF ans +het ics +Ġâ Ĺ +ĠB ath +Ġbe verage +Ġo scill +25 4 +Ġpol es +Ġgrad ual +Ġex ting +ĠS uff +ĠS uddenly +Ġlik ing +Ġ19 49 +un ciation +am ination +ĠO mar +ĠL V +ĠCon sequently +Ġsynt hes +ĠG IF +Ġp ains +Ġinteract ing +u ously +inc re +Ġrum or +ĠScient ology +19 7 +ĠZ ig +Ġspe lling +ĠA SS +Ġexting u +ms on +Ġg h +Ġremark ed +ĠStrateg ic +ĠM ON +å ¥ +g ae +ĠWH AT +E ric +ĠCamp us +Ġmeth ane +Ġimag in +J UST +ĠAl m +X T +i q +ĠR SS +Ġwrong doing +att a +Ġbig ot +Ġdemonstr ators +ĠCal vin +ĠV illa +Ġmembr ane +ĠAw esome +Ġbenef ic +26 8 +Ġmagn ificent +ĠL ots +G reg +ĠBor is +Ġdetain ees +ĠH erman +Ġwhis pered +Ġa we +Prof essor +fund ing +Ġphys iological +ĠDest ruction +Ġlim b +Ġmanip ulated +Ġbub bles +Ġpse ud +Ġhyd ra +ĠBrist ol +Ġst ellar +ĠExp ansion +ĠK ell +ĠInterest ingly +Ġm ans +Ġdrag ging +Ġec ological +ĠF it +Ġg ent +Ġbenef ited +ĠHait i +Ġpoly g +ãĥ İ +Ġ20 30 +Ġpro w +Ġrecon struction +Ġwas t +Ġpsych ic +ĠGree ks +Hand ler +16 2 +ĠP ulse +Ġsol icit +Ġsy s +Ġinflu x +ĠG entle +per cent +Ġprolifer ation +Ġtax able +Ġdisreg ard +Ġesc aping +Ġg inger +Ġwith stand +Ġdevast ated +ĠD ew +ser ies +Ġinject ed +ela ide +Ġturn over +he at +Ļ Ĥ +H appy +ĠSil ent +ãĤ Ń +iv ism +Ġir rational +AM A +Ġre ef +r ub +Ġ16 2 +Ġbank ers +ĠEth ics +v v +Ġcritic isms +K n +18 6 +M ovie +ĠT ories +Ġno od +Ġdist ortion +F alse +od ore +Ġt asty +Res earch +ĠU ID +- ) +Ġdivor ced +ĠM U +ĠHay es +ĠIs n +ian i +ĠH Q +Ġ" # +ign ant +Ġtra umatic +ĠL ing +H un +Ġsab ot +on line +r andom +Ġren amed +ra red +K A +d ead +é t +ĠAss istance +Ġse af +++++ ++++ +Ġse ldom +ĠWeb b +Ġbo olean +u let +Ġref rain +ĠDI Y +ru le +Ġshut ting +Ġutil izing +load ing +ĠPar am +co al +oot er +Ġattract ing +ĠD ol +Ġher s +ag netic +ĠRe ach +im o +Ġdisc arded +ĠP ip +01 5 +ü r +Ġm ug +Im agine +C OL +Ġcurs ed +ĠSh ows +ĠCurt is +ĠSach s +spe aking +ĠV ista +ĠFram ework +ong o +Ġsub reddit +Ġcr us +ĠO val +R ow +g rowing +Ġinstall ment +Ġgl ac +ĠAdv ance +EC K +ĠLGBT Q +LE Y +Ġac et +Ġsuccess ive +ĠNic ole +Ġ19 57 +Qu ote +Ġcircumst ance +ack ets +Ġ14 2 +ort ium +Ġguess ed +ĠFr ame +Ġperpet rators +ĠAv iation +ĠBen ch +Ġhand c +A p +Ġ19 56 +25 9 +r and +Net Message +d in +urt les +h ig +ĠV III +ff iti +ĠSw ords +b ial +Ġkidn apping +dev ice +Ġb arn +ĠEl i +auc as +S end +Con structed +Ġ ½ +Ġneed les +Ġad vertisements +Ġv ou +Ġexhib ited +ĠFort ress +As k +B erry +TY PE +Ġcan cers +ump ing +ĠTerrit ory +Ġpr ud +Ġn as +Ġathe ist +Ġbal ances +ãģ Ł +ĠSh awn +& & +Ġland sc +ĠR GB +Ġpet ty +Ġex cellence +Ġtransl ations +Ġpar cel +ĠChe v +E ast +ĠOut put +im i +Ġamb ient +ĠTh reat +Ġvill ains +Ġ5 50 +IC A +Ġtall er +Ġle aking +c up +Ġpol ish +Ġinfect ious +ĠK C +Ġ@ @ +back ground +Ġbureaucr acy +ĠS ai +un less +it ious +ĠSky pe +At l +ID ENT +00 8 +Ġhyp ocr +Ġpit chers +Ġguess ing +ĠF INAL +Bet ween +Ġvill agers +Ġ25 2 +f ashion +ĠTun is +Be h +ĠEx c +ĠM ID +28 8 +ĠHas kell +19 6 +ĠN OR +Ġspec s +Ġinv ari +Ġgl ut +ĠC ars +Ġimp ulse +Ġhon ors +g el +Ġjurisd ictions +ĠBund le +ul as +Calif ornia +ĠIncre ase +Ġp ear +Ġsing les +Ġc ues +Ġunder went +ĠW S +Ġexagger ated +Ġdub ious +Ġfl ashing +L OG +) ]. +J ournal +t g +V an +ĠI stanbul +ĠIn sp +ĠFrank en +D raw +Ġsad ness +Ġiron ic +ĠF ry +x c +Ġ16 4 +is ch +W ay +ĠProtest ant +h orn +Ġun aff +ĠV iv +ill as +ĠProduct ions +ĠH ogan +Ġper imeter +ĠS isters +Ġspont aneous +Ġdown side +Ġdescend ants +Ġor n +w orm +Japan ese +Ġ19 55 +Ġ15 1 +ĠDo ing +els en +umb les +Ġrad ically +ĠDr um +ĠB ach +Ġli abilities +ĠO B +ĠElement ary +Ġmem e +yn es +Ġfinger print +ĠGr ab +Ġundert ake +Mem bers +ĠRead er +ĠSim s +g od +Ġhypot hetical +s cient +ĠA J +Ġchar ism +Ġad missions +ĠMiss ile +tr ade +Ġexerc ising +ĠBack ground +W ritten +Ġvoc als +whe ther +Ġv i +ĠW inner +Ġl itter +ĠSh ooting +ST EM +ãĤ ¡ +ĠA FL +Ġvari ability +Ġe ats +ĠD PS +b row +Ġeleph ants +Ġstr at +Ġ Å +Ġsett lers +Matt hew +Ġin advert +H I +ĠIM F +ĠGo al +Ġnerv es +John son +ey e +ablish ment +Th ursday +BIL ITY +H ad +am oto +het amine +ep s +Ġmit ochond +Ġcomp ressed +ĠTre vor +ĠAnim als +T ool +L ock +Ġtwe ak +Ġpin ch +Ġcancell ation +P ot +Ġfoc al +ĠAst ron +17 3 +ĠA SC +ĠO THER +umn i +Ġdem ise +d l +Ù ħ +Sem itism +Ġcr acking +Ġcollabor ative +Ġexpl ores +s ql +Ġher bs +Ġconfig urations +m is +ĠRes ult +ace y +ĠSm oke +Ġsan ct +el ia +Ġdeg ener +Ġdeep est +Ġscream ed +Ġn ap +Soft ware +ĠST AR +E F +ĠX in +spons ored +mans hip +23 3 +Ġprim aries +Ġfilter ing +Ġas semble +m il +ĠMy ers +b ows +Ġpun ched +M ic +Ġinnov ations +Ġfun c +and o +Ġfr acking +ĠV ul +о Ð +osh op +ĠIm mun +Ġsett ling +Ġadolesc ents +Ġreb uilding +Ġtransform ing +Ġpar ole +Ġhar bor +Ġbook ing +ot ional +onge vity +ĠY o +b ug +Ġemer ges +ĠMethod s +ĠCh u +P res +ĠDun geons +Ġtra iling +ĠR um +ĠH ugh +å¤ © +ĠE ra +ĠBatt les +Res ults +ĠTr ading +Ġvers a +c ss +ax ies +he et +Ġgre ed +19 89 +Ġgard ens +Ġconting ent +P ark +ĠLeaf s +h ook +ro be +Ġdiplom acy +ĠF uel +ĠInv asion +Ġupgr ading +M ale +Ġe lic +Ġrelent less +ĠCo venant +ap esh +ĠT rop +T y +pro duction +art y +Ġpun ches +ak o +cyclop edia +ĠR abbit +ĠHD MI +Ġ14 1 +Ġf oil +Item Image +ĠF G +Ġimplement ations +ĠP om +ixt ures +Ġaw ait +Ġ3 30 +am us +Ġumb rella +Ġfore see +se par +Ġcircum cision +Ġperipher al +S ay +ĠExper t +In c +Ġwithd rew +ĠAnd ers +f ried +Ġradio active +ĠOp ening +Ġboard ing +ĠN D +Ġover throw +Act iv +W P +ĠAct s +× Ļ +Ġmot ions +v ic +ĠM ighty +ĠDef ender +a er +Ġthank ful +ĠK illing +ĠBr is +mo il +Ġpredict ing +26 6 +ch oice +Ġkill ers +Ġinc ub +ĠChe st +ather ing +Ġpro claimed +fl ower +oss om +umbled ore +ĠCy cling +ĠOccup y +AG ES +P en +ĠY ug +Ġpack aged +Ġheight ened +c ot +st ack +C ond +Ġst amps +m age +Ġpersu aded +Ġens l +ĠCard inal +Ġsol itary +Ġpossess ing +ĠC ork +Ġev id +ĠT ay +Ġbl ues +Ġextrem ism +Ġlun ar +Ġcl own +Te chn +Ġfest ivals +ĠPv P +ĠL ar +Ġconsequ ently +p resent +Ġsom eday +ç İĭ +ĠMet eor +Ġtour ing +c ulture +Ġbe aches +S hip +c ause +ĠFl ood +ãĥ ¯ +Ġpur ity +th ose +Ġem ission +b olt +Ġch ord +ĠScript ure +L u +Ġ$ { +cre ated +Other s +25 8 +Ġelement al +Ġannoy ed +ĠA E +d an +ĠS ag +Res earchers +Ġfair y +âĢĵ âĢĵ +======== ==== +Sm art +GG GG +Ġskelet ons +Ġpup ils +link ed +Ġur gency +en abled +ĠF uck +Ġcoun cill +r ab +U AL +T I +Ġlif es +Ġconf essed +B ug +Ġharm on +ĠCON FIG +ĠNe utral +D ouble +Ġst aple +ĠSH A +Brit ish +ĠSN P +AT OR +oc o +Ġswing ing +ge x +ole on +pl ain +ĠMiss ing +ĠTro phy +v ari +ran ch +Ġ3 01 +4 40 +00000000 00000000 +Ġrest oring +Ġha ul +uc ing +ner g +Ġfut ures +Ġstrateg ist +quest ion +Ġlater al +ĠB ard +Ġs or +ĠRhod es +ĠD owntown +????? - +ĠL it +ĠB ened +Ġco il +st reet +ĠPort al +FI LE +ĠG ru +* , +23 1 +ne um +Ġsuck ed +Ġr apper +Ġtend encies +ĠLaure n +cell aneous +26 7 +Ġbrow se +Ġover c +head er +o ise +Ġbe et +ĠG le +St ay +Ġm um +Ġtyp ed +Ġdiscount s +T alk +ĠO g +ex isting +ĠS ell +u ph +C I +ĠAust rian +ĠW arm +Ġdismiss al +Ġaver ages +c amera +Ġalleg iance +L AN +=" # +Ġcomment ators +ĠSet ting +ĠMid west +Ġpharm ac +ĠEX P +Ġstain less +Ch icago +Ġt an +24 4 +Ġcountry side +ĠV ac +29 5 +Ġpin ned +Ġcr ises +Ġstandard ized +T ask +ĠJ ail +ĠD ocker +col ored +f orth +" }, +Ġpat rons +Ġsp ice +Ġm ourn +ĠM ood +Ġlaund ry +Ġequ ip +ĠM ole +y ll +ĠTH C +n ation +ĠSher lock +Ġiss u +ĠK re +ĠAmeric as +ĠA AA +Ġsystem atically +Ġcont ra +ĠS ally +Ġrational e +Ġcar riage +Ġpe aks +Ġcontrad iction +ens ation +ĠFail ure +Ġpro ps +Ġnames pace +Ġc ove +field s +ãĤ ĭ +Ġw ool +ĠC atch +Ġpresum ed +ĠD iana +r agon +ig i +Ġh amm +Ġst unt +ĠG UI +ĠObserv atory +ĠSh ore +Ġsmell s +ann ah +Ġcock pit +ĠD uterte +8 50 +Ġopp ressed +bre aker +ĠCont ribut +ĠPer u +ĠMons anto +ĠAtt empt +Ġcommand ing +Ġfr idge +ĠR in +ĠChe ss +ual ity +Ġo l +Republic an +ĠGl ory +ĠW IN +.... ... +ag ent +read ing +Ġin h +J ones +Ġcl icks +al an +Ġ[ ]; +ĠMaj esty +ĠC ed +op us +ate l +à ª +AR C +ĠEc uador +ãĥ ł +ĠK uro +Ġritual s +Ġcapt ive +Ġoun ce +Ġdisag reement +Ġsl og +f uel +P et +M ail +Ġexerc ised +Ġsol ic +Ġrain fall +Ġdev otion +ĠAss essment +Ġrob otic +opt ions +ĠR P +ĠFam ilies +ĠFl ames +Ġassign ments +00 7 +aked own +Ġvoc abulary +Re illy +Ġc aval +g ars +Ġsupp ressed +ĠS ET +ĠJohn s +Ġwar p +bro ken +Ġstat ues +Ġadvoc ated +Ġ2 75 +Ġper il +om orph +ĠF emin +per fect +Ġh atch +L ib +5 12 +Ġlif elong +3 13 +Ġche eks +Ġnum bered +ĠM ug +B ody +ra vel +We ight +ĠJ ak +ĠHe ath +Ġkiss ing +ĠJ UST +Ġw aving +u pload +Ġins ider +ĠPro gressive +ĠFil ter +tt a +ĠBe am +Ġviol ently +ip ation +Ġskept icism +Ġ19 18 +ĠAnn ie +ĠS I +Ġgen etics +Ġon board +at l +ĠFried man +ĠB ri +cept ive +Ġpir ate +ĠRep orter +27 8 +Ġmyth ology +Ġe clipse +Ġsk ins +Ġgly ph +ing ham +F iles +C our +w omen +Ġreg imes +Ġphotograp hed +K at +ĠMA X +Offic ials +Ġunexpected ly +Ġimpress ions +F ront +;;;; ;;;; +Ġsuprem acy +Ġs ang +Ġaggrav ated +Ġabrupt ly +ĠS ector +Ġexc uses +Ġcost ing +ide press +St ack +ĠR NA +ob il +Ġghost s +ld on +at ibility +Top ics +Ġreim burse +ĠH M +ĠDe g +Ġth ief +y et +ogen esis +le aning +ĠK ol +ĠB asketball +Ġf i +ĠSee ing +Ġrecy cling +Ġ[ - +Cong ress +Ġlect ures +P sy +Ġne p +Ġm aid +Ġori ented +A X +Ġrespect ful +re ne +fl ush +ĠUn loaded +re quest +gr id +ĠAltern atively +ĠHug o +Ġdec ree +ĠBuddh ism +and um +And roid +ĠCong o +ĠJoy ce +Ġacknowled ging +hes ive +ĠTom orrow +ĠH iro +th ren +ĠM aced +Ġho ax +ĠIncre ased +ĠPr adesh +W ild +____ __ +16 1 +Ġa unt +Ġdistribut ing +ĠT ucker +ĠSS L +ĠW olves +B uilding +ou lt +ĠLu o +ĠY as +ĠSp ir +ĠSh ape +ĠCamb od +ĠIP v +Ġm l +Ġext rad +39 0 +ĠPenn y +d ream +Ġstation ed +opt ional +ew orthy +. +ĠWorks hop +ĠRet ail +ĠAv atar +6 25 +N a +ĠV C +ĠSec ure +M Y +19 88 +oss ip +Ġpro state +Ġund en +Ġg amer +ĠCont ents +ĠWar hammer +ĠSent inel +3 10 +Ġse gregation +ĠF lex +ĠM AY +Ġdr ills +ĠDrug s +Islam ic +Ġsp ur +Ġca fe +Ġimag inary +Ġgu iding +Ġsw ings +ĠThe me +ob y +Ġn ud +Ġbe gging +Ġstr ongh +Ġreject ing +Ġpedest rians +ĠPro spect +R are +s le +Ġconcess ions +ĠConst itutional +Ġbe ams +Ġfib ers +p oon +Ġinstinct s +pro perty +ĠB IG +Sand ers +im ates +Ġco ating +Ġcorps es +ĠTR UE +check ed +Ġ16 6 +A sh +ĠJ S +ĠF iction +Ġcommun al +Ġener getic +oooo oooo +Ġnow adays +IL D +ib o +ĠSU V +R en +Ġdwell ing +Sil ver +Ġt ally +ĠM oving +Ġcow ard +Ġgener als +Ġhorn s +Ġcirc ulated +Ġrob bed +ĠUn limited +Ġharass ed +Ġinhib it +Ġcomp oser +ĠSpot ify +Ġspread s +3 64 +Ġsu icidal +Ġno ises +ĠSt ur +Ġs aga +ĠK ag +is o +Ġtheoret ically +M oney +Ġsimilar ity +Ġslic ed +ut ils +ing es +" - +Ġan th +Ġimp ed +Mod ule +Through out +Ġmen us +comm ittee +and i +ob j +in av +f ired +ĠAb dullah +Ġund ead +Ġfont s +H old +EN G +Ġsustain ability +Ġfl ick +Ġr azor +ĠF est +ĠChar acters +Ġword ing +Ġpopul ist +Ġcritic izing +Ġm use +v ine +Ġcard board +Ġkind ly +Ġfr inge +ĠThe ft +icult ural +Ġgovern ors +Ġ ���� +Ġ16 3 +Ġtime out +ĠA uth +Child ren +A U +Ġred emption +ĠAl ger +Ġ19 14 +Ġw aved +Ġastron auts +og rams +Ġsw amp +ĠFinn ish +Ġcand le +Ġton nes +ut m +Ġr ay +Ġsp un +Ġfear ful +art icles +Ġca us +or ically +ĠRequ ires +ĠG ol +Ġpop e +Ġinaug ural +Ġg le +AD A +ĠIS IL +ĠOff ensive +Ġwatch dog +Ġbal con +ent ity +ĠH oo +Ġgall on +AC C +Ġdoub ling +Ġimpl ication +ĠS ight +Ġdoct r +---- --- +Ġ\ \ +Ġm alt +R oll +Ġâī ¥ +Ġrec ap +add ing +u ces +ĠB end +fig ure +Ġtur key +Ġsoc ietal +ĠT ickets +Ġcommer cially +Ġsp icy +Ġ2 16 +ĠR amp +Ġsuperior ity +à ¯ +ĠTr acker +C arl +ĠC oy +ĠPatri ot +Ġconsult ed +Ġlist ings +Ġsle w +reens hot +ĠG one +Ġ[ ...] +30 9 +Ġh ottest +Ø ± +Ġrock y +ĠD iaz +Ġmass age +Ġpar aly +Ġp ony +A z +Ġcart ridge +ĠN Z +Ġsn ack +ĠLam ar +ple ment +ĠLes lie +Ġm ater +Ġsn ipp +24 6 +Ġjoint ly +ĠBris bane +ĠiP od +Ġpump ing +Ġgo at +ĠSh aron +eal ing +Ġcor on +Ġan omal +rah im +ĠConnect ion +Ġsculpt ure +Ġsched uling +ĠD addy +at hing +Ġeyeb rows +Ġcur ved +Ġsent iments +Ġdraft ing +D rop +( [ +Ġnom inal +ĠLeaders hip +ĠG row +Ġ17 6 +Ġconstruct ive +iv ation +Ġcorrupt ed +ger ald +ĠC ros +ĠChe ster +ĠL ap +ãģ ª +OT H +D ATA +Ġal mond +pro bably +I mp +Ġfe ast +ĠWar craft +F lor +Ġcheck point +Ġtrans cription +Ġ20 4 +Ġtwe aks +Ġrel ieve +S cience +Ġperform er +Z one +Ġtur moil +ig ated +hib it +ĠC afe +the med +Ġflu or +ben ch +Ġde com +ĠU nt +ĠBar rett +ĠF acts +Ġt asting +ĠPTS D +ĠSe al +ĠJuda ism +ĠDynam ic +ĠC ors +V e +ĠM ing +ĠTrans form +v on +ĠDef enders +ĠTact ical +ĠV on +ĠUn ivers +Ġdist orted +ĠB reath +?' " +Ġag on +ĠDead ly +Ġl an +ĠCy cle +orn ed +Ġrel iably +Ġgl or +ĠMon key +ãĥ ¡ +Ġad ren +Ġmicrow ave +ĠAl ban +irc raft +dig it +sm art +ĠD read +¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯ +{ { +ĠRoc hester +Ġsimpl ified +Ġinf licted +Ġtake over +Ġyour selves +ad itional +Ġmus cular +K S +Ġing en +T ax +ĠFe ature +27 7 +Ġcru c +Ġcr ate +Ġun identified +Ġacclaim ed +ĠM anga +ĠFr ances +ĠNep al +ĠG erald +ĠKu wait +Ġsl ain +ĠHe b +ĠG oku +ãģ® æ +28 6 +M rs +ĠC ody +ĠSan ctuary +01 6 +Ġdism ant +Ġdatas et +ĠH ond +b uck +ĠPat terson +Ġpal ette +ĠG D +ic ol +ĠL odge +Ġplanet ary +ak in +ĠRegist ered +ab we +ĠPeters burg +Ġha iled +ĠP iece +S che +ĠDO J +Ġen umer +18 1 +ĠObs erver +ĠB old +f ounded +com merce +Ġexplo its +ĠF inding +UR N +ĠS ne +ĠAc id +ay ette +ĠVal ues +Ġdr astic +Ġarchitect ural +Ġ" . +× ķ +ump ed +Ġwra pping +Ġwid ow +ĠSl ayer +l ace +on ce +German y +av oid +Ġtem ples +P AR +à ´ +ĠLuc ifer +ĠFl ickr +l ov +for ces +Ġsc outing +Ġlou der +tes y +Ġbefore hand +Ä ĵ +ĠNe on +ĠW ol +ĠTyp ically +ĠPolit ico +-+ -+ +Ġbuild er +Ġder ive +K ill +Ġp oker +Ġambig uous +Ġlif ts +Ġcy t +Ġrib s +ood le +ĠS ounds +h air +ĠSynd rome +t f +Ġproport ional +u id +Ġper taining +ĠKind le +ĠNeg ro +Ġreiter ated +ĠTon ight +oth s +ĠCorn ell +Ġo wing +Ġ20 8 +elf are +oc ating +ĠB irds +Sub scribe +Ġess ays +Ġburd ens +Ġillust rations +ar ious +ER AL +ĠCal cul +Ġx en +ĠLink edIn +ĠJ ung +Ġredes ign +Con nor +29 6 +Ġrevers al +ĠAd elaide +ĠL L +Ġs inking +Ġg um +US H +c apt +ĠGr imm +Ġfoot steps +ĠCB D +isp ers +Ġpro se +Wed nesday +ĠM ovies +ed in +Ġoverturn ed +Ġcontent ious +US B +~~~~~~~~ ~~~~~~~~ +ĠCo pper +Ġpoint less +N V +val ues +olph in +d ain +Ġdepos ited +ĠG W +Ġpreced ed +ĠCl a +ĠGo lem +ĠN im +ĠÎ ² +ĠEngine ers +m iddle +Ġfl att +oper ative +Ġcouncil s +imb abwe +el in +Ġstress ful +ĠL D +Ġres h +l ake +Ġwheel chair +ĠAltern ative +Ġoptim ize +oper ation +Ġpe ek +Ġones elf +ig il +Ġtrans itions +op athy +bl ank +Ġ16 9 +17 1 +________________________________ ________________________________ +Ġl aundering +En c +ĠD EC +Ġwork outs +Ġsp ikes +Ġdin osaurs +Ġdiscrim inatory +P ool +R ather +38 5 +R NA +tes ters +et o +ĠIdent ity +Ġve in +ĠBur ton +Ġarc ade +4 20 +Ult imately +ĠSad ly +à ° +p ill +Ġcub ic +ĠSpect rum +the se +st ates +Ġun official +h awks +ĠEVER Y +Ġrain bow +Ġincarcer ation +and ing +Ġsy ll +ĠEver ton +Ġ17 9 +ĠSer bia +Ġ18 9 +m eter +ĠMic key +Ġant iqu +Ġfact ual +ne ck +ĠN are +n orm +m ust +Ġhigh ways +Ġgl am +Ġdivid ing +ĠSquad ron +ĠMar tha +Ġbirth s +C over +//////// //////// +ĠW ong +Ph ot +ĠA LS +ri o +ĠNon etheless +ĠL emon +Ġ20 6 +ĠE E +Ġderiv ative +ĠWW II +v ote +Ġthere in +Ġsepar ating +44 6 +sy nc +ĠStre ets +Ġr att +Ġmunicip ality +ĠShort ly +Ġmon k +) ," +Ġscr ub +Ġoper atives +Ne ither +Pl ace +ĠLim it +F emale +ĠAct or +Char acter +Ġconstit uted +35 7 +Ġprotest ed +ĠSt raw +ĠHe ight +ild a +ĠTy ph +Ġflood s +Ġcos metic +W AY +pert ure +up on +t ons +ess ing +ĠP ocket +Ġro oft +ĠC aucas +Ġant idepress +Ġincomp atible +EC D +Ġoper a +ĠCont est +Ġgener ators +l ime +Def ense +19 87 +for um +Ġsav age +ĠHung arian +n z +Ġmet allic +Ġex pelled +Ġres idency +Ġdress es +66 6 +ĠC lement +f ires +C ategory +Ġge ek +al is +Ġc emetery +educ ated +Ġc rawl +ĠUn able +ĠT yson +ak is +Ġp ardon +ĠW ra +Ġstrengthen ed +ĠF ors +33 5 +ĠH C +ĠM ond +Ġvisual s +ĠBeat les +ett lement +Ġ ï +g ro +Ġb ash +Ġpo orest +Ġex cel +Ġaspir ations +ĠM unicip +ens ible +Ġceremon ies +Ġintimid ation +ĠCON TR +be ck +ĠK ap +as u +Ġtradem arks +ĠS ew +ĠComp etition +net work +ĠAr ri +ĠT et +Ro aming +W C +D at +Ġso b +Ġpair ing +Ġoverd ose +SA Y +ab er +Ġrev olt +ĠF ah +act ing +e q +est ation +F ight +ĠMar ks +27 3 +Ġ17 8 +R aw +ãģ ĭ +34 9 +bl ocks +Ġver ge +est ine +ĠPod esta +Ġinv asive +Ġprofound ly +ĠA o +e ach +Ġl est +inter pret +Ġshr inking +Ġerr one +Ġche es +ly s +ĠI vy +ĠDirect ory +Ġhint ed +V ICE +Ġcontact ing +ĠG ent +he i +Ġlabel ing +Ġmerc ury +ĠL ite +Ġexp ires +Ġdest abil +rit is +c u +Ġfeather s +Ġste er +Ġprogram med +ĠV ader +Go ing +ĠE lim +Ġy o +ĠMic he +Ġ20 3 +Ġslee ves +Ġb ully +ĠHum ans +36 8 +Ġcomp ress +ĠBan ner +AR S +Ġa while +Ġcal ib +Ġspons orship +ĠDiff iculty +ĠP apers +Ġident ifier +} . +Ġy og +ĠSh ia +Ġclean up +Ġvib e +int rodu +im ming +Austral ia +Ġout lines +ĠY outube +tr ain +ĠM akes +Ġde ported +Ġcent r +ĠD ug +ĠB oulder +ĠBuff y +Ġinj unction +ĠHar ley +ĠG roups +ĠD umbledore +ĠCl ara +Ġ" - +Ġsacrific ed +ep h +Sh adow +ib ling +Ġfreel ance +Ġevident ly +ph al +Ġret ains +M ir +Ġfin ite +d ar +ĠC ous +Ġrep aired +Ġperiod ic +Ġchampions hips +Ġaster oid +bl ind +Ġexpress ly +ĠAst ros +Ġsc aled +Ġge ographical +ĠRap ids +En joy +Ġel astic +ĠMoh amed +Mark et +be gin +Ġdisco vers +Ġtele communications +Ġscan ner +Ġen large +Ġsh arks +Ġpsy chedel +ĠRou ge +Ġsnap shot +is ine +X P +Ġpestic ides +ĠL SD +ĠDist ribution +re ally +Ġde gradation +Ġdisgu ise +Ġbi om +ĠEX T +Ġequ ations +Ġhaz ards +ĠComp ared +) * +Ġvirt ues +Ġeld ers +Ġenh ancing +ĠAc ross +er os +ang ling +Ġcomb ust +ucc i +Ġconc ussion +Ġcontrace ption +ĠK ang +Ġexpress es +Ġa ux +ĠP ione +Ġexhib its +Deb ug +OT AL +ĠAl ready +ĠWheel er +Ġexp ands +? : +Ġreconc iliation +Ġpir ates +Ġpur se +Ġdiscour age +Ġspect acle +R ank +Ġwra ps +ĠTh ought +Ġimp ending +O pp +ĠAng lo +ĠE UR +Ġscrew ed +ret ched +Ġencour agement +mod els +Ġconf use +mm m +ĠVit amin +âĸij âĸij +C ru +Ġkn ights +Ġdisc ard +Ġb ishops +ĠW ear +ĠGar rett +k an +ãĥ Ł +Ġmascul ine +cap ital +ĠA us +Ġfat ally +th anks +ĠA U +ĠG ut +12 00 +Ġ 00000000 +Ġsur rog +ĠBI OS +ra its +ĠWat ts +Ġresur rection +ĠElect oral +ĠT ips +4 000 +Ġnut rient +Ġdepict ing +Ġspr ink +Ġm uff +ĠL IM +ĠS ample +ps c +ib i +gener ated +Ġspec imens +Ġdiss atisf +Ġtail ored +Ġhold ings +ĠMonth ly +ĠE at +po ons +Ġne c +ĠC age +ĠLot us +ĠLan tern +Ġfront ier +Ġp ensions +Ġj oked +ĠHard y +=-=- =-=- +r ade +U ID +Ġr ails +Ġem it +Ġsl ate +Ġsm ug +Ġsp it +ĠCall s +ĠJac obs +f eat +ĠU E +Ġrest ruct +Ġregener ation +Ġenerg ies +ĠCon nor +OH N +ĠChe ese +Ġg er +Ġresur rect +man agement +N W +Ġpres ently +ĠBru ins +M ember +ĠM ang +id an +Ġboost ing +w yn ++ . +requ isite +ĠNY PD +ĠMe gan +ĠCond itions +Ġp ics +nes ium +ĠR ash +Ġ17 4 +ĠD ucks +Ġemb ro +z u +on ian +rel igious +Ġc raz +ĠAC A +ĠZ ucker +EM A +ĠPro s +We apon +ĠKn ox +ĠAr duino +Ġst ove +Ġheaven s +ĠP urchase +Ġher d +Ġfundra iser +Dig ital +5 000 +Ġprop onents +/ âĢĭ +Ġj elly +ĠVis a +Ġmon ks +Ġadvance ment +ĠW er +Ġ18 7 +e us +ert ility +Ġfet al +Ġ19 36 +L o +Ġout fits +Ġstair case +b omb +Ġcustom ized +cl air +T ree +Ġm apped +ĠConsider ing +ĠTor res +Ġmeth yl +Ġapprox imate +Ġdo om +ĠHans en +Ġc rossover +Ġstand alone +ä ¼ +Ġinv ites +Ġgra veyard +Ġh p +Donald Trump +Ġesc ort +G ar +Ġpredec essors +Ġh ay +Ġen zyme +ĠStra ight +vis ors +I ng +ane ously +ĠApp lied +Ġf ec +ĠDur ant +Ġout spoken +or b +Ġz eal +Ġdisgr ace +' ). +ĠChe ng +28 9 +ĠRen a +ĠSu icide +29 4 +Ġout raged +ĠNew man +ĠN vidia +ĠA ber +ĠB ers +Ġrecre ation +Wind ow +ĠD P +x e +Ġped oph +Ġfall out +ambo o +Ġpresent ations +ĠApp s +Ġh tml +3 45 +ĠX XX +Ġrub bing +ĠLe ather +Ġhum idity +se ys +est ablished +ĠUn its +64 6 +Ġrespect able +A uto +Ġthri ving +ĠInn ovation +ang s +Ext ra +reg ulation +29 8 +p ick +Ex amples +ĠC J +Att ack +Ġdr acon +L T +Ġstick er +re rs +Ġsun ny +I ss +reg ulated +d im +ĠAb stract +Ġhus bands +Off ice +om ination +it ars +AN GE +asc al +ĠK ris +ĠInf antry +Ġm alf +ĠA the +ĠR ally +bal anced +................ ........ +OU P +Ġmole cule +met ics +ĠSpl it +ĠInstruct ions +ĠN ights +c ards +Ġt ug +Ġcon e +å Ń +Ġt x +ĠDisc ussion +Ġcatast rophe +pp e +g io +Ġcommun ism +Ġhal ted +ĠGu ant +cle an +ĠSc hed +ĠK anye +Ġw ander +ĠSer iously +Ġ18 8 +enn ial +f ollow +product ive +ĠFl ow +ĠS ail +Ġc raw +Ġsim ulations +or u +ang les +ĠN olan +Ġmen stru +4 70 +Ġ20 7 +aj a +Ġcas ually +board ing +Ġ2 22 +ov y +ĠN umbers +um at +O E +28 7 +ĠCle mson +Ġcert s +Ġsl id +ĠT ribe +Ġto ast +Ġfort unes +Ġf als +ĠComm ittees +Ġg p +Ġf iery +ĠN ets +ĠAn ime +Pack age +ĠComp are +l aughter +in fect +Ġatroc ities +Ġjust ices +Ġins ults +ĠVern on +Ġsh aken +Ġperson a +est amp +36 7 +br ain +Ġexperiment ing +K en +ĠElect ronics +Ġ16 1 +dom ain +Ġgraph ical +b ishop +Ġwho pping +ĠEv angel +Ġadvertis ers +ĠSpe ar +Ġb ids +Ġdestro ys +ut z +Ġunders c +ĠAD D +Ġan ts +ĠC um +ipp les +ĠF ill +Ġgl anced +Ġind icted +ĠE ff +Ġmis con +ĠDes ktop +Ġab ide +ãĥ Ģ +ĠI o +ĠC oul +Ġcaps ule +ĠCh rys +M ON +Ġund es +ĠI RA +Ġc itation +Ġdict ate +ĠNet works +ĠConf lict +ĠSt uff +x a +is ec +ĠChem istry +Ġquarter ly +William s +an an +O pt +ĠAlexand ria +out heastern +ĠSpring field +ĠBlack s +Ġge ography +24 2 +Ġut most +ĠEx xon +ab outs +E VA +ĠEn able +ĠBar r +Ġdisag reed +ĠCy prus +Ġdement ia +Ġlab s +Ġubiqu itous +ĠLO VE +Ġconsolid ated +s r +Ġcream y +ĠTim ber +Reg ardless +ĠCert ificate +Ġ" ... +ogen ous +Capt ain +Ġinsult ing +ĠSor os +ĠInst r +ĠBulgar ia +bet ter +Ġsuck ing +ĠDavid son +at z +Ġcoll ateral +g if +Ġplag ued +ĠC ancel +ĠGard ner +R B +Ġsix teen +Rem ove +ur istic +c ook +R od +Ġcompr ising +f le +) âĢĶ +ĠVik ing +g rowth +agon al +Ġsr f +af ety +m ot +N early +st own +ĠF actor +Ġautom obile +Ġproced ural +m ask +amp ires +Ġdisapp ears +j ab +3 15 +Ġ19 51 +ne eded +Ġd aring +le ader +Ġp odium +Ġun healthy +Ġm und +Ġpy ramid +oc re +Ġkiss ed +Ġdream ed +ĠFant astic +ĠG ly +å Ĭ +Ġgreat ness +Ġsp ices +Ġmet ropolitan +Ġcomp uls +i ets +101 6 +ĠSh am +ĠP yr +fl ies +ĠMid night +Ġswall owed +Ġgen res +ĠL ucky +ĠRew ards +Ġdisp atch +ĠI PA +ĠApp ly +Ġa ven +al ities +3 12 +th ings +Ġ( ). +Ġm ates +ĠS z +ĠC OP +ol ate +O FF +Ġre charge +c aps +ĠYork er +ic one +Ġgal axies +ile aks +D ave +ĠP uzz +ĠCelt ic +ĠA FC +27 6 +ĠS ons +Ġaffirm ative +H or +Ġtutorial s +ĠC ITY +ĠR osa +ĠExt ension +Ser ies +Ġf ats +Ġr ab +l is +Ġun ic +Ġe ve +ĠSp in +Ġadul thood +ty p +Ġsect arian +Ġcheck out +ĠCy cl +S ingle +Ġmart yr +Ġch illing +88 8 +ou fl +Ġ] ; +Ġcongest ion +m k +ĠWhere as +Ġ19 38 +ur rencies +er ion +Ġbo ast +ĠPat ients +Ġch ap +ĠB D +real DonaldTrump +Ġexam ines +h ov +Ġstart ling +ĠBab ylon +w id +om ew +br ance +ĠOd yssey +w ig +Ġtor ch +ĠV ox +ĠMo z +ĠT roll +ĠAn s +Similar ly +ĠF ul +00 6 +Un less +ĠAl one +st ead +ĠPub lisher +r ights +t u +ĠDoes n +Ġprofession ally +Ġcl o +ic z +Ġste als +Ġ á +19 86 +Ġst urdy +ĠJoh ann +Ġmed als +Ġfil ings +ĠFr aser +d one +Ġmult inational +Ġf eder +Ġworth less +Ġp est +Yes terday +ank ind +Ġg ays +Ġb orne +ĠP OS +Pict ure +Ġpercent ages +25 1 +r ame +Ġpot ions +AM D +ĠLeban ese +Ġr ang +ĠL SU +ong s +Ġpen insula +ĠCl ause +AL K +oh a +ĠMac Book +Ġunanim ous +Ġl enders +Ġhang s +Ġfranch ises +ore rs +ĠUp dates +Ġisol ate +and ro +S oon +Ġdisrupt ive +ĠSur ve +Ġst itches +ĠSc orp +ĠDomin ion +Ġsupp lying +Ar g +Ġtur ret +ĠL uk +Ġbr ackets +* ) +ĠRevolution ary +ĠHon est +Ġnot icing +ĠSh annon +Ġafford ed +Ġth a +ĠJan et +! -- +ĠNare ndra +ĠPl ot +H ol +se ver +e enth +Ġobst ruction +Ġ10 24 +st aff +j as +or get +sc enes +l aughs +ĠF argo +cr ime +Ġorche str +Ġde let +ili ary +rie ved +Ġmilit ar +ĠGreen e +âĹ ı +ãģ ¦ +ĠGu ards +Ġunle ashed +ĠWe ber +Ġadjust able +Ġcal iber +Ġmotiv ations +Ġà ł +m Ah +ĠL anka +hand le +Ġp ent +ĠR av +ĠAng ular +ĠK au +umb ing +Ġphil anthrop +Ġde hyd +Ġtox icity +e er +ĠY ORK +w itz +å ¼ +ĠI E +commun ity +ĠA H +Ġret ali +Ġmass ively +ĠDani els +ĠD EL +Ġcar cin +Ur l +Ġrout ing +ĠNPC s +ĠR AF +ry ce +Ġwa ived +ĠGu atem +Every body +Ġco venant +Ġ17 3 +Ġrelax ing +Ġqu art +al most +Ġguard ed +ĠSold iers +ĠPL AY +Ġout going +L AND +Ġre write +ĠM OV +ĠIm per +ĠS olution +Ġphenomen al +Ġl ongevity +Ġimp at +ĠN issan +ir ie +Ġod or +ĠZ ar +ok s +Ġmilit ias +ĠSP EC +Ġtoler ated +ars er +ĠBrad ford ++ , +Ġsur real +s f +Can adian +Ġresemb lance +Ġcarbohyd rate +VI EW +Ġaccess ory +me al +larg est +ieg el +Some one +Ġtoug hest +os o +Ġfun nel +Ġcondemn ation +lu ent +Ġw ired +ĠSun set +Jes us +ĠP ST +ĠP ages +ĠTy coon +ĠP F +Ġselect ions +Ġ ठ+part isan +Ġhigh s +ĠR une +Ġcraft s +le ad +ĠParent s +Ġre claim +ek er +ĠAll ied +ae per +Ġlo oming +Ġbenefic iaries +ĠH ull +Stud ents +Jew ish +d j +Ġp act +tem plate +ĠOffic ials +ĠBay lor +Ġhe mp +Ġyouth s +ĠLevel s +ĠX iao +ĠC hes +Ġende avor +ĠRem oved +Ġhipp ocamp +H ell +ãĤ Ĭ +80 5 +Ġd inosaur +ĠWr ath +ĠIndones ian +Ġcalcul ator +ĠD ictionary +Ġ4 20 +ĠM AG +( _ +! , +t arians +Ġrestrict ing +rac use +Ġweek day +OU NT +Ġsh rugged +leg round +Ġb ald +ĠDo ctors +Ġt outed +ĠMax well +Ġ2 14 +Ġdiplom at +Ġrep ression +Ġconstitu ency +v ice +r anked +ĠNap oleon +g ang +ĠFore ver +t un +Ġbul b +ĠPD T +ĠC isco +V EN +Ġres umed +Ste ven +ĠManit oba +Ġfab ulous +ĠAg ents +19 84 +Ġam using +ĠMyster ies +Ġor thodox +fl oor +Ġquestion naire +Ġpenet rate +Ġfilm makers +ĠUn c +Ġst amped +Ġth irteen +Ġout field +Ġforward ed +Ġapp ra +Ġa ided +t ry +Ġunf ocused +ĠL iz +ĠWend y +ĠSc ene +Ch arg +Ġreject s +Ġleft ist +ĠProv idence +ĠBr id +reg n +Ġprophe cy +ĠL IVE +4 99 +Ġfor ge +ĠF ML +Ġintrins ic +ĠF rog +Ġw ont +ĠH olt +Ġfam ed +CL US +aeper nick +ĠH ate +ĠC ay +Ġregister ing +ort ality +rop y +ocaly ptic +a an +n av +Ġfasc ist +IF IED +Ġimpl icated +ĠRes ort +ĠChand ler +ĠBr ick +P in +ys c +Us age +ĠHel m +us ra +âĺħ âĺħ +ĠAb bas +Ġunanim ously +Ġke eper +Ġadd icted +?? ? +Ġhelm ets +Ġant ioxid +aps ed +80 8 +gi ene +Ġwa its +Ġmin ion +ra ved +ĠP orsche +Ġdream ing +Ġ17 1 +ĠC ain +Ġun for +ass o +ĠConfig uration +k un +hard t +Ġn ested +ĠL DS +L ES +Ġt ying +en os +Ġc ue +ĠMar qu +sk irts +Ġclick ed +Ġexp iration +ĠAccording ly +ĠW C +Ġbless ings +Ġaddict ive +ĠN arr +y x +ĠJagu ars +Ġrent s +ĠS iber +Ġt ipped +ous se +ĠFitz gerald +Ġhier arch +out ine +Ġwa velength +> . +ch id +ĠProcess ing +/ + +r anking +E asy +ĠConst ruct +Ġt et +ins ured +H UD +Ġqu oting +Ġcommun icated +in x +Ġin mate +Ġerect ed +ĠAbs olutely +ĠSure ly +Ġun im +ĠThr one +he id +Ġcl aws +Ġsuper star +ĠL enn +ĠWh is +U k +ab ol +Ġsk et +ĠN iet +Ġper ks +Ġaff inity +Ġopen ings +phas is +Ġdiscrim inate +T ip +v c +Ġgr inding +ĠJenn y +Ġast hma +hol es +ĠHom er +Ġreg isters +ĠGl ad +Ġcre ations +Ġlith ium +Ġappl ause +unt il +Just ice +ĠTur ks +Ġsc andals +Ġb ake +t ank +M ech +ĠMe ans +ĠM aid +Republic ans +is al +wind ows +ĠSant os +Ġveget ation +33 8 +t ri +Ġfl ux +ins ert +Ġclar ified +Ġmort g +ĠCh im +ĠT ort +Ġdiscl aim +met al +ĠAs ide +Ġindu ction +Ġinf l +Ġathe ists +amp h +Ġe ther +ĠV ital +ĠBu ilt +M ind +Ġweapon ry +S ET +Ġ18 6 +ad min +g am +cont ract +af a +Ġderiv atives +Ġsn acks +Ġch urn +E conom +Ġca pped +ĠUnder standing +ĠH ers +ĠI z +Ġd uct +I ENT +augh ty +Ġâľ Ķ +ĠN P +Ġsa iling +In itialized +Ġt ed +Ġreact ors +ĠL omb +Ġcho ke +ĠW orm +Ġadm iration +Ġsw ung +ens ibly +Ġr ash +ĠGo als +ĠImport ant +Sh ot +ĠR as +Ġtrain ers +ĠB un +Work ing +Ġhar med +ĠPand ora +ĠL TE +Ġmush room +ĠCH AR +ĠF ee +ĠM oy +B orn +ol iberal +ĠMart ial +Ġgentle men +Ġling ering +Offic ial +Ġgra ffiti +ĠN ames +D er +Ġqu int +ist rate +aze era +ĠNOT ICE +ĠFlore nce +Ġpay able +Ġdep icts +ĠSpe cies +He art +âĶĢâĶĢâĶĢâĶĢ âĶĢâĶĢâĶĢâĶĢ +Ġencl osed +Incre ases +D aily +ĠL is +Ġenact ment +ĠB acon +ĠSt eele +dem and +Ġ18 3 +Ġmouth s +Ġstr anded +Ġenhance ment +01 1 +ĠWh ats +Ġhe aled +en y +ĠR ab +Ġ3 40 +ĠLab yrinth +ro ach +ĠY osh +ĠCl ippers +Ġconcert s +Intern et +35 5 +Ġstick ers +Ġter med +ĠAx e +Ġgrand parents +Fr ance +ĠCl im +ĠU h +ul ic +Ġthr ill +cent ric +ĠOver view +ĠCond uct +Ġsubstant ive +Ġ18 2 +m ur +Ġstr ay +ĠCo ff +Ġrep etitive +ĠFor gotten +Ġqual ification +ew itness +ĠZ imbabwe +Ġsim ulated +ĠJ D +25 3 +ĠW are +Ġun sc +T imes +Ġsum mons +Ġdis connected +Ġ18 4 +ci us +ĠGu jar +od ka +Ġer ase +ĠTob acco +elect ed +Ġun cont +ĠShe pard +ĠL amp +Ġalert ed +Ġoper ative +arn a +u int +Ġneglig ence +ac ements +Ġsup ra +Ġprev ail +ĠSh ark +Ġbel ts +ãģ « +Ġt ighter +Engine ers +Ġin active +Ġexp onent +ĠWill ie +a ples +Ġhe ir +ĠH its +ian n +ĠS ays +Ġcurrent s +ĠBeng al +Ġar ist +B uffer +Ġbree ze +ĠWes ley +Col a +Ġpron oun +Ġde ed +ĠK ling +Ġof t +Ġinf lict +Ġpun ishing +Ġn m +ik u +OD UCT +01 4 +Ġsubsid y +ĠDE A +ĠHer bert +ĠJ al +B ank +Ġdef erred +Ġship ment +B ott +Ġal le +b earing +HT ML +Off line +Ġ2 13 +Ġscroll ing +Ġsc anned +ĠLib yan +ĠT OP +ch rom +d t +col umn +Psy NetMessage +Z ero +Ġtor so +0 50 +âķ IJ +Ġimp erson +ĠSchw artz +ud ic +Ġpiss ed +ĠS app +25 7 +ĠIS Ps +og l +Ġsuper vised +Ġad olescent +Ġatt ained +ĠDel ivery +ĠB unny +Ġ19 37 +Ġmini ature +Ġo s +Ġ3 70 +60 8 +ĠMour inho +Ġinn ate +Ġtem po +ĠN M +ĠFall en +00 9 +Ġprov ocative +Stream er +ĠBened ict +ĠBol she +Ġt urtle +ĠPC B +ĠEqu al +Direct or +ĠR end +Ġflu ids +Author ities +Ġcous ins +requ ency +ĠNeigh bor +s ets +sh ared +Char les +pass word +Ġg ears +Ġ2 11 +ĠHard ware +ri ka +Ġup stream +H om +Ġdisproportion ately +iv ities +Ġund efined +Ġelect rons +Ġcommem or +Event ually +Ġ> < +Ġir responsible +2 18 +ĠRe leased +ĠO VER +ĠI GN +ĠB read +st ellar +ĠS age +tt ed +dam age +ed ition +ĠPre c +Ġl ime +Ġconf inement +Ġcal orie +we apon +Ġdiff ering +ĠS ina +m ys +am d +Ġintric ate +k k +ĠP AT +ã o +st ones +lin ks +Ġr anch +Sem itic +Ġdifferent iate +ĠS inger +occup ied +Ġfort ress +c md +Ġinter ception +ĠAnk ara +Ġre pt +ĠSol itaire +Ġrem ake +p red +Ġd ared +aut ions +ĠB ACK +Run ning +Ġdebug ging +Ġgraph s +3 99 +ĠNig el +Ġb un +Ġpill ow +Ġprog ressed +fashion ed +Ġob edience +ER N +Ġrehe ars +C ell +t l +S her +Ġher ald +ĠPay ment +ĠC ory +ĠDe pt +Ġrep ent +ĠWe ak +uck land +Ġple asing +Ġshort ages +Ġjur ors +ĠK ab +q qa +Ant i +Ġw ow +ĠRC MP +Ġt sun +ĠS ic +Ġcomp rises +Ġsp ies +Ġprec inct +n u +Ġur ges +Ġtim ed +Ġstrip es +ĠB oots +Ġy en +Adv anced +Ġdisc rete +ĠArch angel +employ ment +D iff +Ġmon uments +Ġ20 9 +work er +Ġ19 6 +ĠI g +utter stock +T PS +J ac +Ġhomeless ness +Ġcomment ator +Ġrac ially +f ing +se ed +E le +ell ation +Ġeth anol +Ġpar ish +ĠD ong +ĠAw akening +Ġdev iation +ĠB earing +ĠTsu k +Ġrec ess +Ġl ymph +ĠCann abis +å ľ +ĠNEW S +Ġd ra +ĠStef an +ĠWr ong +ĠS AM +Ġloose ly +Ġinterpre ter +ĠPl ain +Go vernment +Ġbigot ry +Ġgren ades +ave z +pict ured +Ġmand ated +ĠMon k +ĠPed ro +Ġl ava +27 4 +Ġcyn ical +ĠScroll s +l ocks +M p +Ġcon gregation +orn ings +ph il +ĠI bid +Ġf erv +Ġdisapp earing +Ġarrog ant +sy n +ĠMa ver +ĠSu it +24 1 +Ġab bre +ack ers +P a +ĠY el +Whe never +Ġ23 5 +ĠV ine +ĠAn at +Ġext inct +LE T +Ġexecut able +V ERS +ox ide +D NA +ĠP rel +Ġresent ment +Ġcompr ise +ĠAv iv +Ġinter ceptions +Ġprol ific +IN A +ĠEr in +though t +2 19 +ĠPsychiat ry +un ky +chem ist +H o +ĠMcC oy +Ġbr icks +L os +ri ly +ĠUS SR +Ġr ud +Ġl aud +ĠW ise +ĠEmer ald +Ġrev ived +Ġdam ned +ĠRep air +id em +ct ica +Ġpatri arch +ĠN urs +me g +Ġcheap est +re ements +empt y +ĠCele br +Ġdepri vation +ch anted +ĠTh umbnails +E nergy +ĠEth an +ĠQ ing +Ġopp oses +W IND +v ik +ĠM au +ĠS UB +66 7 +G RE +ĠVol unte +nt on +C ook +å IJ +es que +Ġplum met +Ġsu ing +Ġpron ounce +Ġresist ing +ĠF ishing +ĠTri als +Ġy ell +Ġ3 10 +Ġin duct +Ġpersonal ized +oft en +R eb +EM BER +Ġview point +Ġexist ential +() ) +rem ove +MENT S +l asses +Ġev apor +Ġa isle +met a +Ġreflect ive +Ġentit lement +Ġdev ised +mus ic +asc ade +Ġwind ing +off set +Ġaccess ibility +ke red +Bet ter +ĠJohn ston +th inking +S now +ĠCroat ia +ĠAt omic +27 1 +34 8 +Ġtext book +ĠSix th +Ġ اÙĦ +Ġsl ider +ĠBur ger +b ol +S ync +Ġgrand children +Ġc erv ++ ) +Ġe ternity +Ġtweet ing +Ġspec ulative +Ġpiv otal +ĠW P +ĠT ER +ynam ic +Ġu pl +ĠC ats +per haps +Ġclass mates +Ġblat ant +' - +Ġl akh +ant ine +ĠB org +i om +/ ( +ĠAthlet ic +Ġs ar +OT A +ĠHoff man +Never theless +Ġad orable +Ġspawn ed +Ass ociated +ĠDom estic +Ġimpl ant +ĠLux em +ĠK ens +Ġp umps +ĠS AT +Att ributes +50 9 +av our +Ġcentral ized +ĠT N +Ġfresh ly +ĠA chieve +Ġouts iders +her ty +ĠRe e +ĠT owers +ĠD art +ak able +Ġm p +ĠHeaven ly +Ġr ipe +ĠCarol ine +ry an +Ġclass ics +Ġret iring +Ġ2 28 +Ġa h +Ġdeal ings +Ġpunch ing +ĠChap man +O ptions +max well +vol ume +Ġst al +Ġex ported +ĠQu ite +Ġnumer ical +B urn +F act +ĠKey stone +Ġtrend ing +Ġalter ing +ĠAfric ans +47 8 +ĠM N +ĠKn ock +Ġtempt ation +Ġprest ige +Over view +ĠTrad itional +ĠBah rain +Priv ate +ĠH OU +Ġbar r +ĠT at +C ube +US D +ĠGrand e +ĠG at +ĠFl o +Ġres ides +Ġind ec +vol ent +Ġperpet ual +ub es +Ġworld view +ĠQuant um +Ġfil tered +Ġen su +orget own +ERS ON +ĠM ild +37 9 +OT T +à ¥ +Ġvit amins +Ġrib bon +Ġsincere ly +ĠH in +Ġeight een +Ġcontradict ory +Ġgl aring +Ġexpect ancy +Ġcons pir +Ġmon strous +Ġ3 80 +re ci +Ġhand ic +Ġpump ed +Ġindic ative +Ġr app +Ġav ail +ĠLEG O +ĠMar ijuana +19 85 +ert on +Ġtwent ieth +################ ################ +ĠSw amp +Ġval uation +Ġaffili ates +adjust ed +ĠFac ility +26 2 +Ġenz ymes +itud inal +Ġimp rint +S ite +Ġinstall er +ĠT RA +m ology +lin ear +ĠCollect ive +ig ating +ĠT oken +Ġspec ulated +K N +ĠC ly +or ity +Ġdef er +Ġinspect ors +appro ved +R M +ĠSun s +Ġinform ing +ĠSy racuse +ib li +7 65 +Ġgl ove +Ġauthor ize +âĢ¦âĢ¦âĢ¦âĢ¦ âĢ¦âĢ¦âĢ¦âĢ¦ +ĠCru ise +Ġcontract ing +she ll +IF E +ĠJew el +p ract +ĠPhot oshop +ĠKnow ing +h arm +Ġattract ions +ad an +et us +01 8 +w agen +Al t +Ġmultip ly +Ġequ ilibrium +: { +ĠF ighters +ĠEd gar +Ġfour teen +Go vern +Ġmis use +Ġab using +Ġancest ry +ram er +64 4 +Ġwor ms +Ġthick er +ĠComb ine +Ġpeas ants +Ġv ind +Ġcon quest +Ġm ocked +Ġc innamon +ĠC ald +ĠGall up +Ġavoid ance +Ġincarn ation +ĠStr at +Ġt asted +ent a +ĠN eal +p ared +Ġtermin ology +ject ion +Scient ists +ĠIN S +ĠDe e +Ġdirect ories +R oad +ĠSh ap +br ight +ĠDirect ors +ĠCol umn +Ġb ob +Ġprefer ably +Ġgl itch +f urt +Ġe g +id is +C BC +Ġsur rendered +Ġtest ament +33 6 +ug gest +ĠN il +an other +Ġpat hetic +ĠDon na +Ġ2 18 +ĠA very +Ġwhis key +Ġf ixture +ĠCon quest +Ġbet s +O cc +ĠLe icester +] ." +Ġ) ); +Ġfl ashes +45 6 +Ġmask ed +ge bra +Ġcomput ed +che l +aud er +Ġdefe ats +ĠLiber ation +ĠOs ama +ĠV ive +Ch anges +Ch annel +Ġtar iffs +Ġm age +ĠS ax +Ġinadvert ently +ĠC RE +ĠRe aper +ink y +gr ading +Ġstere otyp +Ġcur l +ĠF ANT +Ġfram eworks +M om +ĠAn ch +Ġflav our +car bon +Ġperm itting +let cher +ĠMo zilla +ĠPark ing +ĠCh amp +Sc roll +Ġmurd erer +Ġrest ed +Ġow es +ĠP oss +AD D +IF F +res olution +ĠMin ing +Ġcompar ative +D im +Ġneighbour ing +ĠA ST +ĠT oxic +Ġbi ases +Ġgun fire +ur ous +ĠMom ent +19 83 +Ġper vasive +tt p +ĠNorm ally +r ir +S arah +ĠAlb any +Ġun sett +ĠS MS +ip ers +l ayer +ĠWh ites +up le +Ġtur bo +ĠLe eds +Ġthat s +ĠMin er +M ER +ĠRe ign +Ġper me +ĠBl itz +Ġ19 34 +Ġintimid ating +t ube +Ġecc entric +ab olic +box es +ĠAssoci ates +v otes +Ġsim ulate +um bo +aster y +Ġship ments +FF FF +an th +Ġseason ed +Ġexperiment ation +âĸ ł +law s +Me et +idd les +ant ics +R ating +IS IS +h ift +Ġfront s +b uf +01 7 +Ġun att +ĠD il +le ases +ĠGard ens +77 7 +t ouch +ve ll +45 8 +Ġ= ==== +s aving +Ġer osion +ĠQu in +Ġearn s +Ġaccomplish ment +ĠWe i +Ġ< [ +____ _ +Ġir rig +ĠT eddy +Ġconqu ered +ĠArm ored +Ġassert s +Ġmanip ulating +r é +Ġtranscript s +G allery +Ġplot ting +Ne il +Ġbetray al +load er +ĠS ul +Ġdispl acement +Ġroy alty +ĠW I +he it +ĠDev ices +alle l +Ġmunicipal ities +Ġcan al +St ars +ĠU AE +Ġ" âĢ¦ +ĠC U +ab ove +Ġreson ance +ĠguiActive Un +add ed +ĠBra ves +ĠI bn +Ġhere by +ĠB RE +Ġshare holder +ĠH ir +ĠJ i +Ġstrange ly +Ġadm ired +Ġpl ight +Ġb achelor +ĠP ole +cipl inary +T ony +ĠArmen ian +Ġun man +ĠZion ist +St age +isco ver +Ġautom otive +Ġs idelines +Ġsl ick +ĠRena issance +ĠF UN +Im ages +ĠH aj +Ġp ing +Ġshort cut +ĠBl vd +ĠLook s +Ġbur sts +Ġcl amp +Ġm ish +Ġsort ing +Ġpatri ot +Ġcorrect ness +ĠScand inav +ĠCaval iers +p ython +az ar +Ġ3 75 +ĠJa une +40 9 +Ġdetrim ental +Ġstab bing +Ġpoison ed +Ġf ountain +oc ent +or st +ĠMar i +Ġr ains +ĠO vers +ĠInst itution +ud get +AM Y +t ale +ĠK R +ĠPr ices +Ġhead aches +Ġlands l +ĠA ura +Bon us +ĠZ hao +ĠH ip +Ġhop s +ĠKurd istan +Ġexplo iting +ry n +Ġhypocr isy +op ening +Ġgun shot +Ġw ed +inter stitial +Inter stitial +Ġam en +Bre aking +Ġmarket ed +W ire +ĠC rowd +Contin ue +ĠK nown +ĠEffect ive +ore an +iz ons +Jose ph +Ġescal ation +us ername +Ġcur tain +AT ES +ĠP AR +ĠM iy +Ġcounter fe +l ene +Ġcont enders +d aily +ĠAs c +ĠPhill ip +most ly +Ġfil ename +he ne +Ġresemb ling +Ġst aging +ĠCh loe +Ġw iring +H on +ĠRen ew +ott age +ĠHy brid +m uch +Ġstro kes +Ġpolicy makers +AP TER +ĠArk ham +pl ot +Ġassist ants +Ġde port +ĠSe ga +Ġinflu enza +ĠC ursed +ĠK obe +Ġskin ny +Prov ider +ĠR ip +Ġincrement al +product s +B F +Ġd ome +ĠC redits +Ġlos ers +int s +ĠBet ty +ĠTal ent +ĠD AM +L v +E ss +Ġd ens +tem p +J udge +od ic +Ġ' ( +UR ES +ets k +V O +Ġretrie ved +Ġarchitect s +Ù ĩ +Ġeth ic +ĠSecond ary +st ocks +ad ia +Ġ3 25 +ĠOp inion +Ġsimultane ous +Ġd izz +ul p +Ġsmugg ling +ipp ery +R andom +f acing +ĠD as +Ġstock p +Ġdiscl osures +po inter +Ġcor al +ĠSe lection +ĠP ike +ival ent +Ġruth less +ĠR im +Ġensu ing +ĠExper iment +Ġcongress man +Ġbelie ver +Ġun specified +ĠM ord +Ġknowledge able +ĠV ERY +T X +Ġstra ps +Ġtur f +apesh ifter +Ġmar ital +Ġfl ock +ãģ Ĩ +26 3 +AM ES +ĠOpp osition +Ġtre asures +ĠG OD +Ġmodel ed +ĠWOR LD +Ġ( [ +ĠUs age +H F +Ġ$ ( +uss ed +Ġpione er +E ight +par se +b read +rit z +ĠMir anda +ĠK ant +++ ) +ore n +Ġprov oked +Ġbre eds +ĠIn cludes +ĠPast ebin +ĠFl ip +J ava +Ġbr ink +Ġrum ored +Ġun seen +Ġgar nered +ĠDef in +al ted +Ġtatt oos +Ġhes itation +is itions +ĠWe aver +ĠReport ing +Ġtherap ies +Ġconsult ants +Ġresid ual +ĠMal i +ĠRom a +i ago +ĠRes idents +ub i +Ġremed ies +Ġadapt ive +ĠAl ive +ĠBar cl +Ġwal lets +c rypt +etermin ation +ĠPel osi +Ġsl ipping +oton in +Ġall iances +pat rick +ir is +Ġor th +ĠPer kins +ĠDe V +ĠG ets +Ġdry ing +ge e +fore st +ĠFor get +ore m +33 9 +Ġvague ly +ĠD ion +ĠP orn +ĠH OW +Ġp neum +Ġrub ble +ĠT aste +enc ia +ĠG el +Ġd st +Ġ24 5 +ĠMoroc co +inf lamm +ĠTw ins +Ġb ots +d aughter +ĠB alk +Ġbre thren +Ġlog os +Ġgo bl +f ps +Ġsub division +Ġp awn +Ġsquee zed +Ġmor ale +ĠD W +' " +Ġkn ot +ook y +Ġdiv isive +Ġboost ed +ch y +ãĥ IJ +if act +Ġnewcom ers +ĠWrest ling +Ġsc outs +w olves +R at +Ġnin eteenth +ĠOs borne +St ats +Ġem powered +Ġpsych opath +ĠO EM +ugg age +ĠP K +ĠMoh ammad +P ak +Ġanarch ists +ĠExt ract +est hes +ĠStock holm +l oo +ĠG raph +Ġdeploy ing +ĠStr anger +ĠM old +Ġstaff er +Ġdiscount ed +uck le +ple ase +ĠLand ing +ÃŃ a +Ġ19 3 +Ġan te +Ġrep etition +Ġ+ /- +Ġpar ody +Ġlive ly +AA A +ĠHor us +Ġp its +ind ers +L OC +ĠVen ice +40 6 +ĠDis cover +â Ĩ +ellect ual +Ġp ens +Ġey el +ig uous +Im pl +Ġj oking +Ġinv al +ĠBel fast +Ġcredit ors +ĠSky walker +ov sky +Ġcease fire +Ġse als +is oft +) ). +ĠFel ix +IT S +Ġt resp +ĠBlock chain +ew are +ĠSch war +en ne +mount ed +ĠBe acon +les h +Ġimmense ly +Ġche ering +Em ploy +sc ene +ish ly +atche wan +ĠNic olas +Ġdr ained +ĠEx it +ĠAz erb +j un +Ġflo ated +u ania +De ep +Ġsuper v +Ġmyst ical +ĠD ollar +ĠApost le +ĠR EL +ĠProv ided +ĠB ucks +ãĥ ´ +cut ting +Ġenhance ments +ĠPengu ins +ĠIsa iah +Ġj erk +ĠW yn +Ġst alled +Ġcryptoc urrencies +ĠR oland +sing le +Ġl umin +ĠF ellow +ĠCap acity +ĠKaz akh +W N +Ġfin anced +38 9 +Ġt id +Ġcoll usion +ĠMy r +î Ģ +Sen ator +Ġped iatric +Ġneat ly +Ġsandwic hes +ĠArchitect ure +Ġt ucked +Ġbalcon y +Ġearthqu akes +qu ire +F uture +Ġhe fty +é Ĺ +Ġspecial izes +Ġstress es +Ġs ender +Ġmisunder standing +Ġep ile +Ġprov oke +ĠCol ors +Ġdis may +uk o +[ _ +58 6 +ne utral +Ġdon ating +ĠRand all +Mult i +Ġconvenient ly +ĠS ung +ĠC oca +Ġt ents +ĠAc celer +Ġpart nered +27 2 +ir ming +ĠB AS +s ometimes +Ġobject ed +ub ric +p osed +LC S +gr ass +Ġattribut able +V IS +Israel i +Ġrepe ats +ĠR M +v ag +ut a +in ous +Ġin ert +ĠMig uel +æ Ń +ĠHawai ian +B oard +Ġart ific +ĠAzerb ai +as io +ĠR ent +A IN +Ġappl iances +Ġnational ity +Ġass hole +ĠN eb +Ġnot ch +h ani +ĠBr ide +Av ailability +Ġintercept ed +Ġcontin ental +Ġsw elling +ĠPers pect +b ies +. < +ith metic +ĠL ara +Ġtempt ing +add r +Ġoversee ing +cl ad +ĠD V +ĠGing rich +Ġm un +ĠApp ropri +Ġalter ations +ĠPat reon +Ġha voc +Ġdiscipl ines +Ġnotor iously +aku ya +ier i +? ). +ĠW ent +Ġsil icon +Ġtre mb +Cont ainer +K nown +Ġmort ar +est e +ick a +Ar thur +ĠPre viously +ĠMart y +Ġsp arse +g ins +Ġin ward +ĠParticip ant +C opy +ĠM isc +Ġantib iotic +ĠRet ro +Ġel usive +Ġass ail +ĠBatt alion +ĠB ought +Ġdimin ish +ĠEuro pa +s ession +ĠDanger ous +ies el +Ġdisbel ief +Ġbl asts +ext reme +ĠBoy d +ĠProject s +ĠGu ys +Ġunder gone +Ġgr ill +ĠDw ight +Ġ19 7 +US ER +Ġfiles ystem +Ġcl ocks +T aylor +Ġwra pper +Ġfold ing +ous and +ĠPhilipp ine +ATION AL +ĠPer th +Ġas hes +Ġaccum ulate +ĠGate way +Sh op +orks hire +H an +ĠBar rel +ĠLe h +ĠX V +Ġwh im +Ġrep o +ĠC G +ĠM am +Ġincorpor ating +Ġbail out +Ġlingu istic +Ġdis integ +C LE +Ġcinem atic +ĠF iber +S yn +il ion +ĠCom pos +c hens +Ġne oc +Ġbo iled +F INE +on o +un cle +ik en +ĠB M +Î ¹ +Ġreceipt s +Ġdisp osed +ĠTh irty +ĠR ough +ĠA BS +Ġnot withstanding +oll en +# $ +Ġunrel iable +Ġbl oom +Ġmedi ocre +Ġtr am +ĠTas man +Ġsh akes +Ġmanifest o +ĠM W +Ġsatisf actory +Ġsh ores +Ġcomput ation +Ġassert ions +orm ons +ar ag +ab it +Dem ocrats +ĠL oot +ĠVol ks +ha ired +Ġgrav itational +S ing +ĠM iz +Ġthro ttle +Ġtyr anny +ĠView s +Ġrob ber +ĠMinor ity +Ġsh rine +sc ope +pur pose +Ġnucle us +our cing +ĠUS DA +ĠD HS +w ra +ĠBow ie +Sc ale +ĠB EL +x i +I ter +Ġ( ), +w right +Ġsail ors +ous ed +NAS A +ĠPro of +ĠMin eral +t oken +ĠF D +R ew +Ġe ll +6 30 +Ġchance llor +ĠG os +Ġamount ed +ĠRec re +ome z +ĠOpt im +ĠOl ive +Ġtrack er +ow ler +ĠUn ique +R oot +Ġmar itime +ĠQur an +ĠAd apt +Ġecosystem s +ĠRe peat +ĠS oy +ĠI MP +Ġgrad uating +and em +P ur +ĠRes et +ĠTr ick +ĠPh illy +ĠT ue +ĠMalays ian +Ġclim ax +Ġb ury +Ġcons pic +ĠSouth ampton +ĠFl owers +Ġesc orted +ĠEduc ational +ĠI RC +Ġbrut ally +e ating +Ġpill ar +ĠS ang +ĠJ ude +ar ling +ĠAm nesty +Ġrem inding +ĠAdminist rative +hes da +Ġfl ashed +ĠP BS +per ate +fe ature +Ġsw ipe +Ġgra ves +oult ry +26 1 +bre aks +ĠGu er +Ġsh rimp +ĠV oting +qu ist +Ġanaly tical +Ġtables poons +ĠS OU +Ġresear ched +Ġdisrupt ed +Ġj our +Ġrepl ica +Ġcart oons +b ians +} ) +c opy +G ot +ou ched +P UT +Ġsw arm +not ations +s aid +Ġreb uilt +Ġcollabor ate +Ġr aging +Ġn ar +Ġdem ographics +ĠD DR +Ġdist rust +oss ier +ĠK ro +Ġpump kin +Ġreg rets +Ġfatal ities +ĠL ens +ĠO le +p d +Ġpupp et +ĠOut look +ĠSt am +O l +F air +U U +Ġre written +Ä ± +Ġfasc inated +Ġve ctors +Ġtrib unal +u ay +ĠM ats +ĠCo ins +[ [ +Ġ18 1 +Ġrend ers +ĠK aepernick +Ġesp ionage +Ġsum m +Ġd itch +Acc ount +Ġspread sheet +Ġmut ant +p ast +40 7 +Ġd ye +Ġinit iation +Ġ4 000 +Ġpunish able +Ġth inner +ĠKh al +Ġinter medi +D un +ĠGoth am +Ġeager ly +Ġvag inal +p owers +V W +ĠWATCH ED +Ġpred ator +ams ung +Ġdispar ity +Ġ[ * +Ġam ph +Ġout skirts +ĠSpir its +Ġskelet al +Ð » +ĠR ear +Ġissu ance +ĠLog ic +re leased +Z Z +ĠB ound +Ent ry +Ġex its +is ol +ĠFound er +Ġw re +ĠGreen land +ĠM MO +t aker +IN C +ãģ ¾ +Ġhour ly +hen ko +Ġfantas ies +Ġdis ob +Ġdemol ition +ãĥ ĭ +Ġen listed +rat ulations +Ġmis guided +Ġens ured +Ġdiscour aged +m ort +Ġfl ank +Ġc ess +Ġreact s +ĠS ere +s ensitive +ĠSer pent +ass ad +Ġ24 7 +Ġcalm ly +b usters +Ġble ed +ĠSt ro +Ġamuse ment +ĠAntar ctica +Ġs cept +ĠG aw +a q +ason ic +Ġsp rawling +n ative +atur ated +ĠBattle field +IV ERS +E B +ĠG ems +ĠNorth western +ĠFil ms +ĠAut omatic +Ġappre hend +ãģ ¨ +Ġgui Name +Ġback end +Ġevid enced +ge ant +01 2 +ĠS iege +Ġexternal To +Ġunfocused Range +ĠguiActiveUn focused +Ġgui Icon +ĠexternalTo EVA +ĠexternalToEVA Only +F ri +ch ard +en aries +Ġchief s +Ġc f +ĠH UD +Ġcorro bor +Ġd B +ĠT aken +ĠPat ricia +ra il +ĠCh arm +ĠLiber tarian +rie ve +Person al +ĠO UR +ger ies +Ġdump ing +Ġneurolog ical +it imate +ĠClint ons +raft ed +ĠM olly +Ġtermin als +reg ister +Ġfl are +Ġenc oded +Ġautop sy +p el +m achine +Ġexempt ions +ĠRoy als +d istance +Ġdraft s +Ġl ame +ĠC unning +Ġsp ouses +ĠMark ets +ĠCar rier +Ġimp lying +ĠY ak +s id +Ġl oser +Ġvigil ant +Ġimpe achment +Ġaug mented +ĠEmploy ees +Ġunint ended +tern ally +ĠW att +Ġrecogn izable +ess im +æ Ŀ +Ġco ated +r ha +Ġlie utenant +ĠLegisl ation +pub lished +44 4 +01 3 +Ġide ally +ĠPass word +Ġsimpl ify +ĠMet a +ĠM RI +Ġple ading +organ ized +hand ler +Ġun ravel +cor rect +Ġ icy +Ġparan oid +Ġpass er +Ġinspect ions +of er +ĠHealth care +28 3 +ĠBr ut +iol a +for ge +ĠMed ieval +MS N +ie vers +ĠProgram ming +å ī +Ġ2 23 +m u +ĠC LE +ug a +Ġsho ppers +Ġinform ative +ĠPl ans +Ġsupplement ation +ĠT ests +ty ard +ocy tes +ĠVeg a +ĠGujar at +erman ent +Ex cept +ĠL OT +all a +ĠC umm +ĠO sw +Ġven om +ĠDeb t +ĠD OWN +Ġreun ion +Ġm uc +ĠRel ief +Ġge op +ĠðŁ ĺ +al ogue +An th +ech o +Ġcor ros +Ġrepl ication +ĠBl azing +ĠD aughter +Ġinf lic +ĠLind sey +Ù Ī +28 4 +Ex it +Ġgl oom +TA IN +Ġundermin ing +Ġadv ising +h idden +Ġover flow +Ġg or +urd ue +Ġe choes +enh agen +Ġimp uls +d rug +c ash +Ġas ync +Ġmir ac +at ts +p unk +Ġpiv ot +ĠLegisl ative +Ġblog gers +ĠCl aw +s burg +d yl +ĠRecomm end +Ġver te +Ġprohib iting +ĠPant her +Jon athan +Ġo min +Ġhate ful +28 1 +ĠOr che +ĠMurd och +down s +Ġas ymm +G ER +Al ways +Ġinform s +ĠW M +ĠP ony +ĠApp endix +ĠAr lington +J am +Ġmedic inal +ĠS lam +IT IES +Ġre aff +ĠR i +F G +S pring +b ool +Ġthigh s +Ġmark ings +ĠRa qqa +ĠL ak +p oll +ts ky +ĠMort y +ĠDef inition +Ġdeb unk +end ered +ĠLe one +a vers +Ġmortg ages +App arently +N ic +ha us +ĠTh ousands +au ld +Ġm ash +sh oot +Ġdi arr +Ġconscious ly +H ero +e as +ĠN aturally +ĠDestroy er +Ġdash board +serv ices +R og +Ġmillenn ials +Ġinv ade +- ( +Ġcomm issions +ĠA uckland +Ġbroadcast s +Ġfront al +Ġcr ank +ĠHist oric +Ġrum ours +CT V +Ġster il +Ġboost er +rock et +ãĤ ¼ +ut sche +ĠP I +Ġ2 33 +ĠProdu cer +ĠAnaly tics +Ġinval uable +Ġunint ention +ĠC Y +Ġscrut in +Ġg igg +Ġeng ulf +Ġprolet ariat +Ġh acks +ĠH ew +ar ak +ĠSl ime +ield ing +ag her +ĠEll iot +Ġtele com +Ġ2 19 +ult an +ĠAr bor +ĠSc outs +B an +Ġlifes pan +Ġbl asp +38 8 +Ġjud iciary +ĠContin ental +ask ing +Mc C +L ED +Ġbag gage +ĠSorce rer +Ġrem nants +ĠGriff ith +ets u +ĠSub aru +ĠPerson ality +des igned +ush ima +agn ar +Ġrec oil +Ġpass ions +\ ": +Ġte e +Ġabol ition +ĠCreat ing +j ac +Ġ19 4 +01 9 +Ġpill ars +ric hed +/ " +t k +Ġlive lihood +Ġro asted +ah on +ĠH utch +ass ert +Ġdivid end +Ġkn it +Ġd aunting +Ġdisturb ance +Ġsh ale +Ġcultiv ated +Ġrefriger ator +L B +ĠN ET +Ġcommercial s +Ġthink ers +45 5 +Ġch op +B road +Ġsuspic ions +Ġtag ged +l ifting +Ġsty lish +ĠShield s +Short ly +Ġt ails +A uth +ST E +ĠG AME +Ġse ism +ĠK is +olog ne +Ġcow ork +Ġforc ibly +Ġthy roid +ĠP B +AN E +mar ried +h orse +Ġpoly mer +ĠCh al +od or +DE BUG +ĠCon text +Ġbl iss +Ġpin point +ĠMat hemat +leg ram +ĠWeek end +Ġlab elled +Ġb art +it les +Ġest rogen +âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ +" ' +Ġvis ibly +Ġouts ider +aid a +Are a +Ġdisse min +Ġdish onest +ĠCl osed +ĠBullet in +ĠRam sey +sw ord +ĠX I +our ced +S ame +34 6 +ĠRe pe +ĠK ou +c ake +em is +C ache +ĠMe aning +ĠEn light +onom y +Ġmanifest ation +sw orth +J ay +Ġch ore +ö r +D ream +Ġsanction ed +Ġcult urally +ĠA ra +N av +Ġthe ological +Ġstr ut +ĠV O +ĠHand book +Ġconstruct ing +Ġ ¶ +ĠBenef its +ĠPsych ological +s ac +å ¸ +p olicy +ĠMat ters +ĠReport ed +ĠBy te +Ġvit ro +ĠM aiden +Ġl am +ĠJenn ings +Ġgar ment +ĠRut gers +ĠStaff ord +ĠWell ington +Ġinter mitt +Ġn pm +Ġord eal +Ġplug ged +o oming +in ished +fram ework +Ġtim ber +Ġc ass +Ġ8 50 +il ess +ĠRed ux +7 68 +St re +Ġsurpass ed +w hel +Ġparalle ls +Ġve il +ĠG I +ĠR EST +Ġread iness +s ort +Ġmod ifying +ĠSl ate +ru ff +Ġmar ble +Ġinf rared +Ġaud itor +ĠFANT ASY +ĠP overty +ĠS PD +Ġ" ( +K y +RA Y +Ġexecut ions +ĠBever ly +ĠMarx ism +ĠBur st +ĠK ali +est ones +Clear ly +E ll +ãģ § +ĠProceed ings +T oken +IF IC +ñ a +Cent ral +ĠH aley +ĠD rama +Ġform ations +OR N +Book s +Ġdom inating +ĠFly ers +ĠCompan ion +Ġdiscipl ined +ĠYug oslav +ĠSpell s +Ġv engeance +Ġland lords +L en +ĠO gre +ano ia +Ġpier cing +Ġcon greg +Ġscore r +ob ia +Ġnic kel +ĠLear ns +Ġre jo +Ġmaster piece +Fl ash +Ġinhab ited +ĠOpen GL +ĠD ud +ĠI CO +Ġar ter +Ġpl ur +Ġmaster y +Ġlong standing +st ed +Ġw ines +Ġtelev ised +ĠSh rine +ĠBay ern +Ġâ ĵĺ +Ġencl osure +j ohn +Ġprophe ts +ĠRes urrection +ĠOrd ers +Ġun even +r als +Ġd wind +ĠL ah +ĠSl oven +37 8 +Ġins istence +aff le +ĠCl one +Ġhard ship +ĠCongress man +Ġple ad +Ġreview ers +Ġc ured +Ġ19 35 +as ley +f ake +ĠTh inking +yd ia +P ART +ĠD ota +o it +Ġwh ipped +Ġb ouncing +ĠHispan ics +com ings +Ġcann abin +ĠCh ambers +ĠZ ack +Option al +Ġco ats +Ġprow ess +ĠNort on +Ġplain ly +Ġfre ight +Ġinhib ition +Ġcl am +Ġ30 3 +ke f +ale igh +L uke +Ġpsych o +ator ium +M ED +Ġtreat ies +Ġind isc +Ġd c +OP S +Ġresil ient +ĠInter state +Ġsl ack +Ġmund ane +Ġestab lishes +35 9 +Ġstr ained +Ġn ond +S us +Ġcast e +ar ate +ie ving +Ġunfair ly +Ġpars er +on ial +urs ive +V ia +ĠOtt o +ĠAuthor ities +stro ke +K R +ĠMer cy +Ġfurn ished +Ġout set +Ġmet ic +19 82 +olith ic +ĠT ent +og ical +ĠA ircraft +Ġh ides +ĠBec ame +Ġeduc ators +re aching +Ġvol atility +Ġtodd ler +ĠNAS CAR +ĠTw elve +ĠHigh lights +Ġgra pe +Ġspl its +Ġpe asant +Ġre neg +ĠMS I +Tem p +st ars +Ġtre k +ĠHy de +b inding +Ġreal ism +Ġox ide +ĠH os +Ġmount s +Ġbit ing +Ġcollaps ing +Ġpost al +Ġmuse ums +Ġdet ached +Ġrespect ing +Ġmonop ol +Ġwork flow +ĠC ake +Tem plate +ĠOrgan isation +Ġpers istence +36 9 +C oming +B rad +Ġredund ant +ĠG TA +Ġb ending +Ġrev oked +Ġoff ending +Ġfram ing +Ġprint f +Comm un +mem bers +Out side +Ġconst rued +Ġc oded +F ORE +Ġch ast +Ch at +Ind ian +ĠY ard +? !" +ĠP orts +ĠX avier +ĠR ET +' ." +ĠBo at +iv ated +ich t +umer able +D s +ĠDun n +Ġcoff in +Ġsecure ly +ĠRapt ors +ĠB es +Install ation +Ġin ception +ĠHealth y +end ants +Ġpsych ologists +ĠShe ikh +c ultural +ĠBlack Berry +sh ift +F red +oc he +Ġc akes +ĠS EO +ĠG ian +ĠAs ians +og ging +e lement +Ġpund its +ĠV augh +ĠG avin +Ġh itter +Ġdrown ed +Ġch alk +ĠZ ika +Ġmeas les +80 2 +âĢ¦ .. +ĠAW S +] " +Ġdist ort +ĠM ast +Ġantib odies +ĠM ash +Mem ory +ĠUg anda +ĠPro b +Ġvom iting +ĠTurn s +Ġoccup ying +Ġev asion +ĠTher apy +Ġprom o +Ġelect r +Ġblue print +ĠD re +pr iced +ĠDep ot +Ġallev iate +ĠSom ali +m arg +n ine +Ġnostalg ia +ĠShe pherd +Ġcaval ry +Ġtor ped +ĠBlood y +x b +Ġs ank +Ġgo alt +report print +embed reportprint +clone embedreportprint +ĠIn itially +ĠF ischer +Ġnot eworthy +c ern +Ġin efficient +raw download +rawdownload cloneembedreportprint +c ation +ĠD ynasty +l ag +D ES +Ġdistinct ly +ĠEston ia +Ġopen ness +Ġg ossip +ru ck +W idth +ĠIb rahim +Ġpet roleum +Ġav atar +ĠH ed +ath a +ĠHog warts +Ġc aves +67 8 +Ġsafegu ard +ĠM og +iss on +ĠDur ham +sl aught +ĠGrad uate +Ġsub conscious +ĠEx cellent +ĠD um +---- - +Ġp iles +ĠW ORK +ĠG arn +ĠF ol +ĠAT M +Ġavoid s +ĠT ul +Ġble ak +EL Y +iv ist +light ly +P ers +ĠD ob +ĠL S +Ġins anity +Î µ +atal ie +En large +Ġtw ists +Ġfault y +Ġpir acy +Ġimp over +Ġrug ged +ĠF ashion +Ġs ands +' ? +sw ick +Ġn atives +Ġhe n +ĠNo ise +ãĥ Ĺ +Ġg reens +Ġfree zer +Ġd ynasty +ĠFather s +ĠNew ark +Ġarchae ological +Ġo t +ob ar +Ġblock ade +Ġall erg +L V +Ġdeb it +ĠR FC +ĠMil ton +ĠPress ure +Ġwill ingly +Ġdisproportion ate +Ġopp ressive +Ġdiamond s +Ġbelong ings +19 70 +Ġbell s +Ġimperial ism +Ġ2 27 +Ġexpl oding +ĠE clipse +Ġ19 19 +Ġr ant +Ġnom inations +34 7 +Ġpeace fully +ric a +ĠF UCK +Ġvib ration +mal ink +Ġro pes +ĠIv anka +ĠBrew ery +ĠBook er +ĠOw ens +go ers +Serv ices +ĠSn ape +Ġ19 1 +39 5 +Ġ2 99 +just ice +Ġb ri +Ġdisc s +Ġprom inently +Ġvul gar +Ġsk ipping +l ves +Ġtsun ami +37 4 +ĠU rug +ĠE id +rec ated +p hen +Ġfault s +ĠStart ed +9 50 +Ġp i +Ġdetect or +Ġbast ard +Ġvalid ated +Space Engineers +OUR CE +Ġ( ~ +Ġuns ur +Ġaff irmed +Ġfasc ism +Ġres olving +ĠCh avez +ĠC yn +Ġdet ract +L ost +Ġrig ged +Ġhom age +ĠBrun o +55 5 +ec a +Ġpress es +Ġhum our +Ġsp acing +Ġ' / +olk ien +C oun +OP ER +T re +S on +ĠCambod ia +ier re +m ong +o zy +Ġliquid ity +ĠSov iets +ĠFernand o +Ġ2 29 +Ġsl ug +ĠCatal an +elect ric +Ġsc enery +ĠH earth +Ġconst rained +Ġgoal ie +ĠGu idelines +ĠAm mo +ĠPear son +Ġtax ed +Ġfet us +Resp onse +ĠAlex is +th ia +G uy +Ġrecon struct +Ġextrem es +Ġconclud ing +ĠP eg +ook s +Ġded uctions +R ose +Ġground breaking +ĠT arg +ãĥ ģ +ĠRe ve +res ource +Ġmo ons +Ġelectrom agnetic +Ġamid st +ĠVik tor +N ESS +B ACK +Ġcomm ute +ĠAna heim +Ġfluct uations +6 40 +Ġnood les +ĠCop enhagen +ĠT ide +ĠGri zz +ĠS EE +Ġpip elines +Ġsc ars +end o +ag us +ĠE TF +/ # +ĠBec ome +44 8 +Ġvis c +ĠRecomm ended +Ġj umper +Ġcogn ition +Ġassass in +Ġwitness ing +ĠSet up +Ġl ac +v im +IS M +p ages +SS L +35 8 +Ġad ject +indust rial +l ore +cher y +Ġgl itter +Ġc alf +Flor ida +Ġspoil ers +Ġsucceed s +Ġch anting +Ġslog ans +ĠTr acy +Vis it +rol ogy +Ġm ornings +Ġline age +Ġs ip +Ġintense ly +Ġflour ish +ĠSle eping +ĠF em +or por +ĠK lan +ĠDar th +h ack +ĠNi elsen +Ġtum ors +Ġprocure ment +ĠY orkshire +Ġra ided +K Y +An na +Ġ// [ +ĠDis order +ĠMust ang +ĠW en +ĠTry ing +s q +Ġdeliver ies +Ġshut ter +Ġcere bral +Ġbip olar +ĠC N +l ass +j et +Ġdeb ating +> : +Ġe agle +gr ades +ĠD ixon +UG C +M AS +ĠDr aco +ĠMach ines +aff er +Ġem an + ² +pr on +ĠG ym +Ġcompar atively +ĠTrib unal +PR O +Ġle x +Ġfert ile +Ġdep ressing +Ġsuperf icial +ess ential +ĠHun ters +g p +Ġprom inence +L iber +ĠAn cest +ote chnology +Ġm ocking +ĠTra ff +ĸ ļ +Med ium +I raq +Ġpsychiat rist +Quant ity +ĠL ect +Ġno isy +5 20 +G Y +Ġsl apped +ĠM TV +Ġpar a +p ull +Mult iple +as her +Ġn our +ĠSe g +Spe ll +v ous +ord ial +Sen ior +ĠGold berg +ĠPl asma +ne ed +Ġmess enger +ere t +Ġteam ed +Ġliter acy +ĠLe ah +ĠD oyle +Ġem itted +U X +Ġev ade +Ġm aze +Ġwrong ly +ĠL ars +Ġstere otype +Ġpled ges +Ġarom a +ĠM ET +Ġac re +ĠO D +Ġf f +Ġbrew eries +ĠH ilton +und le +ĠK ak +ĠThank fully +ĠCan ucks +in ctions +ĠApp ears +Ġco er +Ġundermin ed +ro vers +And re +Ġbl aze +um ers +Ġfam ine +amp hetamine +ulk an +Am ount +Ġdesper ation +wik ipedia +develop ment +ĠCor inth +uss ia +Jack son +L I +N ative +R s +Oh io +ĠKath leen +F ortunately +Ġattend ant +ĠPre ferred +ĠDid n +ĠV s +M is +Ġrespond ent +Ġb oun +st able +Ġp aved +Ġunex pl +ĠChe ney +L M +ĠC ull +bl own +Ġconfront ing +oc ese +serv ing +W i +ĠLith uania +ann i +Ġst alk +h d +Ġv ener +AP H +ynchron ous +UR R +um ably +hist oric +H alf +H ay +Ġresil ience +spe ction +Ġabandon ing +O bs +ĠDeb bie +Ġgrad ient +ĠPl aint +ĠCan al +AR CH +Ġexpans ive +Ġfun g +Ġb ounced +U nd +Ġprec autions +Ġclar ification +Ġd agger +Ġgri ps +Ġ µ +ĠRiver a +ĠUnd ead +is ites +ĠFIR ST +ñ o +aud i +Ġhost ages +Ġcompl iant +Ġal umni +Se ven +Ġcyber security +e ither +Col lect +Ġinvari ably +ĠS oci +Ġlaw maker +Ġa le +ĠPerson ally +N azi +Ġcustom ization +ĠPro c +ĠSask atchewan +eat uring +Ġsp ared +Ġdiscontin ued +Ġcomput ational +ĠMotor ola +Ġsuprem acist +government al +Ġparad ise +ĠDown ing +ĠNik on +Ġcat alyst +ber ra +Tor onto +8 75 +bet a +ĠMac ron +Ġunreal istic +ve ctor +ĠVeh icles +it iveness +ĠR V +ĠCol bert +s in +o ji +ent in +ĠKr ish +hell o +ff ield +ok y +ĠT ate +Ġmap le +Ġa ids +chem ical +33 4 +n uts +ĠWar p +Ġx x +ĠRob b +umer ous +_- _ +ft ime +ĠV W +Ġw inger +ĠD ome +t ools +ĠP V +ĠGe orgetown +Ġg eared +Ġjihad ists +Ġc p +Ġster oids +M other +cler osis +ĠDR M +nes ia +Ġl inger +Ġimm ersive +ĠC OUN +Ġoutwe igh +ens ual +B and +Ġtransform s +mat ched +ps ons +ĠJud icial +f actor +Ġrefer ral +Ġodd ly +ĠW enger +B ring +ĠB ows +60 2 +IC LE +Ġl ions +ĠAcad emic +ĠTh orn +ĠRa ider +kef eller +St orage +L ower +ĠOr t +ĠEqu ality +AL T +ĠS OC +T ypes +Ġl yn +ĠAss et +co at +TP P +C VE +ĠPione er +app lication +Mod ern +ĠH K +En vironment +Al right +R ain +IP P +ĠShi ite +Ġm ound +ĠAb ilities +cond ition +St aff +Ġcompet ence +ĠM oor +ĠDi ablo +Ġwith held +Ġost ensibly +ĠB rom +Ġms g +Ġden omin +ĠRef erences +ĠF P +Ġplun ged +Ġp amph +m oving +cent ral +Ġdown right +Ġf ading +T al +T yp +ĠTh y +uk es +it he +Ġo ve +Ġbatt led +Ġseaf ood +Ġfig ur +ĠR D +c rop +Ġsqu ads +{ \ +à ¹ +ĠE h +Ġinterview ing +ĠQ in +Ġas piring +PL IC +Ġcla uses +ĠG ast +ĠN ir +Ġl uggage +Ġh ose +Ġsystem d +Ġdesc ending +ĠRev ised +ĠR ails +al ign +70 9 +33 7 +Ġf ug +charg ing +t ags +Ġut er +k ish +WAR NING +49 0 +prof its +Ġvoy age +Ġa ce +ĠV anguard +ĠT anks +ĠM uk +Ġ2 26 +S afe +Ar mor +Ġvolcan ic +Ġwom b +ĠM IL +Ġbegin ner +ĠRec ogn +ĠA AP +PL AY +) ! +Ġdetect ing +c n +Ġbre aches +Bas ically +ĠP ag +ĠMunicip al +ĠInd ie +ĠL af +ĠDis able +ĠOl son +Ġrest rained +Ġrul ings +Ġhum ane +ev ents +ĠCinem a +display Text +ĠH atch +action Date +onna issance +Ġassault ing +ĠL ug +CH AT +Ġvig orous +ĠPer se +Ġintoler ance +ĠSnap chat +ĠSh arks +Ġd ummy +ĠDi agn +ĠGu itar +im eters +40 3 +RE G +A x +Ġsepar ates +ĠMah m +Ġt v +j ah +O OL +C irc +ĠWinds or +uss ian +Ġintu ition +Ġdis dain +ĠDon ovan +Ġ2 21 +E mb +Ġcondem ning +Ġgener osity +zz y +Ġpant ies +ĠPre vent +Action Code +AN A +34 2 +external ActionCode +Ġspec ifying +Ġcryst all +J ere +Ġru pt +ĠApp rentice +Ġprof iling +Ð º +St rike +Ġsid eline +Ġoblig ated +Ġocc ult +Ġbureaucr atic +ant ically +rupt ed +neg ative +ĠEthiop ia +ĠC ivic +Ġins iders +el igible +ĠTV s +ĠB AR +ĠT I +i ologist +ĠA IR +Ġsubstit uted +Ar ab +ĠS aul +ĠY og +p rem +Ġbuild ers +Ġstation ary +Ġdoubt ful +Ġvig orously +Ġthr illing +Ph ysical +ĠCare y +ĠHyd ra +geon ing +ĠS ly +y ton +Ġborrow ers +ĠPark inson +Ġ ë +ĠJama ica +Ġsat ir +Ġinsurg ents +ĠF irm +Ġis ot +ĠK arn +our ning +ak ens +doc s +l ittle +ĠMon aco +CL ASS +Tur key +L y +ĠCon an +ass ic +Ġstar red +ĠPac ers +et ies +Ġt ipping +M oon +ĠR w +s ame +Ġcav ity +Ġgo of +ĠZ o +Sh ock +um mer +Ġemphas izes +Ġreg rett +Ġnovel ty +Ġen vy +ĠPass ive +r w +50 5 +Ġind ifferent +ĠR ica +ĠHim self +ĠFred die +Ġad ip +ä¸ Ģ +Ġbreak out +Ġhur ried +ĠHu ang +ĠD isk +Ġro aming +?????- ?????- +U V +ĠRick y +ĠS igma +Ġmarginal ized +Ġed its +Ġ30 4 +mem ory +Ġspec imen +29 3 +ãģ ¯ +Ġvert ically +Ġaud ition +ĠHe ck +Ġc aster +ĠHold ings +ad al +ĠC ron +ĠL iam +Ġdef lect +P ick +ĠDeb ug +RE F +Ġvers atility +ot hes +class ified +ĠMah ar +ĠH ort +C ounter +st asy +not iced +33 1 +ĠSh im +f uck +ĠB ie +Ġair ing +ĠPro tein +ĠHold ing +Ġspect ators +ili ated +ĠThat cher +n osis +ãĥ¼ ãĥ³ +Te le +B oston +ĠTem pl +st ay +Ġdecl arations +47 9 +Vol ume +ĠDesign er +ĠOver watch +id ae +Ġon wards +Ġn ets +ĠMan ila +part icularly +Ġpolit ic +o other +Ġport raits +Ġpave ment +c ffff +Ġs aints +Ġbegin ners +ES PN +Ġshort comings +âķIJ âķIJ +Ġcom et +ĠOrgan ic +qu el +Ġhospital ized +Bre ak +Ġpe el +dyl ib +asp x +ur ances +ĠT IM +P g +Ġread able +ĠMal ik +Ġm uzzle +Ġbench marks +d al +ĠV acc +ĠH icks +60 9 +ĠB iblical +he ng +Ġover load +ĠCivil ization +Ġimm oral +Ġf ries +ãĤ Ĵ +Ġreprodu ced +Ġform ulation +j ug +ire z +g ear +Ġco ached +Mp Server +ĠS J +ĠK w +In it +d eal +ĠO ro +ĠL oki +ĠSong s +Ġ23 2 +ĠLou ise +asion ally +Ġunc ond +olly wood +Ġprogress ives +ĠEn ough +ĠDo e +Ġwreck age +Ġbr ushed +ĠBase Type +Ġz oning +ish able +het ically +ĠC aucus +ĠH ue +Ġk arma +ĠSport ing +Ġtrad er +Ġseem ing +ĠCapt ure +4 30 +b ish +Ġt unes +Ġindo ors +ĠSp here +ĠD ancing +TER N +Ġno b +ĠG ST +m aps +Ġpe ppers +F it +Ġoverse es +ĠRabb i +ĠR uler +vert ising +off ice +xx x +Ġra ft +Ch anged +Ġtext books +L inks +ĠO mn +ãĢ ij +Ġinconven ience +ĠDon etsk += ~ +Ġimplicit ly +Ġboost s +ĠB ones +ĠBo om +Cour tesy +Ġsens ational +AN Y +Ġgre edy +ed en +Ġinex per +ĠL er +ĠV ale +Ġtight en +ĠE AR +ĠN um +Ġancest or +S ent +ĠH orde +urg ical +all ah +Ġsa p +amb a +ĠSp read +tw itch +Ġgrand son +Ġfract ure +Ġmoder ator +ĠSe venth +ĠRe verse +Ġestim ation +Cho ose +Ġpar ach +Ġbar ric +ãĢ IJ +Ġcomp ass +Ġall ergic +âĢ ķ +OT HER +err illa +Ġw agon +Ġz inc +Ġrub bed +ĠFull er +ĠLuxem bourg +ĠHoo ver +Ġli ar +ĠEven ing +ĠCob b +est eem +Ġselect or +ĠB rawl +is ance +ĠE k +Ġtro op +Ġg uts +ĠApp eal +ĠTibet an +Ġrout ines +ĠM ent +Ġsummar ized +steam apps +Ġtr anqu +Ġ19 29 +or an +ĠAut hent +Ġg maxwell +Ġappre hens +Ġpo ems +Ġsa usage +ĠWeb ster +ur us +Ġthem ed +Ġl ounge +Ġcharg er +Sp oiler +Ġsp illed +h og +ĠSu nder +ĠA in +ĠAng ry +Ġdis qual +ĠFrequ ency +ĠEther net +Ġhel per +Per cent +Ġhorr ifying +Ġa il +ĠAll an +EE E +ĠCross ing +44 9 +Ġh olog +ĠPuzz les +ĠGo es +eren n +60 4 +ãģ ı +ĠRaf ael +Ġatt en +ĠE manuel +Ġup ro +ĠSus p +P sych +ĠTr ainer +ĠN ES +ĠHun ts +bec ue +Ġcounsel or +R ule +Ġtox ins +Ġb anners +r ifice +Ġgreet ing +Ġfren zy +Ġall ocate +Ġ* ) +ex pr +50 3 +ĠCh ick +ĠT orn +Ġconsolid ation +ĠF letcher +sw itch +fr ac +cl ips +ĠMcK in +ĠLun ar +Mon th +IT CH +Ġscholar ly +rap ed +39 8 +Ġ19 10 +Ġe greg +Ġin secure +Ġvict orious +cffff cc +Ġsing led +Ġel ves +ĠW ond +bur st +Ġcam oufl +ĠBL ACK +Ġcondition ed +ç ī +ans wered +Ġcompuls ory +asc ist +Ġpodcast s +ĠFrank furt +bn b +Ġne oliberal +ĠKey board +ĠBel le +w arm +Ġtrust s +Ġins ured +ĠBu cc +us able +60 7 +ĠPl ains +Ġ18 90 +Ġsabot age +Ġlod ged +f elt +Ġg a +ĠN arc +ĠSal em +Ġsevent y +ĠBl ank +p ocket +Ġwhis per +Ġm ating +om ics +ĠSal man +ĠK ad +Ġan gered +Ġcoll isions +Ġextraord inarily +Ġcoerc ion +G host +b irds +è Ģ +k ok +Ġper missible +avor able +Ġpo inters +Ġdiss ip +ac i +Ġtheat rical +ĠCos mic +Ġforget ting +Ġfinal ized +å¤ § +y out +l ibrary +Ġbo oming +ĠBel ieve +ĠTe acher +ĠL iv +ĠGOOD MAN +ĠDomin ican +OR ED +ĠPart ies +Ġprecip itation +ĠSl ot +R oy +ĠComb ined +Ġinteg rating +Ġch rome +Ġintest inal +ĠRe bell +Ġmatch ups +Ġblock buster +ĠLore n +ĠLe vy +Ġpre aching +ĠS ending +ĠPur pose +ra x +f if +Ġauthor itative +ĠP ET +ast ical +Ġdish on +Ġchat ting +Ġ"$ :/ +Connect ion +Ġrecre ate +Ġdel inqu +Ġbro th +ĠD irty +ĠAd min +z man +Ġscholars hips +Ġ25 3 +cont act +als a +7 67 +c reen +abb age +Ġ19 15 +Ġbl ended +Ġal armed +L anguage +35 6 +Ġbl ends +ĠCh anged +W olf +Ġhe pat +Creat ing +Ġper secut +Ġsweet ness +art e +Ġforfe iture +ĠRober to +im pro +N FL +ĠMag net +Det ailed +Ġinsign ificant +ĠPOL IT +ĠBB Q +ĠC PS +Ġse aw +amin er +m L +end if +f inals +Ġ26 5 +u ish +Ġ} ) +ĠPro blems +Ġem blem +Ġserious ness +Ġpars ing +Ġsubst itution +Ġpress ured +Ġrecy cled +ale b +Rub y +Ġprof iciency +Dri ver +ĠW ester +: ' +AF TA +Ġm antle +ĠClay ton +fl ag +Ġpractition er +c overed +ĠSt ruct +add afi +4 25 +ĠTown ship +ĠHyd ro +Lou is +34 3 +Ġcond o +ĠT ao +Ġutil ization +Ġnause a +ĠDem s +rid ges +p ause +Ġform ulas +Ġchall enger +37 6 +Ġdefect ive +ĠRail way +ĠPub Med +Ġyog urt +l bs +ĠNor folk +OP E +ĠMood y +Ġdistribut or +Ġscroll s +Ġextract s +St an +Ġv iability +Ġexp oses +Ġstar vation +ĠStep s +ĠD odd +f ew +ST D +33 2 +Ġclos ures +Ġcomplement ary +ĠS asha +ump y +Ġmon et +Ġartic ulate +ĠDo ct +k iller +Ġsc rim +Ġ2 64 +Ġprost itutes +Ġse vered +Ġattach ments +Ġcool ed +L ev +ĠF alk +f ail +Ġpolic eman +ĠD ag +Ġpray ed +ĠK ernel +Ġcl ut +Ġc ath +Ġan omaly +St orm +em aker +ĠBreak fast +ul i +o ire +J J +h z +Oper ation +ĠS ick +35 4 +ĠGuatem ala +R ate +Ġexp osures +f aces +ĠArch ae +ra f +ĠM ia +Ġ20 25 +Ġop aque +Ġdisgu ised +ĠHead quarters +S ah +Ġp ots +9 78 +ĠM alf +Ġfrown ed +Ġpoison ous +ĠCon vers +ee ks +Ġcr ab +." " +Ġtre ason +Ġr anc +Ġescal ating +Ġwar r +Ġmob s +Ġl amps +ĠSun shine +ĠBrun swick +Ph ones +Ġspe lled +ĠSk ip +Ġ20 50 +Ġ19 11 +ĠPl uto +ĠAm end +Ġme ats +38 7 +Ġst omp +ĠZh ou +ĠLevi athan +ĠHaz ard +ad v +ĠOr well +Ġal oud +Ġb umper +ĠAn arch +ub untu +ĠSer ious +f itting +ĠOption al +ĠCec il +RE AM +Ġser otonin +Ġcultiv ate +ag ogue +} \ +Ġmos ques +ĠSun ny +Ġre active +rev olution +ĠL up +ĠFed ora +Ġdefense man +ĠV ID +ist ine +Ġdrown ing +ĠBroad casting +Ġthr iller +ĠS cy +Ġacceler ating +Ġdirect s +od ied +b ike +d uration +Ġpain fully +R edd +Ġproduct ions +Ġg ag +Ġwh ist +Ġs ock +Ġinf initely +ĠConc ern +ĠCit adel +Ġlie u +Ġcand les +ogene ous +arg er +Ġheaven ly +inflamm atory +Per formance +C s +ruct ose +az aki +Ġp essim +Ġinf erence +Ġpow d +ĠZ oe +Ġpain ts +Ġd azz +pt a +-------- --- +Ġins pir +ĠExper imental +ĠKn ife +reg or +b ors +Ġshow ers +rom eda +Ġs aint +Ġben ign +ĠJ iang +Ġenvision ed +Ġsh roud +IF T +H O +Ġsh uff +ĠI CC +Ġse greg +Ġrevis it +ighth ouse +L i +Ġsub strate +ĠSe as +ĠRew ard +ĠH ep +ĠBr ass +s bm +Ġelim inates +Ġst amina +ĠV AT +ĠLo an +Ġconst raint +Ġappropri ated +Ġp es +ĠA LE +r anging +Ġ40 4 +39 2 +Ġintellectual s +ach u +Ġrestruct uring +ĠLe vin +Ġrun es +Ġdelight ful +Ġcarbohyd rates +ĠMod els +ĠExp o +Ġtransport ing +all oc +Ġring ing +S amsung +Ġscarce ly +ĠURL s +ĠM AS +Ġprot otypes +Ġnarr ator +ĠCPU s +cd n +ĠBart on +Ġdecided ly +ĠSh u +ix ir +oc ious +ĠMy st +N intendo +Ġre use +Ġforg iven +F ew +in ical +n at +Ġseam less +ĠEv a +ĠE VE +ĠJ O +land ers +Ġso fter +neg ie +Ġtrans ient +Ġorb ital +Ġfulf il +ĠK om +Hop efully +Ġdynam ically +ĠHun ger +å Ľ +ĠArmen ia +el man +ber to +Ġp ige +ĠID s +lim it +Ġve ins +Ġso aring +p acks +Gold en +ĠCr ab +ist or +ĠR PM +Ġ$ $ +g ression +Ġjihad ist +Ġgam ble +Ġcare g +Ġinf lated +F ace +ĠFire arms +ĠEm manuel +â Ŀ +Ġsh ocks +gr ab +Ġspl end +ĠHP V +ab ortion +Ab ove +Ent ity +play ers +Ġcomm enced +ul ence +Ġfulfill ment +Ġembod iments +ĠW elfare +Ġha il +Ġ< @ +tt en +Ġcat cher +ĠJ azeera +Ġvolcan o +Ġstabil ize +ĠHand ler +Ġintens ified +ĠAb rams +Ġhum iliation +p aced +60 5 +ĠCent OS +Spe cific +Ġhe ed +ĠC AM +ĠGal ile +D ie +Ġabol ished +ĠThom son +ĠTe achers +ĠW ass +j ong +ĠIS BN +ĠAll ies +sh ake +å · +v ict +How ard +Ġde em +Ġexceed ingly +ĠSmart stocks +ib e +Ġdoor way +Ġcompet ed +ig mat +Ġnational ists +Ġg room +ĠKe en +Ġdispos able +de cl +ĠT olkien +ĠSche me +Ġb iod +Ġav id +ĠEl on +ag ar +ĠT SA +R oman +Ġartific ially +Ġadvis ors +X L +ĠInf erno +36 6 +Ġted ious +ĠPhot ography +ĠCar rie +Ġtro pe +ĠSand ra +Ġdec imal +Que en +ĠGund am +ĠO M +ote ch +N BA +Ġ19 32 +Ġent renched +ĠMar ion +Ġfr aternity +Lab our +Hen ry +Ġlat itude +E ither +Ġenh ances +ĠPot ential +Ġsh ines +id ad +Ġbread th +Ġcapac ities +ĠðŁ ĻĤ +ĠBron x +Ġsex es +Ġdifferent iation +Ġheavy weight +ĠT aj +d ra +Ġmigr ate +Ġexhaust ion +ĠR UN +els ius +ĠCu omo +Ġgu itars +Ġcl ones +ĠSom ew +ĠP ry +------------ - +Ġwarr anted +cy cles +Ġsalv age +Ġdis ks +R ANT +ĠNGO s +ĠMart ian +":[ {" +Ġadd icts +oj ure +il let +Ġamazing ly +art ments +p ixel +ĠGPU s +Lay out +è £ +ĠTam il +ĠBas il +Ġimpart ial +ĠSt ructure +f ork +b ryce +Ġr idge +ĠHamb urg +ri ous +Ġbl itz +cig arettes +Ġcan ned +40 2 +Ġiron ically +Ġcompassion ate +ĠHaw kins +. # +ĠCat hedral +Ġrall ied +in ternal +Ġqu ota +st akes +T EXT +m om +Ġcomple tes +Ġ23 8 +Ġsh rug +ãĥ ij +ĠN inth +Ġrev ise +ĠProv ider +Ġtre acher +Ġqu asi +ĠPR ES +Ġdep osition +Ġconfidential ity +iss ors +Ġim balance +Ġspan ning +Ġang ular +ĠC ul +commun ication +ĠNor a +ĠGen ius +op ter +Ġs acked +Sp ot +Ġfine ly +ĠCH R +28 2 +w aves +Pal est +ĠRo hing +N L +è ¿ +Ġsh itty +ĠSc alia +4 75 +Pro gress +Ġreferen cing +Ġclass rooms +ab ee +Ġs od +hes ion +70 8 +ĠZucker berg +ĠFin ish +ĠScot ia +ĠSav ior +ĠInstall ation +an tha +( - +Ġ30 2 +ĠP unk +Ġcr ater +yout u +Ġro ast +Ġinflu encing +Ġd up +ĠJ R +ĠG rav +Ġstat ure +Ġbath rooms +A side +W iki +me an +ĠZ ak +ĠOn es +ĠN ath +Ġhyper t +Ġcommence ment +C ivil +Ġmoder ately +Ġdistribut ors +Ġbreast feeding +Ġ9 80 +ĠS ik +ĠC ig +ĠAM ER +R IP +ĠCare er +ust ing +Ġmess ed +Ġe h +ĠJ ensen +/ $ +Ġblack mail +Ġconvers ions +Ġscientific ally +Ġmant ra +p aying +Ġiv ory +ĠCour ts +OU GH +aunt let +Ser ial +B row +ĠH undreds +3 23 +Ġpe e +Ġlin ux +Ġsub mer +ĠPrinc ipal +48 5 +ĠD SL +ĠCous ins +Ġdoctr ines +ĠAthlet ics +Ġ3 15 +ĠK arma +Ġatt ent +ur ger +Ġpresc ribe +Ġenc aps +ĠC ame +Ġsecret ive +ĠCr imes +d n +C lean +ĠEgypt ians +ĠCar penter +Ġ ll +H um +ĠMil o +Ġcapital ists +Ġbrief ed +T we +ĠBas in +elve t +M os +Ġplun ge +ĠKa iser +ĠFu j +ill in +Ġsafegu ards +Ġo ste +ĠOpportun ity +ĠM afia +ĠCall ing +ap a +ur ban +br ush +ill ard +c é +int elligence +ĠL ob +ĠDru id +Ġsm oother +Ġfoot ing +Ġmotor ists +arc ity +Ġmascul inity +Ġm ism +Ġabdom inal +ĠTa vern +ĠR oh +Ġesc apes +s igned +Anth ony +Ġsacrific ing +Ġintim acy +Ġan terior +ĠK od +Ġmot if +Ġg raz +Ġvisual ization +Ġguitar ist +ĠTro tsky +m agic +D ar +ĠMor i +Ġw ards +Ġtoile ts +l est +Ġtele port +ĠSund ays +ĠPl at +ET S +Ġe Sports +Pat rick +ĠK atherine +en ko +Ġhas sle +ĠM ick +gg les +Ġh ob +aint ain +Ġair borne +Ġsp ans +Ġch ili +Ġa perture +Ġvolunte ered +ĠInc ident +ĠF res +ĠVeter an +augh tered +ing o +Ġun insured +CL OSE +Ġf use +Ġer otic +Ġadvert ise +ra ising +Text ure +Ġatt ends +ĠRE AL +udd led +Ġsm oot +Ġ30 5 +ĠWill is +Ġbl ond +An alysis +ĠV T +on ica +Ġstrongh old +R F +N M +. >> +Ġprosper ous +Ġbo asted +29 2 +ĠManufact uring +PR ESS +g ren +Ġpharm acy +ĠRoc kefeller +k ai +Ġth umbs +ĠH ut +Ġmother board +Ġguard ians +ĠAl ter +ll ular +Ġsh ack +Ġwise ly +Ġback bone +erv a +Ġsu icides +ĠMcG regor +ij ah +E mer +ĠB rav +Ġdesign ate +P OST +produ ced +Ġcleans ing +irl wind +ex istent +ĠHum ph +ĠPay ne +Ġv ested +Å ¡ +Ġstring ent +ion a +Ġuns ub +Ġsum med +ĠHer cules +sub ject +ĠR agnar +ĠN os +Ġcharacter ization +Ġsav vy +ĠDaw son +ĠCas ino +Ġf ri +ĠBar rier +Ġmis information +Ġins ulation +Ġcorrid ors +Ġair planes +ĠNo ct +ah i +Ġ19 16 +k b +arm ac +Ġsh un +Ġsche ma +Ġhorr ified +Ġ23 9 +aund ers +N B +i ates +er ity +ĠSh ard +Ġr arity +Ġgroup ed +ĠGh ana +again st +ĠBi ological +ĠA ware +ow ell +Ï Ħ +ĠBe au +sh aw +H ack +ĠJul ius +US S +ol son +aun a +c ru +ĠMaur ice +ĠI k +Ġsequ encing +Ġradical s +Ġ( ?, +v irtual +Ġany ways +Ġreper c +Ġhand lers +Ġhes itant +é ĥ +ĠM F +ple mentation +ass ociated +Ġcampaign ed +ĠY ue +ut ations +ĠY oga +Ġsim mer +Ġro ds +Ġmel ody +Ġconv oy +v ideos +Ġscreen ed +N eg +ochem ical +Ġ( )) +Ġultr as +Ġant ip +ĠIsland ers +70 4 +Ġfet ish +Ġridic ulously +ĠK art +Ġmitochond rial +Ġinterf ering +Build er +Ġover fl +Ġac ne +ĠM ud +ĠK err +f lex +ĠPost al +ĠBalt ic +47 7 +ĠPers ons +our age +H B +ĠM use +ĠImm ortal +ĠDri ving +Ġpet itions +Ġsubsc ript +Ġs orce +ĠProcess or +ut on +S ony +Ġph on +Ġr aced +ĠAnth rop +Ġday time +ĠEx ercise +Add ing +Ġeng ages +ĠQual comm +Ġmir acles +Ġmem es +ĠDr ink +ĠOri oles +Ġhair s +ĠPol ar +ath om +Ġsl ippery +ĠR emy +Ġcar amel +ĠY EAR +Ġal k +I gn +a ution +ĠMer lin +ĠC ran +Ġap ologies +Ġ4 10 +Ġout ing +ĠMem ories +app ointed +Ġcount ered +u ld +pos ing +Ġfire wall +ĠW ast +ĠW et +work ed +se ller +Ġrepe aled +ere o +ass uming +BL IC +m ite +ĠCEO s +ĠChap el +ellig ent +________________ ________ +D og +Ġw art +Ġsubsc riber +s ports +Ġbe gged +ĠM V +Ġsem if +eth ical +Ġpre ach +Ġrev ital +Ġpun itive +Ġshort cuts +Ġinstit uted +ĠWars aw +Ġabdom en +ĠK ING +Ġsuper intendent +Ġf ry +ĠGe o +T OR +Ġcontrad ictions +apt ic +Ġlandsc apes +b ugs +Ġcl ust +Ġvol ley +c ribed +Ġt andem +Ġrob es +WH AT +Ġpromot er +Ġel oqu +review ed +ĠD K +ĠPl ato +Ġf ps +T ank +ĠDer rick +Ġpriorit ize +as per +ĠHond uras +ĠCom pleted +ne c +Ġm og +n ir +ĠMay o +DE F +st all +in ness +ĠVolks wagen +Ġprec aution +ĠM ell +i ak +ist ries +Ġ24 8 +Ġoverl apping +Sen ate +ĠEnh ance +res y +rac ial +OR TS +ĠM ormons +Str ong +ĠCo ch +Mex ico +ĠMad uro +Ġj ars +Ġcan e +W ik +oll a +iff erence +Ġphysic ist +ĠMag gie +Ġ28 5 +Ġdep iction +ĠMcL aren +J u +Ġsl ows +Ġcommission ers +ĠWill ow +ĠExpl os +hov ah +Ġtechn ician +Ġhom icides +ĠFl av +ĠTr uman +Ġ100 00 +u ctor +Ġsh ader +News letter +45 7 +Ġre ver +Ġhard ened +Ġwhere abouts +Ġrede velop +Ġcar bs +Ġtra vers +Ġsqu irrel +Ġfoll ower +Ġs ings +50 8 +Ġrabb its +emon ium +Ġdocument ing +Ġmisunder stood +) ' +R ick +gg ies +Ġprem ie +Ġsk ating +Ġpass ports +Ġf ists +aged don +H aw +AC P +0 80 +ĠThough ts +ĠCarl son +Ġpriest hood +h ua +Ġdun geons +ĠLo ans +Ġant is +Ġfamiliar ity +ĠS abb +op al +ĠIn k +st rike +Ġc ram +Ġlegal ized +Ġcu isine +Ġfib re +Tra vel +ĠMon ument +OD Y +eth y +Ġinter state +ĠP UR +em porary +ĠArab ian +develop ed +Ġsadd le +Ġg ithub +ĠOff er +ĠIS P +ro let +ĠSUP ER +ĠDen is +Ġmultipl ier +Ġstir red +Interest ingly +Ġcustom ary +Ġbill ed +he x +Ġmultipl ied +Ġfl ipping +ĠCros by +Ġfundament als +ia e +ĠPlay ed +ĠAt om +am azon +ĠFl am +ee z +activ ated +Ġtables poon +Ġliberal ism +ĠPal in +ĠP atel +N um +ĠT AM +Ġs urn +ĠRel oaded +Ġco ined +" ], +ĠCl ash +ĠAg u +Ġprag matic +ĠActiv ate +Ġ8 02 +Ġtrail ers +Ġsil hou +Ġprob es +Ġcirc us +ĠB ain +ĠLind say +ĠAb bey +Del ivery +Ġconcess ion +Ġgast ro +ĠSpr ite +Ä Ł +and el +Ġg imm +Ġaut obi +ĠT urtle +Ġwonder fully +ĠHar am +ĠWorld wide +ĠHand le +Ġtheor ists +Ġsle ek +ĠZh u +ograph ically +EG A +ĠOwn ers +ath s +ĠAntar ctic +n atal +=" " +fl ags +`` `` +Ġs ul +K h +Ġpot assium +Ġlinem an +Ġcere al +ĠSe asons +Ġ20 22 +Ġmat hematic +Ġastron omers +prof essional +Ġf ares +cknow led +Ġch i +Ġyoung sters +Ġmistaken ly +Ġhem isphere +ĠDiv inity +r one +Ġ" , +r ings +Ġattract s +v ana +å ¹ +C AP +Ġplay list +Ġpor ch +ãģ £ +Ġincorpor ates +Ġso ak +Ġassert ing +ĠTerror ism +ĠP ablo +J a +ces ter +Ġfear ing +ĠPr ayer +Ġescal ated +G W +Ġro be +ĠBright on +ac ists +ĠSym phony +ĠDwar f +ĠPar ade +ĠLe go +Ġinex pl +Ġl ords +le af +RA G +l iber +Ġcig ars +ĠJe hovah +60 6 +WIND OWS +ĠLiber ia +eb us +He avy +Ġl ubric +ĠR W +angu ages +Ġnarrow ed +com puter +ĠE mber +Ġmurder ing +Ġdown stream +ĠT uls +ĠT ables +Top ic +ĠAcc uracy += / +l ost +ĠRe i +Ġprogress es +b ear +Ġestablish ments +Just in +ĠPe ach +ĠG omez +å ¿ +ĠTri angle +Id ent +ĠH ive +Res ources +Ġmix es +ĠAss uming +M u +Ġhyp oc +Ġs ane +ĠW an +id ious +Su ccess +Ġ io +Ang el +Ġdanger ously +ĠCreat ure +W ORK +: [ +ĠKat rina +List ener +M iller +ĠId lib +h ang +Ġcircum vent +h ref +Ġcel estial +ĠWe eks +ĠP ug +ĠDal ton +Ġsubpoen a +uk u +Ġpers isted +pe i +old ing +ĠDoc uments +ĠH ast +ĠC ENT +Ġprim er +Ġsyn onymous +Ġn ib +om bs +Ġnot ation +ĠD ish +ĠAt mosp +Ġforb id +ĠAN G +pat tern +l os +Ġproject iles +b rown +." , +ĠVen om +Ġfierce ly +ub lished +ĠU ran +ĠNic arag +4 10 +ĠC AL +OT OS +ĠMir acle +ĠEn chant +Ġguard ing +app end +Att ach +Ġlevel ed +Ġcond oms +ih ilation +64 9 +Ġnight mares +ĠTHE Y +ĠST ART +ĠK inn +Ġroomm ate +Ġhy giene +o pping +J ob +Ġl vl +ĠV ER +ĠKe eping +ab etic +Ġformat ting +eral a +Ġrev isions +Ġres urg +T el +ĠGood man +35 3 +p od +Ġind isp +ĠTrans lation +Ġg own +ĠM und +Ġc is +Ġby stand +col lect +ĠPun jab +act ively +ĠG amb +te ll +Ġimport ing +g encies +Ġloc om +ĠBr ill +H oly +ĠBer ger +Ġshow down +Ġrespond ers +IL Y +Ġt akedown +le ted +Ġmat tered +Ġpredict ive +Ġover lay +G PU +ĠV ick +Ġconvey ed +T ab +pe er +Sc an +Ġdefensive ly +v ae +Ġappro ving +Ġt iers +ĠV ia +quer ade +ĠSaud is +Ġdemol ished +ĠProp he +Ġmon o +Ġhospital ity +H AM +ĠAri el +M OD +ĠTor ah +Ġbl ah +ĠBel arus +erent ial +ĠT uc +Ġbank er +39 7 +Ġmosqu it +ĠScient ist +ĠMus ical +Ġh ust +Sh ift +Ġtor ment +Ġstand off +E duc +ĠF og +Ġampl ifier +Sh ape +Inst ance +ĠCrit ics +Ġda emon +H ouston +Ġmatt ress +ĠID F +Ġobsc ene +ĠA mer +hett i +Ġcomp iling +35 2 +vere tt +ĠRed uction +ist ration +ĠBl essed +ĠB achelor +3 16 +Ġpr ank +ĠVul can +dd ing +Ġm ourning +ĠQu int +ĠBl aster +test ing +Ġsed iment +>> > +ĠE ternity +ĠWH ERE +ĠM aze +Ġreact ing +ĠAl v +oms day +ĠC RA +Ġtransl ator +Ġbog us +at u +We bsite +oll s +Ġbapt ism +Ġs ibling +ĠAut umn +ve z +ãģ® é +gu ards +Ge org +assad ors +ĠFre ud +Ġcontin ents +ĠReg istry +Bern ie +ĸļ 士 +Ġtoler ant +ĠU W +Ġhor ribly +99 5 +ĠMID I +Ġimpat ient +oc ado +er i +ĠWor st +ĠNor ris +ĠTalk ing +Ġdef ends +ens able +Ġ20 21 +Ġanat omy +L ew +Ġdraw er +ĠCan berra +Ġpatri otic +é¾įå ĸļ士 +ĠAv g +AR M +Ġundis closed +Ġfare well +45 9 +b able +ĠAll ison +OL OG +Ġcon co +t ight +ĠAC PI +ĠM ines +l ich +ĠâĶ ľ +represent ed +200 000 +Ġenthusi ast +OT S +b il +ĠIng redients +Ġinvent or +ĠMy SQL +³³ Âł +ĠAB OUT +with in +Ġm k +B ul +ĠF ake +Ġdracon ian +W a +hel m +ĠTer ran +erv ille +Ġcommon place +SI ZE +Ġ" < +re place +ograph s +ĠSE LECT +inc ible +ĠMost ly +ĠShe ffield +ĠID E +ugg le +Ġcit ations +h urst +ĠUn ix +Ġunle ash +ĠP iper +ĠN ano +Ġsucc umb +Ġreluct ance +Ġ25 00 +ĠMer chant +Ġwire t +Ġcomb os +ĠBirth day +Ġchar coal +ĠU PS +ĠFair fax +Ġdrive way +ĠT ek +ĠP itch +ove re +Ġtechn icians +ĠAct ual +fl ation +ĠF iscal +ĠEm pty +an amo +Ġmag nesium +Ġsl ut +Ġgrow ers +Invest igators +( ): +ĠS atellite +ĠKe ynes +miss ive +l ane +Ġb orough +3 44 +ĠTE AM +ĠBet hesda +C V +h ower +ĠR AD +Ġch ant +ĠR iy +Ġcompos itions +Ġmild ly +Ġmedd ling +Ġag ility +ane ers +5 01 +Ġsyn th +ling er +29 1 +Ġex claimed +Part y +Ġcont amin +ĠMan or +ĠResp ond +Ġpra ising +Ġman ners +fle et +Sum mer +ĠLy nd +ĠDef initely +gr im +Ġbow ling +st ri +ç Ľ +y nt +Ġmand ates +D IV +Ġreconc ile +view s +ĠDam on +vet te +F lo +ĠGreat est +il on +ic ia +Ġportray al +Ġcush ion +50 4 +19 79 +oss al +App lic +sc ription +Ġmit igation +AT S +p ac +Ġer ased +Ġdefic iencies +ĠHolland e +ĠX u +Ġb red +Ġpregn ancies +f emin +Ġem ph +Ġpl anners +Ġout per +utter ing +Ġperpet rator +Ġm otto +ĠEll ison +ĠNE VER +Ġadmitted ly +AR I +ĠAzerbai jan +Ġmill isec +Ġcombust ion +ĠBott le +ĠL und +ĠP s +ĠD ress +Ġfabric ated +Ġbat tered +Ġs idel +ĠNot ting +Fore ign +ĠJer ome +0 20 +ĠAr bit +Ġkn ots +ĠR IGHT +M oving +ãģ Ļ +Ġsur geries +Ġcour thouse +Ġm astered +Ġhover ing +ĠBr an +ĠAl ison +Ġsaf est +m ilitary +Ġbull ied +Ġbar rage +Read er +ES E +ĠGe ographic +T ools +3 14 +ĠGe ek +ro th +gl ers +ĠF IN +Ï ģ +ĠA ston +al tern +48 8 +Ġveter in +G amer +Ġint el +ren ches +Sh ield +Ġam nesty +ĠB har +Ġp iled +Ġhonor able +ĠInst itutes +Ġso aked +Ġcom a +ĠE FF +34 1 +by tes +ĠG mail +le in +ĠCanad iens +m aterial +I l +Ġinstruct ors +ĠK Y +Ġconce ive +ub b +ĠP ossible +Ġeas ing +ĠChrist ina +Ġcar ic +ĠHD R +R OM +Ġsho vel +de lete +Ġp uff +ĠCh anging +Ġseam lessly +Att ribute +Ġacqu isitions +ak ery +ĠE F +Ġaut istic +ĠT akes +ĠPow der +ĠSt ir +5 10 +ĠBub ble +sett ings +ĠF owler +Ġmust ard +Ġmore over +Ġcopyright ed +ĠLED s +15 00 +æ ī +ĠH IS +en f +Ġcust od +ĠH uck +G i +Ġim g +An swer +C t +j ay +ĠInf rastructure +Ġfeder ally +L oc +Ġmicro bes +Ġover run +dd s +ot ent +adi ator +>>>> >>>> +Ġtorn ado +Ġadj ud +Ġintrig ued +Ġs i +ĠRevel ation +pro gress +Ġburgl ary +ĠSai yan +ĠK athy +Ġser pent +ĠAndre as +Ġcomp el +ess ler +ĠPl astic +ĠAd vent +ĠPos itive +ĠQ t +ĠHind us +reg istered +ular ity +Ġrighteous ness +Ġdemon ic +u itive +ĠB DS +ĠGre gg +c ia +ĠCrus ade +ĠSina i +W ARE ++ ( +Ġme ll +Ġder ail +y ards +A st +Ġnotice ably +ĠO ber +R am +Ġun noticed +Ġse q +av age +T s +Ġ6 40 +Ġconced e +Ġ] ) +F ill +Ġcapt ivity +ĠImprove ment +ĠCrus ader +ara oh +M AP +æ Ĺ +Ġstr ide +al ways +F ly +N it +Ġal gae +ĠCook ing +ĠDo ors +Mal ley +Ġpolic emen +ãģ į +Ġastron aut +access ible +49 5 +ĠR AW +cl iffe +udic rous +Ġdep ended +al ach +Ġvent ures +ra ke +Ġt its +ĠH ou +Ġcond om +ormon al +Ġind ent +Ġupload ing +Foot note +Import ant +Ġ27 1 +Ġmind ful +Ġcont ends +C ra +Ġcal ibr +ĠO ECD +plug in +F at +ĠIS S +ĠDynam ics +ans en +68 6 +' ), +Ġsp rite +Ġhand held +ĠH ipp +=~ =~ +Tr ust +Ġsem antics +ĠBund es +ĠRen o +ĠLiter ature +s ense +G ary +ĠA eg +ĠTr in +EE K +Ġcler ic +ĠSS H +Ġch rist +Ġinv ading +ib u +Ġen um +aur a +Ġal lege +ĠInc redible +B BC +Ġth ru +Ġsa iled +Ġem ulate +Ġin security +Ġc rou +Ġaccommod ations +Ġincompet ent +Ġsl ips +ĠEarth qu +s ama +IL LE +Ġi Phones +as aki +Ġby e +Ġar d +Ġext ras +Ġsl aughtered +Ġcrowd funding +res so +Ġfil ib +ĠER ROR +ĠT LS +e gg +ĠIt al +Ġen list +ĠCatal onia +ĠSc ots +Ġser geant +Ġdiss olve +N H +Ġstand ings +ri que +I Q +Ġbenef iciary +Ġaqu arium +You Tube +ĠPower Shell +Ġbright est +ĠWar rant +S old +Writ ing +Ġbegin nings +ĠRes erved +ĠLatin os +head ing +Ġ4 40 +Ġrooft op +AT ING +Ġ3 90 +VP N +G s +k ernel +turn ed +Ġprefer able +Ġturn overs +ĠH els +S a +ĠShin ji +ve h +ĠMOD ULE +V iol +Ġex iting +Ġj ab +ĠVan illa +Ġac ron +ĠG ap +ber n +A k +ĠMc Gu +Ġend lessly +ĠFar age +ĠNo el +V a +M K +Ġbr ute +ĠK ru +ĠES V +ĠOl ivia +âĢ ł +ĠK af +Ġtrust ing +Ġh ots +3 24 +Ġmal aria +Ġj son +Ġp ounding +ort ment +Count ry +Ġpostp oned +Ġunequ iv +? ), +ĠRo oney +udd ing +ĠLe ap +ur rence +sh apeshifter +ĠH AS +os ate +Ġca vern +Ġconserv atism +ĠB AD +Ġmile age +Ġarrest ing +V aults +Ġmix er +Dem ocratic +ĠB enson +Ġauth ored +8 000 +Ġpro active +ĠSpirit ual +t re +Ġincarcer ated +ĠS ort +Ġpe aked +Ġwield ing +re ciation +×Ļ × +P atch +ĠEm my +Ġex qu +tt o +ĠRat io +ĠP icks +ĠG ry +ph ant +Ġf ret +Ġeth n +Ġarch ived +% - +c ases +ĠBl aze +Ġim b +c v +y ss +im ony +Ġcount down +Ġaw akening +ĠTunis ia +ĠRe fer +ĠM J +Ġun natural +ĠCar negie +iz en +ĠN uggets +he ss +Ġev ils +64 7 +Ġintrodu ctory +l oving +ĠMcM ahon +Ġambig uity +L abel +ĠAlm ighty +Ġcolor ing +ĠCl aus +set ting +N ULL +ĠF avorite +ĠS IG +> ( +ĠSh iva +ĠMay er +Ġstorm ed +ĠCo verage +we apons +igh am +Ġun answered +Ġle ve +Ġc oy +c as +b ags +as ured +Se attle +ĠSant orum +ser ious +Ġcourage ous +ĠS oup +Ġconfisc ated +Ġ// / +Ġuncon ventional +Ġmom s +ĠRohing ya +ĠOrche stra +ĠPot ion +Ġdisc redit +ĠF IL +f ixed +ĠDe er +do i +ĠDim ension +Ġbureaucr ats +et een +Ġaction Group +oh m +Ġb umps +ĠUt ility +Ġsubmar ines +ren heit +re search +ĠShap iro +Ġsket ches +Ġde ceptive +ĠV il +es ame +ĠEss entially +Ġramp age +isk y +Ġmut tered +th ritis +Ġ23 6 +f et +b ars +Ġpup il +ĠTh ou +o S +s ong +Ġfract ured +Ġre vert +pict ure +Ġcrit erion +us her +Ġreperc ussions +ĠV intage +ĠSuper intendent +Offic ers +Ġflag ged +Ġbl ames +Ġin verse +ograp hers +Ġmakes hift +Ġdev oid +Ġfoss ils +ĠArist otle +ĠFund s +Ġde pleted +ĠFl u +ĠY uan +Ġw oes +Ġlip id +Ġsit u +requ isites +Ġfurn ish +ĠSam ar +Ġshame ful +Ġadverse ly +Ġad ept +Ġrem orse +Ġmurder ous +uck les +ĠE SL +Ġ3 14 +s ent +Ġred ef +ĠC ache +ĠP urs +ig ans +Ġ4 60 +Ġpres criptions +Ġf res +F uck +ocr ates +Tw enty +ĠWe ird +ĠT oggle +ĠC alled +itiz ens +Ġp oultry +Ġharvest ing +ãĤ¦ ãĤ¹ +Bott om +Ġcaution ed +t n +39 6 +ĠNik ki +Ġeval uations +Ġharass ing +Ġbind ings +ĠMon etary +Ġhit ters +Ġadvers ary +un ts +Ġset back +Ġenc rypt +ĠC ait +Ġl ows +eng es +ĠN orn +Ġbul bs +Ġbott led +ĠVoy ager +3 17 +Ġsp heres +p olitics +Ġsubt ract +Ġsens ations +Ġapp alling +Ġ3 16 +Ġenvironment ally +ĠST EM +Ġpub lishes +5 60 +Ġdilig ence +48 4 +Ġadv ises +Ġpet rol +Ġimag ining +Ġpatrol s +ĠInt eger +ĠAs hes +act us +ĠRad iant +ĠL T +it ability +ht aking +Set ting +Ġnu anced +ĠRe ef +ĠDevelop ers +N i +pie ces +99 0 +Lic ense +Ġlow ers +ĠOtt oman +3 27 +oo o +Ġqu itting +mark ets +Beh ind +Ġbas in +Ġdoc s +an ie +fl ash +ct l +Ġcivil ized +ĠFuk ushima +"] ," +ĠK S +ĠHonest ly +ar at +Ġconstruct s +ĠL ans +ĠD ire +ĠLI KE +ĠTrou ble +Ġwith holding +ĠOb livion +Ġsan ity +any a +Con st +Ġgro cer +ĠC elsius +Ġrecount ed +ĠW ife +B order +ate red +h appy +Ġspo iler +Ġlog ically +H all +Ġsucceed ing +Ġpoly morph +Ġax es +ĠShot gun +ĠS lim +ĠPrin ciples +ĠL eth +art a +Ġsc or +Sc reenshot +Ġrelax ation +#$ #$ +Ġdeter rent +idd y +Ġpower less +Ġles bians +Ġch ords +ĠEd ited +se lected +Ġseparat ists +000 2 +Ġair space +Ġturn around +Ġc unning +P ATH +P oly +Ġbomb ed +Ġt ion +x s +Ġwith hold +Ġw aged +ĠLiber ties +Fl ag +Ġcomfort ing +45 4 +ĠI ris +are rs +Ġr ag +Ġrel ocated +ĠGu arant +Ġstrateg ically +Ġgam ma +uber ty +ĠLock heed +g res +Ġgr illed +ĠLow e +st ats +ĠR ocks +Ġsens ing +Ġrent ing +ĠGe ological +ا Ø +ot rop +Ġse w +Ġimproper ly +48 6 +Ġâĸ ł +Ġstar ving +ĠB j +Disc ussion +3 28 +ĠCom bo +ĠFix es +N AT +Ġstri ving +th ora +Ġharvest ed +ĠP ing +Ġplay ful +Ġaven ues +Ġoccup ational +Ġw akes +ĠCou rier +Ġdrum mer +ĠBrow ser +ĠH outh +it u +Ġapp arel +p aste +Ġhun ted +ĠSecond ly +l ain +X Y +ĠP IN +ic ons +Ġcock tails +Ġs izable +Ġhurd les +est inal +ĠRecre ation +Ġe co +64 8 +ĠD ied +m int +Ġfinger prints +Ġdis pose +ĠBos nia +ts y +22 00 +Ġins pected +ĠF ou +Ġf uss +Ġamb ush +ĠR ak +Ġmanif ested +Pro secut +Ġsuff ice +ren ces +Ġcompens ated +ĠC yrus +Ġgen us +ĠWolver ine +ĠTrend s +Ġh ikes +ĠSe en +Ġen rol +C old +Ġpol itely +ĠSl av +ĠRu pert +Ġey ewitness +ĠAl to +Ġun comp +Ġposter ior +M ust +ĠHer z +Ġprogress ively +Ġ23 4 +Ġind ifference +ĠCunning ham +Ġacadem ia +Ġse wer +Ġast ounding +ĠA ES +r ather +Ġeld est +Ġclim bs +ĠAdd s +Ġout cry +Ġcont ag +ĠH ouses +Ġpe pt +ĠMel ania +interest ed +ĠU CH +ĠR oots +ĠHub bard +ĠT BD +ĠRoman ian +fil ename +St one +ĠIm pl +Ġchromos ome +C le +d x +Ġscram bled +ĠP t +Ġ24 2 +OP LE +Ġtremend ously +St reet +Ġcra ving +Ġbund led +ĠR G +p ipe +Ġinj uring +Ġarc ane +Part icip +ĠHero ic +st y +Ġto pping +ĠTemp est +rent ices +b h +Ġpar anoia +ĠUnic ode +Ġegreg ious +Ġ\ ' +ĠOsw ald +Ġgra vel +ĠSim psons +Ġbl and +ĠGuant anamo +Writ er +lin ers +ĠD ice +J C +Ġpar ity +Ġs ided +Ġ23 7 +ĠPyr rha +at ters +d k +F ine +comp an +Ġform ulated +ĠId ol +il ers +hem oth +ĠF av +Ġintr usion +Ġcar rots +ĠL ayer +ĠH acker +Ġ ---------------- +Ġmoder ation +é ģ +oc oc +Ġcharacter ize +ĠTe resa +Ġsocio economic +Ġper k +ĠParticip ation +tr aining +ĠPaul o +ph ys +Ġtrust worthy +Ġembod ied +ĠMer ch +c urrency +ĠPrior ity +Ġte asing +Ġabsor bing +Ġunf inished +ĠCompar ison +Ġdis ple +writ ers +Ġprofess ions +ĠPengu in +Ġang rily +ĠL INK +68 8 +ĠCor respond +Ġprev ailed +Ġcart el +l p +as ms +ĠRed emption +ĠIslam ists +effect s +d ose +ĠL atter +ĠHal ifax +Ġv as +ĠTop ics +ĠN amed +advert ising +zz a +IC ES +Ġret arded +ach able +ĠPupp et +ĠItem Level +Ġret ract +Ġident ifiable +A aron +ĠB uster +s ol +hel le +as semb +H ope +r anged +B a +ĠP urch +é Ģ +ĠSir i +Ġarri vals +Ġ19 12 +Ġshort ened +Ġ3 12 +Ġdiscrep ancy +ĠTem perature +ĠWal ton +Ġkind erg +p olit +Ġrem ix +Ġconnect ors +ãĥĺ ãĥ© +ĠKazakh stan +dom inated +Ġsu gars +im ble +ĠPan ic +ĠDem and +ĠCol ony +on en +ĠM ER +7 75 +ur ia +aza ar +ĠDeg ree +P ri +Ġsun shine +Ġ25 1 +Ġpsychedel ic +Ġdigit ally +ĠBra un +Ġsh immer +Ġsh ave +ĠTel esc +ĠAst ral +ĠVenezuel an +ĠO G +Ġc rawling +Int eg +ĠFe ather +Ġunfold ing +Ġappropri ation +Ġè£ı è +ĠMob ility +ĠN ey +- . +b ilt +L IN +ĠT ube +ĠCon versely +Ġkey boards +ĠC ao +Ġover th +Ġla ure +>> \ +ĠV iper +ach a +Off set +ĠR aleigh +ĠJ ae +J ordan +j p +Ġtotal itarian +Connect or +Ġobserv es +ĠSpart an +ĠIm mediately +ĠSc al +C ool +Ġt aps +Ġro ar +P ast +Ġch ars +ĠB ender +ĠShe ldon +Ġpain ter +Ġbe acon +ĠCreat ures +Ġdownt urn +Ġh inder +ĠAnd romeda +à Ľ +cc oli +ĠF itness +et rical +Ġutil izes +Ġsen ate +Ġen semble +Ġche ers +T W +Ġaff luent +k il +ry lic +ord ering +Com puter +Ġgru esome +ost ics +ĠUb isoft +ĠKel ley +Ġw rench +Ġbourgeois ie +IB LE +ĠPrest on +w orn +ar ist +reat ing +Ġst ained +ar ine +Ġsl ime +EN N +Ġche sts +Ġground water +ann ot +ĠTr ay +ĠLoc ke +ĠC TR +Ġd udes +ĠEx ternal +ĠDec oder +Ġpar amed +ĠMed line +80 9 +ĠD inner +rup al +g z +ĠG um +ĠDem o +j ee +Ġd h +ber man +arch s +Ġen qu +ĠEp stein +Ġdevast ation +Ġfriends hips +ĠAr d +Ġ23 1 +ĠRub in +ĠDist ance +Ġsp urred +Ġd ossier +Ġover looking +\\\\\\\\ \\\\\\\\ +Fore st +ĠCom es +\ ", +ĠIran ians +Ġf ixtures +L aughs +Ġcur ry +ĠKing ston +Ġsqu ash +Ġcat alogue +Ġabnormal ities +Ġdigest ive +.... ..... +Ġsubord inate +og ly +Ġ24 9 +M iddle +Ġmass ac +Ġburg ers +Ġdown stairs +Ġ19 31 +39 4 +ĠV G +Ġl asers +ĠS ikh +ĠAlex a +der ived +Ġcycl ist +ãģ® éŃĶ +onel iness +!!!! !!!! +Ġbuff s +leg ate +Ġrap ing +Ġrecomm ending +ro red +Ġmult icultural +un ique +Ġbusiness men +Ġune asy +ĠM AP +Ġdisp ersed +cipl ine +J ess +ĠK erala +å § +Ġabst raction +Sur v +U h +Ġprin ters +ij a +ow der +Ġanalog ous +ĠA SP +af er +Ġunfold ed +Ġlevel ing +Ġbre ached +ĠH earing +Ġn at +Ġtransl ating +crit ical +Ġant agonist +ĠYes terday +Ġfuzz y +w ash +m ere +Ġbe wild +ĠM ae +V irgin +ph rase +Ġsign aled +ĠH IGH +Ġprot ester +Ġgar ner +unk nown +Ġk ay +Ġabduct ed +Ġst alking +am n +Ġdes erving +ĠR iv +ĠJ orge +Ġscratch ing +ĠS aving +ip ing +Ġte ase +Ġmission ary +ĠMor row +T IME +P resent +Ġchem otherapy +tern ess +ĠH omes +ĠP urdue +Ġst aunch +ĠWhit ney +ĠTH ERE +Î ¼ +iat us +ĠErn est +ĠDe ploy +Ġcove ted +F ML +ĠDial ogue +Ġex ited +f ruit +Ġner d +":" "," +Ġv ivo +ru ly +4 60 +ĠAm en +rehens ible +Ġâ ĺ +D IR +Ġad herence +Ġche w +ĠCo ke +ĠSerge i +dig ital +ĠNe ck +g ently +enth al +/ ) +Ġwe ary +Ġgu ise +ĠConc ord +ĠOn ion +at cher +Ġb inge +ĠDirect ive +Ġman ned +ans k +Ġill usions +Ġbillion aires +38 3 +oly n +odynam ic +ĠWhe at +ĠA lic +Ġcol oured +ĠN AFTA +ab o +Ġmac ros +ind ependent +s weet +Ġsp ac +ĠK abul +Ġ Ä +em e +Ġdict ated +Ġsh outs += { +Ġr ipping +ĠSh ay +ĠCr icket +direct ed +Ġanalys ed +ĠWAR RANT +ag ons +ĠBlaz ers +Ġche ered +Ġar ithmetic +ĠTan z +37 3 +ĠFl ags +Ġ29 5 +Ġw itches +ĠIn cluded +ĠG ained +ĠBl ades +G am +ĠSam antha +ĠAtl antis +ĠPr att +Ġspo iled +ĠI B +ĠRam irez +Pro bably +re ro +ĠN g +ĠWar lock +t p +Ġover he +Ġadministr ations +Ġt int +Ġreg iment +Ġpist ols +Ġblank ets +Ġep ist +Ġbowl s +Ġhydra ulic +Ġde an +Ġj ung +Ġasc end +70 5 +ĠSant iago +à ® +Ġun avoid +ĠSh aman +re b +Ġstem ming +99 8 +ĠM G +st icks +esthes ia +ER O +Ġmor bid +ĠGr ill +ĠP oe +any l +Ġdele ting +ĠSurve illance +Ġdirect ives +Ġiter ations +ĠR ox +ĠMil ky +F ather +Ġpat ented +44 7 +Ġprec ursor +Ġm aiden +ĠP hen +ĠVe gan +ĠPat ent +K elly +Redd itor +Ġn ods +Ġvent ilation +ĠSchwar z +Ġw izards +Ġomin ous +ĠHe ads +ĠB G +Ġl umber +ĠSp iel +Ġis Enabled +Ġancest ral +ĠSh ips +Ġwrest ler +ph i +Ġy uan +ĠRebell ion +Ġice berg +Ġmag ically +Ġdivers ion +ar ro +yth m +ĠR iders +ĠRob bie +ĠK ara +ĠMain tenance +ĠHer b +Ġhar ms +p acked +ĠFe instein +Ġmarry ing +Ġbl ending +ĠR ates +Ġ18 80 +Ġwr ink +ĠUn ch +ĠTor ch +desc ribed +Ġhuman oid +ilit ating +ĠCon v +ĠFe ld +IGH TS +Ġwhistlebl ower +ort mund +ets y +arre tt +ĠMon o +ĠI ke +ĠC NBC +ĠW AY +ĠMD MA +ĠIndividual s +Ġsupplement al +Ġpower house +ĠSt ru +F ocus +aph ael +ĠCol leg +att i +Z A +Ġp erenn +ĠSign ature +ĠRod ney +Ġcub es +idd led +ĠD ante +ĠIN V +iling ual +ĠC th +Ġso fa +Ġintimid ate +ĠR oe +ĠDi plom +ĠCount ries +ays on +Ġextrad ition +Ġdis abling +ĠCard iff +Ġmemor andum +ĠTr ace +Ġ?? ? +se ctor +ĠRou hani +ĠY ates +ĠFree ze +Ġbl adder +M otor +ĠProm ise +ant asy +Ġforesee able +ĠC ologne +cont ainer +ĠTre es +ĠG ors +ĠSin clair +Ġbar ring +key e +Ġsl ashed +ĠStat istical +é ĩ +Ġâĸ º +All ows +Ġhum ility +Ġdr illed +ĠF urn +44 3 +Ġse wage +Ġhome page +Ġcour tyard +Ġv ile +Ġsubsid iaries +aj o +direct ory +Ġam mon +V ers +charg es +Ġ} } +ĠCh ains +Ġ24 6 +n ob +Ġper cept +Ġg rit +Ġfisher men +ĠIraq is +ĠDIS TR +ĠF ULL +ĠEval uation +g raph +at ial +Ġcooper ating +Ġmel an +Ġenlight ened +Ġal i +t ailed +Ġsal ute +Ġweak est +ĠBull dogs +U A +ĠAll oy +Ġsem en +oc ene +ĠWilliam son +s pr +, âĢĶ +ĠG F +itt ens +Be at +ĠJ unk +iph ate +ĠFarm ers +ĠBit coins +ig ers +d h +ĠL oyal +p ayer +Ġentert ained +Ġpenn ed +Ġcoup on +Que ue +Ġweaken ing +c arry +Ġunderest imate +Ġshoot out +Ġcharism atic +ĠProced ure +Ġprud ent +in ances +Ġric hes +Ġcort ical +Ġstr ides +Ġd rib +ĠOil ers +5 40 +ĠPer form +ĠBang kok +Ġe uth +S ER +Ġsimpl istic +t ops +camp aign +Q uality +Ġimpover ished +ĠEisen hower +Ġaug ment +ĠH arden +Ġinterven ed +Ġlist ens +ĠK ok +Ġs age +Ġrub bish +ĠD ed +Ġm ull +pe lling +Ġvide ot +Produ ction +D J +m iah +Ġadapt ations +Ġmed ically +Ġboard ed +Ġarrog ance +Ġscra pped +Ġopp ress +FORM ATION +Ġj unction +4 15 +EE EE +S kill +Ġsub du +ĠSug gest +ĠP ett +Ġle tt +ĠMan ip +ĠC af +ĠCooper ation +T her +Ġreg ained +¶ æ +ref lect +Ġth ugs +ĠShel by +Ġdict ates +ĠWe iner +ĠH ale +Ġbatt leground +s child +Ġcond ol +h unt +osit ories +Ġacc uses +Fil ename +Ġsh ri +Ġmotiv ate +Ġreflect ions +N ull +ĠL obby +¥ µ +ĠS ATA +ĠBack up +Ñ ĥ +n in +ĠCor rection +Ġju icy +ut ra +ĠP ric +Ġrest raining +ĠAir bnb +ĠAr rest +Ġappropri ations +Ġsl opes +Ġmans laughter +Ġwork ings +ĠH uss +ĠF rey +Le ave +ĠHarm ony +ĠF eder +Ġ4 30 +Ġt rench +Ġglad ly +Ġbull pen +ĠG au +b ones +Ġgro ove +Ġpre text +ã ħĭ +Ġtransm itter +ĠComp onent +Ġunder age +ĠEm pires +T ile +Ġo y +ĠMar vin +ĠC AS +Ġbl oss +Ġrepl icated +ĠMar iners +Marc us +ĠBl ocks +Ġliber ated +Ġbutter fly +Fe el +Ġfer mentation +Ġyou tube +Ġoff end +ĠTer m +res ist +Ġcess ation +Ġinsurg ency +Ġb ir +ĠRa ise +59 5 +Ġhypothes es +50 2 +Ġpl aque +ocr at +Ġjack ets +ĠHuff Post +am ong +Ġconf er +48 7 +ĠL illy +Ġadapt ing +ĠF ay +Ġsh oved +ve c +Ġref ine +Ġg on +Ġgun men +z ai +ĠShut tle +ĠI zan +Ġ19 13 +Ġple thora +· · +Ġ5 10 +Ġp uberty +Ġ24 1 +ĠWe alth +ĠAl ma +ĠM EM +ĠAd ults +C as +pr ison +R ace +Ġwater proof +Ġathlet icism +Ġcapital ize +ĠJu ice +Ġillum inated +ĠP ascal +Ġirrit ation +ĠWitness es +ad le +ĠAst ro +Ġf ax +ĠEl vis +Prim ary +ĠL ich +ĠEl ves +Ġres iding +Ġst umble +3 19 +ĠP KK +Ġadvers aries +D OS +ĠR itual +Ġsm ear +Ġar son +ident al +Ġsc ant +Ġmon archy +Ġhal ftime +Ġresid ue +Ġind ign +ĠSh aun +ĠEl m +aur i +A ff +W ATCH +ĠLy on +hel ps +36 1 +Ġlobby ist +Ġdimin ishing +Ġout breaks +Ġgo ats +f avorite +ĠN ah +son ian +ĠBo oster +Ġsand box +ĠF are +ĠMalt a +Ġatt Rot +ĠM OR +ld e +Ġnavig ating +T ouch +Ġunt rue +ĠDis aster +Ġl udicrous +Pass word +ĠJ FK +blog spot +4 16 +ĠUN DER +ern al +Ġdelay ing +T OP +Ġimpl ants +ĠAV G +ĠH uge +att r +Ġjournal istic +ĠPe yton +ĠI A +R ap +go al +ĠProgram me +Ġsm ashing +w ives +print ln +ĠPl ague +in us +EE P +Ġcru iser +ĠPar ish +umin ium +Ġoccup ants +ĠJ ihad +m op +Ġp int +Ġhe ct +ĠMe cca +direct or +ĠFund ing +ĠM ixed +Ġst ag +T ier +Ġg ust +Ġbright ly +ors i +Ġup hill +R D +Ġles ions +ĠBund y +liv ious +Ġbi ologist +ĠFac ulty +ĠAuthor ization +Ġ24 4 +All ow +ï ¸ +ĠGi ul +Ġpert inent +ot aur +es se +ĠRo of +Ġunman ned +35 1 +ĠSh ak +ĠO rient +Ġend anger +D ir +Ġrepl en +ed ient +Ġtail or +Ġgad gets +Ġaud ible +âĺ Ĩ +N ice +Ġbomb ard +ĠR ape +Ġdef iance +ĠTW O +ĠFilip ino +Ġunaff ected +erv atives +Ġso ared +ĠBol ton +Ġcomprom ising +ĠBrew ers +R AL +ĠA HL +icy cle +Ġv ampires +Ġdi pped +oy er +ĠX III +Ġsidew ays +ĠW aste +ĠD iss +ĠâĶľ âĶĢâĶĢ +$ . +Ġhabit ats +ĠBe ef +tr uth +tr ained +spl it +R us +And y +ĠB ram +RE P +p id +è£ ħ +ĠMut ant +An im +ĠMar ina +Ġfut ile +hig hest +f requency +Ġepile psy +Ġcop ing +Ġconc ise +Ġtr acing +ĠS UN +pan el +ĠSoph ie +ĠCrow ley +ĠAd olf +ĠShoot er +Ġsh aky +ĠI G +ĠL ies +ĠBar ber +p kg +Ġupt ake +Ġpred atory +UL TS +/ ** +Ġintox icated +ĠWest brook +od der +he ment +Ġbas eman +AP D +st orage +ĠFif ty +ed itor +G EN +UT ION +ir ting +Ġse wing +r ift +Ġag ony +ĠS ands +Ġ25 4 +C ash +Ġl odge +Ġp unt +N atural +ĠIde as +Ġerrone ous +ĠSens or +ĠHann ity +Ġ19 21 +Ġm ould +ĠG on +kay a +Ġanonym ously +ĠK EY +Ġsim ulator +W inter +Ġstream ed +50 7 +? ", +Ġte ased +Ġco efficient +Ġwart ime +ĠTH R +' '. +ĠBank ing +mp ire +Ġf andom +Ġl ia +G a +Ġdown hill +Ġinterpre ting +Ind ividual +N orm +Ġjealous y +bit coin +Ġple asures +ĠToy s +ĠChev rolet +ĠAd visor +IZ E +Ġrecept ions +70 6 +C ro +Ġ26 2 +Ġcit rus +ir u +Review er +ject ed +U ES +an z +19 81 +ĠWork er +Ġcompl ied +ores cent +contin ental +T on +ĠPr ism +ĠShe ep +Ġ28 8 +n ox +ĠV og +O rd +Ġreal ms +te k +Ġirrig ation +Ġbicy cles +Ġelectron ically +p oly +t all +() ); +Ġaest hetics +ĠInteg rated +Expl ore +Ġd unk +47 6 +p ain +ĠJac ques +ĠD mit +Fram es +Ġreun ited +Ġhum id +D ro +P olitical +Ġyouth ful +Ġent ails +Ġmosqu ito +36 3 +spe cies +Ġcoord inating +ĠMay hem +ĠMagn us +M ount +Impro ved +ĠST ATE +ATT LE +Ġflow ed +Ġtack led +Ġfashion ed +Ġre organ +iv ari +f inger +Ġreluct antly +et ting +ĠV and +you ng +ĠGar land +Ġpresum ption +Ġamen ities +ĠPle asant +on ential +ĠO xy +Ġmor als +ĠY ah +Read y +Sim on +En h +D emon +Ġcl ich +Mon itor +ĠD U +Ġwel comes +Ġstand out +Ġdread ful +Ġban anas +Ġball oons +h ooting +bas ic +Ġsuff ix +Ġd uly +can o +Ch ain +at os +Ġgeop olitical +Ġ( & +ĠGem ini +ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ +Ġacqu itted +L uck +prot ect +10 24 +Ġsc arcity +Ġmind fulness +ec ided +D N +pr ime +ĠPres idents +ĠVID EO +Ġ( âĪĴ +add ock +N OR +ĠP ru +p un +ĠL OL +)) )) +ĠL iqu +ĠS AS +Ġsty ling +Ġpunish ments +Ġnum b +Ġasc ertain +ĠRock ies +f lu +Th umbnail +Ġperpet rated +ĠSem i +Ġdis arm +ĠOld er +ĠEx ception +Ġexponent ially +ĠCommun ities +Ġabol ish +ĠPart ner +pt oms +Ġ7 77 +ĠFo ley +ĠC ases +Ġgre ase +ĠReb irth +G round +Ġ; ) +ĠDoct rine +ik ini +Y e +ĠBl ossom +Ġpers ists +b ill +Ġinf usion +Ġbud dies +9 11 +ĠPat ient +Ġdem os +Ġacquaint ance +ĠP aw +at ari +Ġx ml +Ġfasc ination +ĠSer ve +Ï Ĥ +br anded +Ġa z +Return s +Ġover shadow +Ġro am +Ġspeed y +n umbered +hel ial +Ġdisc iple +Ġass urances +g iven +pect ing +ĠN atalie +çĶ ° +Ġmosquit oes +rote in +Ġnumer ic +Ġindepend ents +Ġtrans itional +Ġreaction ary +ĠMech dragon +do ctor +Ġshort est +Ġsequ ential +ĠB ac +ĠAccount s +ãģ Į +ach y +ract ive +ĠReg iment +Ġbreat htaking +ffic iency +ĠB ates +Ġ3 11 +Ġward robe +ft s +ĠBer k +Sim ply +ĠRivers ide +iver ing +ident ial +lu cent +Ġen riched +ĠCon ver +ĠG iving +ãĥ Ļ +Ġlegal ize +ĠF TC +Ġfre aking +M ix +Ġter restrial +es ian +ci ents +W ing +LO AD +Ġled ge +ĠViol ent +ĠMet all +Ġ30 8 +Ġs outheastern +hett o +M eat +Ġslow down +Ġret reated +Jere my +end as +**** * +er ic +Ġre ins +opp able +ĠHuman ity +ear ances +rig an +C amera +Ġwa ivers +s oc +Ġalter ation +trans form +ĠC emetery +50 6 +Ġindef inite +Ġstim ulating +y g +60 3 +ĠS op +Ġdescript ive +Ph ase +ĠEd mund +Ġpneum onia +vent us +A mb +Ġlabor atories +ĠEx clusive +ug ar +W ere +Ġmalf unction +Ġhomosexual s +Ġ---- --- +un i +Ġturb ines +ĠEqu ity +D u +Ġmind ed +ĠR H +ĠBlack hawks +Ġfe ats +Ġ17 00 +re pl +36 2 +lad en +Ġindisp ensable +ly ss +tt i +Ġre el +Ġdiver ted +Ġlik eness +Ġsubscript ions +Ġfing ert +Ġfil thy +dest ruct +d raft +ĠBernard ino +l aunch +Ġper plex +ĠS UM +car b +Ġswe ater +ĠVent ure +ĠJ ag +ĠCele b +ĠV oters +Ġstead fast +Ġathlet ics +ĠHans on +ĠDr ac +Tr acker +Ġcomm end +ĠPres idency +ĠD ID +in formed +Ġweb page +P retty +Ġforce fully +ãĥĥ ãĤ¯ +Ġrel ocation +Ġsat ire +â ī +ĠSunder land +æ Ħ +V oice +???? ???? +Ġinform ant +Ġbow el +ĠUn iform +Ġ ..." +Ġpur ge +Ġpic nic +ĠU mb +ĠU PDATE +ĠSapp hire +ĠSt all +le arn +Ġobject ively +Ġob liter +Ġlooph ole +Ġjour neys +Ġo mission +Pro s +ĠSid ney +pl oma +Ġspray ed +Ġg uru +Ġtra itor +Ġtim et +Ġsn apping +ĠSe vent +urn al +ĠUk ip +Ġb owed +por al +l iberal +R os +Quest ions +i OS +Ġsummar ize +ST AT +Ġ18 50 +ap est +Ġl ender +ĠVari able +br inging +ĠL ORD +, ) +Ġcollaps es +x iety +ĠN ed +Y D +ĠSch a +Ġantib ody +Ġdis band +y re +ill usion +Ġro ver +s hed +ĠHiro sh +cc i +Ġcal am +ĠMort on +P interest +Ġ19 28 +ĠE uras +ord es +Ġf ences +ĠIn ventory +ĠVal encia +ĠU d +ĠT iff +Ġsqu e +Ġqu otation +Ġtroubles ome +er ker +QU EST +ĠKing doms +s outh +Ġle vy +Pr ince +ĠSt ing +Ġnick named +Ġapp e +Ġphot ographic +Ġcorp us +re ference +ĠT rog +U nt +) =( +ĠLat via +Ġactiv ating +Ġlicense e +Ġdispar ities +ĠNews letter +ãĥĥ ãĥĪ +Ġfree ing +ĠJe ep +ĠPer ception +ins k +Ġsil icone +ĠHay den +Le an +ĠSuz uki +ibr arian +66 8 +Ġsp or +Ġcorrel ations +ag hetti +Ġtu ber +ĠIP CC +il us +ĠV u +Ġwealth iest +ĠCarb uncle +an za +Ġfool ed +ĠZ ur +Ġd addy +ran o +il ian +Ġknock out +f man +requ ired +ĠWik ileaks +ĠD uffy +ON T +Ġins ol +ĠObject s +Ġb ou +ĠNord ic +ĠIns ert +sc an +Ġd ancers +Ġid iots +major ity +ĠNev ille +ĠFree BSD +Ġt art +pan ic +69 0 +Ġcoc oa +Ġsam pled +Ġlook up +Ind ust +Ġinject ions +gen re +Ġa u +Ġroad way +Ġgen itals +K ind +ĠEx aminer +ĠY az +F resh +Ġpar alysis +ĠAl uminum +Ġre ap +ok é +Ġsl oppy +ĠTun nel +pos ium +ner y +en ic +Ġher bal +ĠOut er +ĠBuild er +Ġinc ur +Ġide ologies +Ġback ups +cons uming +ĠDet ect +de ck +ĠKN OW +ĠG ret +ĠM IC +Ġtough ness +ĠEx hibit +Ġh ive +L es +ĠSCH OOL +ĠAt ari +ald e +ĠN ull +and estine +m ouse +Ġbrig ade +48 9 +Ġrev ol +ĠLaw son +ĠW ah +op oly +eb ted +ĠS aunders +Ġ3 13 +ĠW inc +Ġtab oo +ĠHel met +Ġw edge +ch ip +ĠT ina +b g +Ġinf uri +r n +Ġanomal ies +ĠSy nc +ĠEx am +ĠComm it +ĠDi ary +ĠALS O +ĠDe bor +omed ical +Ġcomprehens ion +6 55 +Ġempower ing +Ġ ire +Ġju ices +ĠE TH +ĠBox ing +=" / +Ġfacilit ated +p oke +ĠPars ons +ĠMod er +tra vel +Ġcivil izations +Ġliber tarians +Ġrun e +ĠCl arks +at hed +Ġcampaign ers +ĠDis patch +ĠFah renheit +ĠCap com +-------- -- +Ġl ace +Ġdr aining +Ġl iner +ĠArt ificial +é n +t ask +] ). +ĠGM O +ĠOper ator +ord inary +ĠInf luence +ĠU ps +Ġpot ency +uss en +osp ons +ĠSw im +ĠDead line +Un ity +Ġcul inary +Ġenlight enment +Ġwe arer +Ġmin ed +Ġp ly +Ġinc est +ĠDVD s +W alk +B TC +Tr ade +Ġdev al +ib and +ĠOvers ight +Palest inian +Ġd art +Ġm ul +L R +Ġrem ovable +ĠReal ms +ì Ŀ +Ġmisc ar +ĠV ulkan +68 5 +è re +ĠS ap +Ġmer ging +ĠCar ly +che ster +Ġbr isk +Ġlux urious +ĠGener ator +Ġbit terness +Ġed ible +Ġ24 3 +T G +Ġrect angle +With No +bel ow +J enn +Ġdark est +Ġh itch +Ġdos age +Ġsc aven +ĠK eller +ĠIllust rated +Certain ly +ĠMaver icks +Marg inal +Ġdiarr hea +Ġenorm ously +Ġ9 99 +sh r +qu art +Ġadam ant +ĠM ew +Ġren ovation +Ġcerv ical +ĠPercent age +en ers +ĠKim ber +Ġflo ats +Ġde x +ĠW itcher +ĠSwan sea +d m +Ġsal ty +y ellow +Ġca pe +ĠDr ain +ĠPaul a +ĠTol edo +les i +Mag azine +ĠW ick +ĠM n +ĠA ck +ĠR iding +AS ON +Ġhom ophobic +AR P +Ġwand ered +C PU +ood oo +ĠP ipe +Ġtight ening +ĠBut t +3 18 +Ġdesert ed +S ession +Ġfacilit ating +J ump +Ġemer gencies +OW ER +Ġexhaust ive +ĠAF TER +Ġheart beat +ĠLab el +ack y +ĠCert ified +ilt ration +Z e +ĠU tt +Ġ13 00 +Ġpres ume +ĠDis p +Ġsur ged +Ġdoll s +Col umb +Ġchim pan +ĠR azor +Ġt icks +Ġcouncill or +Ġpilgr image +ĠReb els +ĠQ C +ĠA uction +x ia +ik k +b red +Ġinsert ion +Ġco arse +d B +SE E +ĠZ ap +ĠF oo +Ġcontem por +ĠQuarter ly +ot ions +ĠAl chemist +ĠT rey +ĠDu o +S weet +80 4 +ĠGi ov +Ġfun n +N in +h off +Ġram ifications +Ġ19 22 +ĠExper ts +az es +Ġgar ments +ar ial +ĠN ab +Ġ25 7 +ĠV ed +Ġhum orous +ĠPom pe +Ġn ylon +Ġlur king +ĠSerge y +ĠMatt is +Ġmisogyn y +ĠComp onents +ĠWatch ing +ĠF olk +ract ical +B ush +Ġt aped +Ġgroup ing +Ġbe ads +Ġ20 48 +Ġcon du +quer que +Read ing +Ġgriev ances +Ult ra +Ġend point +H ig +ĠSt atic +ĠScar borough +L ua +ĠMess i +a qu +ĠPsy Net +ĠR udd +Ġa venue +v p +J er +Ġsh ady +ĠRes ist +ĠArt emis +Ġcare less +Ġbro kers +Ġtemper ament +Ġ5 20 +T ags +ĠTurn ing +Ġut tered +Ġp edd +Ġimpro vised +Ġ: ( +Ġtab l +Ġpl ains +16 00 +press ure +ĠEss ence +marg in +friend s +ĠRest oration +Ġpoll ut +ĠPok er +ĠAugust ine +ĠC IS +ĠSE AL +or ama +Ġth wart +se ek +Ġp agan + º +cp u +Ġg arn +Ġass ortment +ĠI LCS +t ower +Recomm ended +Ġun born +ĠRandom Redditor +ĠRandomRedditor WithNo +Ġparaly zed +Ġeru ption +Ġinter sect +ĠSt oke +ĠS co +B ind +å ¾ +ĠP NG +ĠNeg ative +ĠNO AA +Le on +Ġall oy +ĠL ama +ĠD iversity +5 75 +Ġunderest imated +ĠSc or +Ġm ural +Ġb usted +so on +l if +Ġnone x +Ġall ergy +ĠUnder world +ĠR ays +ĠBl asio +Ġh rs +ĠD ir +Ġ3 27 +by ter +Ġrepl acements +Ġactiv ates +ri ved +M H +Ġp ans +ĠH I +Ġlong itudinal +Ġnu isance +al er +Ġsw ell +ĠS igned +s ci +ĠIs les +ĠA GA +Ġdef iant +Ġson ic +oc on +K C +ĠA im +t ie +ah ah +Ġm L +D X +Ġb isc +ĠBill board +ĠSY STEM +NE Y +ga ard +Ġdist ressed +former ly +Al an +Ġche fs +Ġopt ics +ĠC omet +ĠAM C +Ġredes igned +irm ation +Ġsight ings +38 2 +3 11 +ĠW B +Ġcont raction +ĠT OTAL +D ual +Ġstart led +Ġunderstand ably +Ġsung lasses +ETH OD +Ġd ocker +Ġsurf ing +ĠH EL +ĠSl ack +ton es +Ġsh alt +Vis ual +49 8 +Dep artment +c ussion +Ġunrest ricted +Ġt ad +Ġre name +employ ed +Ġeduc ating +Ġgrin ned +bed room +ĠActiv ities +ĠV elvet +ĠSW AT +Ġsh uffle +ig or +Ġsatur ation +F inding +c ream +ic ter +Ġv odka +tr acking +te c +Ġfore ground +iest a +Ġve hement +ĠEC B +ĠT ie +E y +Ġt urtles +ĠRail road +ĠKat z +ĠFram es +Ġmen ace +ĠFell owship +ĠEss ential +ugg ish +Ġdri p +ch witz +ĠKy oto +s b +ĠN ina +Param eter +Ġal arms +ĠCl aud +Ġpione ering +Ġchief ly +ĠSc ream +Col lection +Ġthank fully +ĠRonald o +åŃ IJ +st rip +ĠDisney land +com mercial +See ing +S oul +Ġevac uate +Ġc iv +ĠAs he +Ġdiv ides +ĠD agger +rehens ive +Ġber ries +ĠD F +Ġs ushi +Ġplur ality +W I +Ġdisadvant aged +Ġbatt alion +ob iles +45 1 +Ġcl ing +Ġunden iable +ĠL ounge +Ġha unt +p he +Ġquant ify +Ġdiff ered +Ġ[* ] +ĠV iz +c um +sl ave +Ġvide og +Ġqu ar +Ġbund les +ĠAl onso +t ackle +Ġneur onal +Ġlandsl ide +conf irmed +ĠDep th +Ġrenew ables +B ear +ĠMaced onia +Ġjer seys +Ġb unk +ĠSp awn +ĠControl s +ĠBuch anan +Ġrobot ics +Ġemphas izing +ĠTut orial +h yp +ist on +Ġmonument al +æ ° +ĠCar ry +Ġt bsp +en ance +H ill +art hed +Ġro tten +De an +Ġtw isting +Ġgood will +Ġimm ersion +L iving +Ġbr ushes +ĠC GI +ĠAt k +tr aditional +Ġph antom +ĠSt amina +Ġexpans ions +ĠMar in +Ġembark ed +ĠE g +int estinal +ĠPE OPLE +ĠBo oth +ĠApp alach +Ġreleg ated +V T +M IT +Ġmust er +Ġwithdraw ing +Ġmicrosc ope +ĠG athering +ĠC rescent +ĠArgent ine +ĠDec re +ĠDomin ic +Ġbud s +ant age +ĠI on +Ġwid ened +ONS ORED +ĠGl oves +iann opoulos +raz en +fe el +Ġrepay ment +Ġhind sight +ĠRE ALLY +ĠPist ol +ĠBra h +Ġwat ts +Ġsurv ives +Ġfl urry +iss y +Al ert +ĠUrug uay +Ph oenix +S low +ĠG rave +ĠF ir +Ġmanage able +Ġtar iff +ĠU DP +ĠPist ons +ĠNiger ian +Ġstrike outs +Ġcos metics +whel ming +f ab +c ape +pro xy +Ġre think +Ġover coming +sim ple +Ġw oo +Ġdistract ing +ĠSt anton +ĠTuls a +ĠD ock +65 9 +Ġdisc ord +ĠEm acs +ĠV es +ĠR OB +Ġreass uring +Ġcons ortium +Muslim s +3 21 +Ġprompt s +se i +ĠH itch +imp osed +ĠF ool +Ġindisc rim +wr ong +bu querque +D avis +! ] +Ġtim eless +ĠNE ED +Ġpestic ide +Ġrally ing +ĠCal der +Ġå ¤ +Ġx p +ĠUn le +ĠEx port +lu aj +B uff +) [ +Ġsq or +S audi +Ġis tg +Ġindul ge +pro c +Ġdisg usted +Ġcomp ounded +Ġn em +Ġschool ing +ĠC ure +process ing +S ol +Ġpro verb +it ized +ĠAlv arez +Ġscar f +Ġrect angular +re ve +Ġh ormonal +ĠSt ress +itiz en +Ġ4 25 +girl s +ĠNo ir +ĠR app +Ġmar ches +ch urch +ĠUs es +Ġ40 5 +ĠBer m +Ġord inances +ĠJud gment +Charg es +ĠZ in +Ġdust y +Ġstraw berries +Ġper ce +ĠTh ur +ĠDebor ah +net flix +ĠLam bert +Ġam used +ĠGu ang +Y OU +R GB +ĠC CTV +Ġf iat +r ang +Ġf ederation +ĠM ant +ĠB ust +ĠM are +respect ive +ĠM igration +ĠB IT +59 0 +Ġpatriot ism +Ġout lining +reg ion +ĠJos é +Ġbl asting +ĠEz ra +B s +Ġundermin es +ĠSm ooth +Ġcl ashed +rad io +Ġtransition ing +ĠBucc aneers +ĠOw l +Ġplug s +Ġh iatus +ĠPin ball +Ġm ig +ĠNut r +ĠWolf e +Ġinteg ers +Ġor bits +ĠEd win +ĠDirect X +b ite +Ġbl azing +v r +Ed ge +ĠP ID +ex it +ĠCom ed +ĠPath finder +ĠGu id +ĠSign s +ĠZ er +ĠAg enda +Ġreimburse ment +M esh +i Phone +ĠMar cos +ĠS ites +h ate +en burg +Ġs ockets +p end +Bat man +v ir +ĠSH OW +Ġprovision al +con n +ĠDeath s +AT IVE +Pro file +sy m +J A +Ġnin ja +inst alled +id ates +eb ra +ĠOm aha +Ġse izing +ĠBe asts +Ġsal ts +M ission +Gener ally +ĠTr ilogy +he on +leg ates +Ġd ime +Ġf aire +par able +G raph +Ġtotal ing +Ġdiagram s +ĠYan uk +ple t +ĠMe h +Ġmyth ical +ĠStep hens +aut ical +ochem istry +Ġkil ograms +Ġel bows +anc ock +ĠB CE +ĠPr ague +Ġimpro v +ĠDev in +Ġ" \ +par alle +Ġsuprem acists +ĠB illion +Ġreg imen +inn acle +Ġrequ isite +ang an +ĠBur lington +ain ment +ĠObject ive +oms ky +G V +Ġun ilateral +Ġt c +Ġh ires +ment al +Ġinvol untary +Ġtrans pl +ĠASC II + ¨ +Ev ents +Ġdoub ted +ĠKa plan +ĠCour age +ig on +ĠMan aging +ĠT art +Ġfalse hood +ĠV iolet +Ġair s +Ġfertil izer +Brit ain +Ġaqu atic +ou f +W ords +ĠHart ford +Ġeven ings +ĠV engeance +qu ite +G all +ĠP ret +Ġp df +ĠL M +ĠSo chi +ĠInter cept +9 20 +Ġprofit ability +ĠId le +ĠMac Donald +ĠEst ablishment +um sy +Ġgather ings +ĠN aj +Charl ie +Ġas cent +ĠProt ector +Ġal gebra +Ġbi os +for ums +EL S +Introdu ced +Ġ3 35 +Ġastron omy +Cont ribut +ĠPol ic +Pl atform +Ġcontain ment +w rap +Ġcoron ary +ĠJ elly +man ager +Ġheart breaking +c air +ĠChe ro +c gi +Med ical +ĠAccount ability +! !" +oph ile +Ġpsych otic +ĠRest rict +Ġequ itable +iss ues +Ġ19 05 +ĠN ek +c ised +ĠTr acking +Ġo zone +Ġcook er +ros is +Ġre open +Ġinf inity +ĠPharm aceutical +ens ional +Att empt +ĠR ory +Mar co +Ġawa its +H OW +t reated +Ġbol st +Ġreve red +Ġp ods +opp ers +00 10 +Ġampl itude +ric an +SP ONSORED +Ġtrou sers +Ġhal ves +ĠK aine +ĠCut ler +ĠA UTH +Ġsplend id +Ġprevent ive +ĠDud ley +if acts +umin ati +ĠY in +Ġad mon +ĠV ag +Ġin verted +Ġhast ily +ĠH ague +L yn +Ġled ger +Ġastron omical +get ting +Ġcirc a +ĠC ic +ĠTenn is +Lim ited +Ġd ru +ĠBY U +Ġtrave llers +Ġp ane +ĠInt ro +Ġpatient ly +Ġa iding +Ġlo os +ĠT ough +Ġ29 3 +Ġconsum es +Source File +Ġ"" " +Ġbond ing +Ġtil ted +Ġmenstru al +ĠCel estial +UL AR +Plug in +Ġrisk ing +N az +ĠRiy adh +Ġacc redited +Ġsk irm +é Ľ +Ġexam iner +Ġmess ing +Ġnear ing +ĠC hern +ĠBeck ham +Ġsw apped +Ġgo ose +K ay +Ġlo fty +ĠWal let +Ġ[ ' +Ġap ocalypse +Ġb amboo +ĠSP ACE +ĠEl ena +Ġ30 6 +ac ons +Ġtight ened +Ġadolesc ence +Ġrain y +Ġvandal ism +ĠNew town +Ġcon ject +c akes +Ġche ated +Ġmoder ators +par ams +E FF +Ġdece it +ĠST L +ĠTanz ania +ĠR I +Ġ19 23 +ĠEx ile +the l +Ġthe olog +Ġquir ky +ĠIr vine +Ġneed y +or is +U m +K a +Ġmail box +3 22 +Ġb os +ĠPet ra +K ING +Ġenlarg ed +O ften +Ġbad ass +Ġ3 43 +ĠPl aces +ĠC AD +Ġpr istine +Ġinterven ing +d irection +Ġl az +ĠD SM +Ġproject ing +ĠF unk +ag og +pay ment +n ov +Ġch atter +AR B +Ġexam inations +ĠHouse hold +ĠG us +F ord +4 14 +B oss +Ġmy stic +Ġle aps +ĠB av +ul z +b udget +Foot ball +Ġsubsid ized +Ġfirst hand +Ġcoinc ide +oc ular +Con n +ĠColl abor +Ġfool s +am ura +ah ar +r ists +Ġsw ollen +Ġexp ended +ĠP au +s up +Ġsp ar +Ġkey note +s uff +Ġunequ al +Ġprogress ing +str ings +ĠGamer gate +Dis ney +ĠEle ven +om nia +Ġscript ed +Ġear ners +bro ther +ĠEn abled +æ ³ +Ġlar vae +ĠL OC +m ess +Wil son +ĠTem plate +success fully +Ġparam ount +Ġcamoufl age +Ġbind s +ĠQu iet +ĠSh utterstock +r ush +Ġmasc ot +fort une +ĠCol t +ĠBe yon +hab i +Ġha irc +Ġ26 7 +ĠDe us +Ġtw itch +Ġconcent rating +Ġn ipples +c ible +Ġg ir +N Z +M ath +n ih +Requ ired +Ġp onder +ĠS AN +Ġwedd ings +Ġl oneliness +N ES +ĠMah jong +69 5 +add le +ĠGar ner +ĠC OUR +Br idge +Ġsp ree +ĠCald well +Ġbri bery +Ġ���� ���� +plug ins +Ġr acket +Ġchamp agne +vers ible +V ote +Ġmod ifiers +May or +6 80 +Ġassemb lies +ĠS ultan +ĠN ing +ĠLad ies +Ġsulf ur +Ġor bs +Ġ---- - +____ ___ +ĠJournal ism +Ġes ports +Ġl ush +Ġh ue +Ġspect ral +H onest +ãĥ ı +Ġbus hes +Ġrein forcement +Ġre opened +ĠWhe els +ĠM org +rie ving +Ġaux iliary +Ġj Query +ĠB AT +tes que +Ġver tex +p ure +f rey +ãĤ º +d os +Ġty ph +Ġc ull +Ġe q +Ġdec on +Ġtoss ing +Ġdispar ate +ĠBr igham +print f +led ged +Ġsu nd +Ġco zy +Ġhepat itis +per forming +Ġav al +ĠG G +f uture +Ġpet ertodd +ĠKos ovo +Ġmagn ets +Al ready +ĠEd ison +ĠCe res +ĠRA ID +Ġbrill iance +57 6 +Ġder ives +Ġhypert ension +ĠÎ Ķ +Ġlamb da +Ġfl air +Ġmission aries +Ġrap es +ĠSt arter +ĠMon ths +Ġdef y +Ġseism ic +ĠR aphael +Ġeuro zone +65 6 +z sche +Ġscr atched +Ġb ows +ĠLenn on +ĠGa ia +Ġdri pping +f acts +A le +Ġfrog s +ĠBre ast +ogene ity +ĠProsecut or +Ġampl ified +ĠHod g +ĠF n +Th ousands +ĠNI H +ĠMonitor ing +FT WARE +ĠPri ebus +ĠG rowing +hun ter +Ġdiagn ose +ĠM ald +ĠL R +Ġcrown ed +Ġburst ing +Ġdiss olution +j avascript +Ġuseful ness +ĠExec ution +: ( +ĠIv ory +a ah +Ġpersecut ed +viol ence +ist as +ĠCr ate +Ġimpuls es +ĠSp ani +ed es +Hand le +ĠZ erg +think able +Last ly +Ġspont aneously +Ġinconven ient +Ġdismiss ing +Ġpl otted +Ġeight y +Ġ7 37 +r ish +ĠThor nton +ath am +Ġsit com +V en +Rec ipe +t el +l und +Ġcle ars +ĠSas uke +Ġ25 8 +Ġopt ing +Ġen raged +est hetic +ĠA e +uch s +Pre p +Fl ow +Ġrun off +ĠE ating +ĠG iles +ĠAct ing +res ources +ib aba +Ġr pm +Ġske wed +ĠBl anc +ĠS akuya +Ġhot ter +Ġ19 24 +op ian +ck o +Ġcr umbling +Ġcapt ains +ĠAppropri ations +le aders +dro pping +an uts +Ġrevers ing +ĠP ose +ĠS ek +Sc ot +ĠIde a +c ise +ĠSloven ia +Ġ3 17 +Do ctor +Ġcro cod +ald i +Se a +ĠFar rell +Ġmerc enaries +ĠR NC +ĠGu ess +Ġp acing +M achine +Streamer Bot +ĠChar ity +Ġ29 8 +Ġcann ons +ĠTob y +TPP StreamerBot +ĠPass ion +cf g +Th om +Ġbad ges +ĠBern stein +. âĢĵ +ĠP OP +ĠCon j +Ġinitial ization +Ġbiod iversity +D ub +Ġfeud al +Ġdisclaim er +Ġc row +Ġign ition +ar f +S HA +Ġk Hz +h azard +ĠArt ists +oe uv +67 9 +ĠRud y +N ine +ĠRam adan +å ½ +itt o +Ġadren aline +C ert +Ġsmell ed +Ġimp unity +Ġag endas +ĠRe born +ĠCon cent +ĠSe ems +Ġo mega +ĠDust in +Ġback er +ĠSau ce +ĠBoy le +W IN +Ġsp ins +Ġpa uses +u pt +Ġshred ded +Ġstra pped +ĠCor ruption +Ġscr atches +Ġn i +Ġatt ire +ĠS AF +Factory Reloaded +ĠI PS +Ġ( % +Ġsem inar +f ocus +c ivil +Ġ18 60 +int osh +Ġcontin ual +Ġabbre vi +ĠS ok +oc obo +X M +Ġfr antic +Ġunavoid able +Ġar tery +Ġannot ations +b ath +Cl imate +Ġd ors +ĠSl ide +co ord +ĠRel oad +ĠL DL +ĠLove craft +Ġunim agin +Ġresemb led +Ġbarr acks +n p +Ġsurrog ate +Ġcategor ized +ãĤ © +Ġvacc inated +Ġdrain age +Ġind ist +ĠWhats App +Ġ18 70 +oler ance +inv oke +am orph +Ġrecon nect +Ġem anc +Ġblind ness +Ġ12 80 +intern et +c ollar +Ġalt ru +Ġab yss +ĠT RI +65 7 +Ġinf used +HE AD +Ġforest ry +ĠWood y +ĠC i +w i +s am +78 4 +hol iday +Ġmog ul +ĠF ees +ĠD EN +In ternal +ur bed +f usc +at om +ĠIll usion +Ġpoll ed +Ġfl ap +Ġco ax +L GBT +An aly +ĠSect ions +ĠCalif orn +em n +Ġh ither +ĠN IGHT +Ġn ailed +ĠPip eline +39 1 +o of +ĠPr imal +vere nd +Ġsl ashing +Ġret ri +avi our +Ġdepart ing +g il +IS C +Ġmid way +Ġultras ound +Ġbeh aving +ĠT ara +class es +V irtual +ĠColon ial +Ġstri pping +Ġorchestr ated +ĠGra ves +45 2 +ĠIron ically +ĠWrit ers +Ġl ends +ĠMan z +Ġra ven +Ġoxid ative +Ġ26 6 +EL F +act ually +asc ar +D raft +Ġfavour able +Ġhumili ating +Ġf idelity +ĠH of +ĠX uan +49 6 +Ġlay ered +at is +79 0 +Ġpay check +it on +K ar +ĠVM ware +ĠFar mer +Ġserv ic +gl omer +Ġsl ump +ĠFab ric +ĠD OC +est ing +Ġreass ure +Ġph yl +v olt +it ory +R ules +Ġoxid ation +Ġpri zed +Ġmist ress +ĠDj ango +WAR N +å ij +Ġenc ode +ĠFeed back +Ġstupid ity +I an +ĠYugoslav ia +× ¨ +ac l +UT E +19 77 +Ġqual ifies +Ġpuls es +pret ty +Ġfro ze +Ġs s +Iter ator +Ġur gently +Ġm ailed +ĠCh am +Ġsust aining +Ġbas il +Ġpupp ies +il ant +ĠP LEASE +l ap +ace ous +F ear +ĠMaster y +aut omatic +ĠT AG +Ġant im +ag les +47 3 +fram es +Ġwh ispers +ĠWho ever +Ġbra very +ĠUK IP +ract ions +"" " +Ġt ame +Ġpart ed +every thing +CON T +Ġind ebted +Ġadd r +re k +IR ED +Ġem inent +cl inton +Ġo usted +Ġreview er +Ġmelt down +Ġre arr +ĠY ao +the real +aby te +Ġst umbling +Ġbat ches +Ġ25 9 +Ġcontrace ptive +Ġprost itute +ens is +De cl +ĠSt rikes +M ilitary +ĠO ath +v acc +pp ings +05 2 +Ġpart Name +amp ing +Rep orts +K I +CH R +Ġsubt ly +sw ers +Bl ake +us ual +Ġcontest ants +Ġcart ridges +ĠGRE AT +Ġbl ush +ĠâĢ º +47 2 +Ġreason ed +ãĥ ¤ +paralle led +Ġd yn +ag ate +Ġnight ly +å Ĩ +55 6 +Ġsem antic +ĠAdv oc +Ġ !! +Ġdisag rees +ĠB W +V eh +Ġharm ing +Ġembr aces +Ġstri ves +Ġin land +ĠK ard +Ġhe ats +ĠGin ny +ut an +ern aut +yl ene +ĠE lev +J D +Ġh ars +ĠStar r +Ġsk ysc +Ġcollabor ators +Us ually +Ġrev olutions +ĠSTAT S +Ġdism antle +Ġconfident ly +Ġkin etic +Al i +Ġpercent ile +Ġextract ing +ill ian +est ead +Ġphysic ists +ĠMarsh al +Ġfell owship +Ġd ashed +ĠU R +ĠSi oux +ĠComp act +am ide +P ython +ĠLe igh +ĠPharm ac +ist rates +her ical +Ġf ue +ĠE min +Ġ( { +ĠNeighbor hood +Ġdisrupt ing +ĠD up +Ġg land +ĠSe v +ĠMar ian +arg on +ĠD und +Ġ< !-- +Ġstr and +Ġstadium s +z os +Ġpsych osis +ĠR ack +Ġbrilliant ly +ï¸ ı +Ġsubmer ged +ĠInst it +ĠCh ow +Ġc ages +ĠH ats +ĠU rs +Ġdil uted +us at +ien ne +ĠMembers hip +ĠBur k +Ġ ie +Ġarche type +D rug +ult on +ĠSp ock +ĠMcK ay +ĠDep end +F eatured +S oc +19 78 +ĠB ere +Ġrelent lessly +Ġcripp ling +Ġar thritis +çĶ Ł +ĠTrop ical +ĠBul g +ĠCher yl +Ġadm irable +Ġsub title +Over ride +Ġorig inating +ĠC CP +Ġsw ore +ĠSo le +ĠDis orders +3 29 +Ġprocess ion +Ġref urb +Ġimm ersed +requ ently +Ġskept ics +Ġcer amic +m itter +en stein +b elt +ĠT IT +b idden +Ġf ir +m ist +> ] +Ġwe ave +ĠParad ox +Ġentr usted +ĠBarcl ays +Ġnovel ist +og ie +80 6 +Ġnin ety +Ġdisag reements +@@@@ @@@@ +ĠAus chwitz +c ars +ĠL ET +t ub +arant ine +P OS +Ġback story +Ġcheer ful +ĠR ag +ek a +bi ased +Ġinexper ienced +ak ra +ĠW itt +t an +Ġrap ist +Ġplate au +ch al +ĠInqu is +exp ression +Ġc ipher +Ġsh aving +add en +re ly +( \ +ism a +ĠReg ulatory +CH AR +ily n +N VIDIA +G U +Ġmur m +la us +Christ opher +Ġcontract ual +ĠPro xy +ĠJa ime +ĠMethod ist +Ġstew ards +st a +per ia +Ġphys iology +Ġbump ed +Ġf ructose +Austral ian +ĠMet allic +ĠMas querade +ar b +Ġprom ul +Ġdown fall +Ġbut cher +Ġb our +ĠIN FORMATION +ĠB is +pect s +ad ena +Ġcontempl ating +ar oo +cent ered +ĠPe aks +Us ed +Ġmod em +Ġg enders +Ġ8 000 +37 1 +Ġm aternity +ĠR az +Ġrock ing +Ġhandgun s +ĠD ACA +Aut om +ĠN ile +Ġtum ult +ĠBenef it +ĠAppro ach +works hop +ĠLe aving +G er +inst ead +Ġvibr ations +Ġrep ositories +49 7 +ĠA unt +ĠJ ub +ĠExp edition +Al pha +Ġs ans +Ġoverd ue +Ġoverc rowd +Ġlegisl atures +Ġp aternal +ĠLeon ardo +Ġexp ressive +Ġdistract ions +Ġsil enced +tr ust +Ġb iking +Ġ5 60 +Ġpropri et +Ġimp osition +Ġcon glomer +Ġ= ================================================================ +ĠTe aching +ĠY ose +int ensive +T own +Ġtroll ing +ĠGr ac +ĠAS US +Y o +Ġspecial s +ĠNep h +ĠGod zilla +Dat abase +ĠHe gel +Ġ27 2 +19 76 +ĠGl oria +Ġdis emb +ĠInvestig ations +ĠB ane +ag ements +St range +Ġtre asury +ĠPl ays +Ġundes irable +Ġwid ening +Ġverb ally +Ġinf ancy +Ġcut ter +f ml +Ġ21 00 +prot otype +f ine +Ġdec riminal +Ġdysfunction al +Ġbes ie +ĠErn st +z eb +Ġnort heastern +Ġa ust +por ate +ĠMar lins +Ġsegreg ated +ew orld +ĠMa her +Ġtra verse +Ġmon astery +ur gy +G ear +s and +Com pl +ĠE MP +Ġpl ent +ĠMer cer +Ġ27 6 +TA BLE +Config uration +H undreds +Ġpr ic +Ġcollabor ating +ĠPar amount +ĠCumm ings +Ġ( < +Ġrecord er +Ġfl ats +Ġ4 16 +wh ose +Font Size +ĠOr bit +Y R +Ġwr ists +Ġb akery +) } +ĠB ounty +ĠLanc aster +Ġend ings +acc ording +ĠSal am +e asy +75 5 +ĠBur r +ĠBarn ett +onom ous +Un ion +Ġpreced ence +ĠScholars hip +ĠU X +Ġroll out +Ġbo on +al m +ĠCan ter +æ µ +Ġround ing +Ġcl ad +Ġv ap +ĠF eatured +is ations +Ġ5 40 +pol ice +Ġunsett ling +Ġdr ifting +ĠLum ia +ĠObama Care +ĠF avor +Hy per +ĠRoth schild +ĠMil iband +an aly +ĠJul iet +H u +Ġrec alling +a head +69 6 +Ġunf avorable +Ġd ances +O x +Ġleg ality +Ġ40 3 +rom ancer +Ġinqu ire +ĠM oves +\ "> +ĠVari ant +ĠMess iah +ĠL CS +ĠBah á +75 6 +Ġeyeb row +Ġ ¥ +ĠMc F +ĠFort y +M as +Ġpan icked +Ġtransform ations +q q +Ġrev olves +ring e +ĠA i +ax e +Ġon ward +ĠC FR +ĠB are +log in +Ġliqu ids +Ġde comp +second ary +il an +ĠCon vert +ami ya +Ġprosecut ing +Ġâī ¡ +ĠYork ers +ĠByr ne +sl ow +aw ei +J ean +Ġ26 9 +ĠSky dragon +Ġ é +ĠNicarag ua +ĠHuck abee +ĠHigh ly +Ġamph ib +ĠPast or +ĠL ets +Ġbl urred +Ġvisc eral +ĠC BO +Ġcollabor ated +z ig +Leg al +Ġapart heid +Ġbr id +Ġpres et +ĠD ET +ĠAM A +× Ķ +arch ing +auc uses +build er +Ġpo etic +Ġem ulator +ĠMole cular +Ġhon oring +ise um +Ġtract or +ĠCl uster +ĠCal m +ared evil +Ġsidew alks +Ġviol in +Ġgeneral ized +ĠAle c +Ġemb argo +Ġfast ball +ĠHT TPS +ĠL ack +ĠCh ill +ri ver +C hel +ĠSw arm +ĠLev ine +ro ying +L aunch +Ġkick er +Ġadd itive +ĠDe als +W idget +cont aining +Ġescal ate +ĠOP EN +Ġtwe aked +Ġst ash +Ġsp arks +ĠEs sex +ĠE cc +Ġconv ict +Ġblog ging +I ER +ĠH L +Ġmurd erers +75 9 +ĠH ib +Ġde pl +ĠJ ord +S ac +Ġdis sect +ĠHow e +os her +Ġcustom izable +ĠFran z +Ġat ro +Ä ĩ +Ġ000 4 +Ġout post +R oss +Ġglyph osate +ĠHast ings +ĠBE FORE +Ġsh ove +o pped +ĠSc ala +Ġam ulet +an ian +Ġexacerb ated +Ġe ater +47 1 +UM E +Ġpul p +izont al +ĠZ am +ĠAT I +imm une +aby tes +Ġunnecess arily +ĠC AT +ĠAx is +Ġvisual ize +à ī +ĠRad ical +f m +Doc uments +ĠFor rest +Ġcontext ual +ĠSy mbol +Ġtent ative +ĠDO ES +ĠGood s +Ġintermitt ent +} : +medi ated +Ġridic ule +Ġathe ism +Ġpath ogens +ĠM um +Ġre introdu +Ġ30 7 +i HUD +Ġflash light +Ġsw earing +Ġp engu +B u +Ġrot ated +ĠCr ane +Ġ() ); +Ġfashion able +Ġendors ing +46 3 +) [ +Ġingest ion +Ġcook s +Ġ9 50 +ot omy +ĠIm am +Ġk a +Ġte aser +ĠGhost s +ĠãĤ µ +19 69 +Ï ĥ +ub by +Ġconver ter +zan ne +end e +ĠPre par +ĠNic kel +ĠChim era +h im +ĠTyr ann +ĠSabb ath +ĠNich ols +Ġra pt +ih ar +Ġshe lling +Ġillum inate +Ġdent ist +ut or +ĠInteg ration +Ġwh ims +ĠLiter ary +Be aut +Ġp archment +ag ara +Br and +Ġder og +âĢ¦ ) +ĠNor se +Ġunw itting +Ġc uc +Ġborder line +Ġupset ting +Ġrec ourse +Ġd raped +ĠRad ar +Ġcold er +ĠPep si +im inary +], [ +65 8 +V i +ĠF rem +ĠP es +Ġveter inary +ĠT ED +ĠEp idem +n ova +k id +Ġdev out +o ct +j ad +M oh +ĠP AY +Ġge ometric +Ġ3 23 +Ġcircum ference +ich ick +19 75 +ĠY uri +ĠSh all +ĠH over +un in +S pr +Ġg raft +ĠHapp iness +Ġdisadvant ages +att acks +Ġhub s +ĠStar Craft +é ĸ +Ġgall eries +ĠKor ra +Ġgrocer ies +ĠGors uch +Ġrap ists +Ġfun gi +ĠTyph oon +V ector +ĠEm press +b attle +4 68 +Ġparas ite +ĠBom ber +S G +ex ist +ĠP f +Ġun se +Ġsurge ons +B irth +ĠUn sure +ĠPrint ed +ĠBehavior al +ĠA ster +Pak istan +Ġun ethical +Ġs v +ĠIo T +Ġlay outs +P ain +Ġconst ants +ĠL W +ĠB ake +Ġtow els +Ġdeterior ation +ĠBol ivia +Ġblind ed +ĠW arden +ĠMist ress +Ġon stage +Ġcl ans +ĠB EST +19 60 +Ġant ique +Ġrhet orical +ĠPer cy +ĠRw anda +, . +B ruce +Ġtra umat +ĠParliament ary +Ġfoot note +id ia +ĠLear ned +se eking +gen ic +Ġdim ensional +H ide +èĢ ħ +Ġintrig ue +in se +Ġle ases +Ġapp rentices +w ashing +Ġ19 26 +V ILLE +Ġsw oop +s cl +Ġbed rooms +on ics +ĠCr unch +comp atible +Ġincap ac +ĠYemen i +ash tra +z hou +d anger +Ġmanifest ations +ĠDem ons +AA F +Secret ary +ACT ED +L OD +Ġam y +ra per +eth nic +4 17 +Ġpos itives +Ġ27 3 +ĠRefuge es +Ġus b +ĠV ald +odd y +ĠMahm oud +As ia +Ġskull s +ĠEx odus +ĠComp et +ĠL IC +ĠM ansion +ĠA me +Ġconsolid ate +storm s +ont ent +99 6 +Ġcl en +Ġm ummy +fl at +75 8 +ĠV OL +oter ic +n en +ĠMin ute +S ov +Ġfin er +R h +ly cer +Ġreinforce ments +ĠJohann es +ĠGall agher +Ġgym n +S uddenly +Ġext ortion +k r +i ator +T a +Ġhippocamp us +N PR +ĠComput ing +Ġsquare ly +Ġmod elling +ĠFor ums +ĠL isp +ĠKrish na +Ġ3 24 +Ġr ushes +Ġens ued +Ġcre eping +on te +n ai +il ater +ĠHorn ets +Ġob livious +IN ST +55 9 +Ġjeopard y +Ġdistingu ishing +j ured +Ġbeg s +sim ilar +ph ot +5 30 +ĠPark way +Ġs inks +ĠHearth stone +ib ur +ĠBat on +Av oid +Ġd ancer +Ġmag istrate +ary n +Ġdisturb ances +ĠRom ero +Ġpar aph +Ġmis chief +âĸ ĵ +ĠSh aria +Ġur inary +r oute +iv as +f itted +Ġeject ed +ĠAl buquerque +Ġ4 70 +Ġirrit ated +ĠZ ip +ĠB iol +à į +Ġden ounce +Ġbin aries +ĠVer se +Ġopp os +ĠKend rick +ĠG PL +Ġsp ew +ĠEl ijah +ĠE as +Ġdr ifted +so far +Ġannoy ance +ĠB ET +47 4 +ĠSt rongh +it ates +ĠCogn itive +oph one +ĠIdent ification +ocr ine +connect ion +Ġbox er +ĠAS D +ĠAre as +Y ang +t ch +ull ah +Ġdece ive +Comb at +ep isode +cre te +W itness +Ġcondol ences +ht ar +Ġhe als +Ġbuck ets +ĠLA W +B lu +Ġsl ab +ĠOR DER +oc l +att on +ĠSteven son +ĠG inger +ĠFriend ly +ĠVander bilt +sp irit +ig l +ĠReg arding +ĠPR OG +Ġse aling +start ing +Ġcard inal +ĠV ec +ĠBe ir +Ġmillisec onds +we ak +per se +Ġster ile +ĠCont emporary +ĠPh ant +ĠCl o +Ġout p +Ġex iled +Ġ27 7 +Ġself ie +Ġman ic +Ġn ano +ter ms +Alex ander +Ġres olves +Ġmillenn ia +Ġexpl odes +Ġconst ellation +Ġadul tery +m otion +D OC +Ġbroad casters +Ġkinderg arten +ĠMay weather +ĠE co +ich o +Ġ28 7 +l aun +Ġm ute +Ġdisc reet +Ġpres chool +Ġpre empt +De lete +ĠFre ed +P i +H K +Ġblock er +ĠC umber +Ġw rought +d ating +Ġins urer +Ġquot as +Ġpre ached +Ġev iction +ĠReg ina +ĠP ens +Ġsevent een +ĠN ass +D ick +Ġfold s +Ġd otted +ĠA ad +Un iversal +Ġp izz +ĠG uru +Ġso ils +Ġno vice +ĠNe ander +Ġst ool +Ġdeton ated +ĠPik achu +ĠMass ive +IV ER +ĠAb del +Ġsubdu ed +Ġtall est +Ġprec arious +Ġa y +r ification +ĠOb j +c ale +Ġun question +cul osis +ad as +igr ated +D ays +Ġque ens +ĠGaz ette +ĠCol our +ĠBow man +ĠJ J +ï ve +Ġdomin ates +Stud ent +Ġm u +Ġback log +ĠElect ro +Tr uth +48 3 +Ġcond ensed +r ules +ĠCons piracy +Ġacron ym +hand led +ĠMat te +j ri +ĠImp ossible +l ude +cre ation +Ġwar med +ĠSl ave +Ġmis led +Ġfer ment +ĠK ah +ink i +ke leton +cy l +ĠKar in +Hun ter +Reg ister +ĠSur rey +Ġst ares +ĠW idth +ĠN ay +ĠSk i +Ġblack list +uck et +Ġexp ulsion +im et +Ġret weet +vant age +Fe ature +Ġtro opers +Ġhom ers +9 69 +Ġconting ency +ĠW TC +ĠBrew er +fore ign +W are +S olar +Ġund ue +RE C +ulner able +path ic +ĠBo ise +Ġ3 22 +Ġarous ed +ĠY ing +ä¸ į +uel ess +Ġp as +Ġmor p +Ġfl oral +Ex press +ud ging +k B +ĠGr anted +Ø ¯ +ĠMich a +ĠGoth ic +ĠSPEC IAL +ĠRic ardo +F ran +Ġadminister ing +6 20 +por a +Ġ ® +Ġcomprom ises +Ġb itten +Ac cept +Th irty +Ð ² +Ġmater ially +ĠTer r +ig matic +ch ains +Ġdo ve +stad t +Mar vel +FA ULT +Ġwind shield +Ġ3 36 +ad ier +Ġsw apping +Ġflaw less +ĠPred ator +ĠMiche le +Ġprop ulsion +ĠPsych ic +Ġassign ing +Ġfabric ation +Ġbar ley +l ust +Ġtow ering +Ġalter cation +ĠBent ley +Sp here +Ġtun a +ĠClass es +Fre edom +un er +L ady +v oice +Ġcool est +or r +Ġpal p +$ { +Ġhyster ia +ĠMet atron +p ants +Ġspawn ing +Exper ts +ĠInvest ors +ĠAn archy +Ġshr unk +ĠVict im +Ġ28 9 +Ġec stasy +ĠB inding +58 5 +ĠMel ody +57 8 +ot ally +ĠE tsy +lig a +Ġapplaud ed +Ġswe ating +Ġredist ributed +Ġpop corn +Ġsem inal +f ur +ĠNeuro science +R and +ĠO st +ĠMadd en +ĠIncre asing +ĠDaw kins +ĠSub way +Ġar sen +cons erv +B UR +Ġsp iked +ĠLy ft +ĠImper ium +ĠDrop box +Ġfav oured +Ġencomp asses +gh ost +Ġins pires +Ġbur geoning +ĠY oshi +ĠVert ical +ĠAud itor +Ġint ending +Ġfilib uster +Bl oom +f ac +ĠCav s +ign ing +Ġcowork ers +ĠBarb arian +rem ember +FL AG +Ġaudit ory +ason ry +Col lege +Ġmut ed +gem ony +ob in +ĠPsych o +9 68 +Ġlav ish +Ġhierarch ical +ĠDr one +ou k +Ġcripp led +ĠMax im +Sl ot +Ġqu iz +ĠV id +if ling +Ġarchae ologists +Ġabandon ment +d ial +le on +ĠF as +T ed +Ġr aspberry +Ġmaneu vers +Ġbehavi ours +Ġins ure +Ġrem od +Sw itch +h oe +Ġsp aced +Ġafford ability +ĠF ern +not ation +ĠBal anced +Ġoccup ies +en vironment +Ġneck lace +Ġsed an +F U +ĠBrav o +Ġab users +ĠAn ita +met adata +ĠG ithub +ait o +ĠF aster +ĠWass erman +ĠF lesh +Ġth orn +r arily +ĠMer ry +w ine +Ġpopul ace +ĠL ann +Ġrepair ing +Ġpsy che +Ġmod ulation +aw aru +âĢĭ âĢĭ +ari j +Ġdecor ations +Ġapolog ise +ĠG arg +app ly +Ġgive away +ĠFl an +ĠWy att +U ber +Ġauthor ised +ĠMor al +HAHA HAHA +activ ate +Ġtorped o +ĠF AR +Ġam assed +ĠA ram +ark in +ĠVict ims +st ab +Ġo m +ĠE CO +Ġopio ids +Ġpurpose ly +ĠV est +Ġer g +at an +ĠSur gery +Ġcorrect ing +ĠOrt iz +ĠBe et +Ġrev oke +Ġfre eway +ĠH iggins +F ail +ĠFar ms +ĠAT P +h ound +Ġp oking +ĠCommun ists +mon ster +iment ary +Ġunlock ing +Ġunf it +we ed +en ario +at ical +ĠEnlight enment +ĠN G +ĠComp ensation +de en +ĠWid ow +ĠCind y +ĠAfter wards +Ġ6 000 +ikh ail +ag ically +Ġrat ified +Ġcasual ty +H OME +p sey +f ee +Ġspark ling +Ġd é +Ġconcert ed +C atal +Ġcomp lying +ĠA res +ĠD ent +Sh ut +Ġsk im +ad minist +Ġhost ilities +ĠG ins +Ġ6 08 +Ġm uddy +ĠMc Int +ĠDec ay +5 25 +Ġconspic uous +ĠEx posure +Ġresc ind +Ġwear able +Ġ3 28 +our met +ah s +ĠRob ots +Ġe clips +inst ance +ĠRE PORT +ĠApp l +0 30 +ĠSk ies +01 00 +Ġfall acy +S ocket +ĠRece iver +Ġsol ves +ĠButter fly +ĠSho pping +ĠFI RE +65 4 +Med ic +Ġsing ers +ĠNeed less +'' '' +isher s +ĠD ive +58 8 +Ġselect ively +Ġcl umsy +88 9 +Ġpurch aser +ear ned +ard y +Ġbenef iting +eng lish +Ġyield ing +ĠP our +Ġspin ach +Ġdel ve +ĠC rom +6 10 +Ġexport ing +ĠMA KE +Ġ26 3 +Ġg rop +Ġenv oy +ĠInqu iry +ĠLu igi +d ry +ĠT uring +Thumbnail Image +ĠVar iety +Ġfac et +Ġfl uffy +Ġexcerpt s +Ġsh orth +ĠOl sen +CL UD +Ġrel iant +ĠUN C +T our +Ġbat hing +Comp any +Ġglobal ization +P red +ĠMalf oy +Ġh oc +j am +craft ed +ĠBond s +ĠKiss inger +Eng land +Ġorder ly +cat entry +Ġ26 1 +Ġexch anging +ĠInt ent +ĠAmend ments +D OM +Ġst out +³³³³³³³³ ³³³³³³³³ +ĠAir bus +Ġ27 8 +hy de +P oll +Item ThumbnailImage +Ġlooph oles +ĠPill ar +Ġexpl or +St retch +A part +Ġun married +Lim it +ĠTransform ers +Ġintellect ually +unct ure +18 00 +Ġd arn +B razil +Ġleft over +ber us +f red +Mine craft +3 26 +ĠForm s +Ġproof s +ĠDes igned +Ġindex es +ĠSupp ose +EM S +ĠL oving +ĠBon nie +im ating +OT US +Ġconduct or +Ġbehav ed +ĠF ren +Ġsy nerg +Ġmillenn ium +Ġcater ing +ĠL auder +W r +ĠY iannopoulos +ĠAT F +Ġensl aved +Ġawaken ed +D VD +ĠED ITION +ĠConc ert +ĠChall enger +ĠH aku +umer ic +Ġdep recated +ĠSH AR +4 12 +Ġdy stop +Ġtremb ling +Ġdread ed +ĠSp ac +p adding +Re pl +ĠG arrison +M ini +Ġun paralleled +am ar +URR ENT +w reck +c ertain +t al +ĠC LS +app ings +Ġsens ed +Ġf encing +ĠPas o +ĠDes k +Ġsc off +Ġcontem plate +ĠL iga +l iquid +75 7 +Ġapp rentice +ĠUCH IJ +5 70 +ĠTh ousand +ĠIll um +Ġchampion ed +ãĤ Į +Ġelect ors +Ġ3 98 +ĠH ancock +round ed +ĠJ OHN +Ġuns atisf +Ġqual ifier +ĠGad get +EN E +Ġdead liest +ĠPl ants +Ġ ions +Ġacc ents +Ġtwe aking +Ġsh aved +F REE +ĠCh aser +Again st +9 60 +Ġmeth amphetamine +Ġnormal ized +Ġ$ \ +ĠPre cision +ĠGu am +Ġch oked +ĠX II +ĠCast ing +Tor rent +Ġscal p +ĠJagu ar +w it +Ġsem ic +ix ie +ĠG ould +Ġconf ines +N usra +ĠL on +ĠJ ugg +y cle +ĠCod ec +E gypt +Ġrest rain +ĠAl iens +Ġch oking +ĠD unk +ĠBell a +ab c +Ġsl ang +Ġneuro trans +s av +Ġempower ment +â ĨĴ +Ġclim bers +ĠM im +ĠF ra +ros se +Cap ital +ĠCth ulhu +Inter face +Ġprof icient +ĠIN TO +Ġ3 18 +ront al +5 80 +ĠDes pair +K enn +Ġscrim mage +ĠCo at +as ions +Ġwall paper +ĠJ ol +Ġresurg ence +Ġant iv +ĠB alls +² ¾ +Ġbuff ers +Ġsub system +ĠSt ellar +ĠL ung +A IDS +Ġerad icate +Ġblat antly +Ġbehav es +ĠN un +Ġant ics +ex port +DE V +w b +Ġph p +ĠInteg rity +Ġexplore r +Ġrev olving +auth ored +g ans +Ġbas k +Ġas ynchronous +å į +TH ING +69 8 +G ene +ĠR acer +ĠN ico +iss ued +Ġser mon +p ossibly +Ġsize of +Ġentrepreneur ial +ox in +ĠMin erva +Ġpl atoon +n os +ri ks +A UT +ĠAval anche +ĠDes c +ij 士 +ĠP oc +Ġconf erred +Î » +Ġpat ched +F BI +66 2 +Ġfract ures +Ġdetect s +Ġded icate +Ġconstitu ent +Ġcos mos +W T +Ġswe ats +Ġspr ung +b ara +s olid +Ġuns us +Ġbul ky +ĠPhilipp e +ĠFen rir +Ġtherap ists +ore al +^^ ^^ +Ġtotal ed +Ġboo ze +ĠR PC +Prosecut ors +Ġdis eng +ĠSh ared +Ġmotor cycles +Ġinvent ions +Ġlett uce +ĠMer ge +ĠJ C +Ġspiritual ity +ĠWAR NING +Ġunl ucky +ĠT ess +Ġtong ues +ĠD UI +T umblr +Ġle ans +Ġinv aders +Ġcan opy +ĠHur ricanes +ĠB ret +ĠAP PLIC +id ine +ick le +Reg arding +Ġve ggies +Ġe jac +ju ven +F ish +D EM +ĠD ino +Th row +ĠCheck ing +be ard +( & +Ġj ails +Ġh r +trans fer +iv ating +Ġfle ets +ĠIm ag +ĠMc Donnell +Ġsnipp et +Is a +ĠCh att +ĠSt ain +ĠSet FontSize +ĠO y +ĠMathemat ics +49 4 +Ġelectro ly +ĠG ott +ĠBr as +B OOK +ĠF inger +d ump +Ġmut ants +Ġrent als +Ġinter tw +Ġc reek +ail a +Bro ther +ĠDisc ord +pe e +raw ler +Ġcar p +Ġ27 9 +ãĤ· ãĥ£ +rel ations +Ġcontr asts +Col umn +Ġrec onnaissance +Ġun know +Ġl ooting +Ġregul ates +Ġopt imum +ĠChero kee +ĠA ry +Lat est +Ġroad side +Ġd anced +ĠUnic orn +A cknowled +Ġuncont roll +ĠM US +at io +ch ance +ha ven +VAL UE +Ġfavour ites +Ġceremon ial +b inary +pe ed +wood s +EM P +Ġv ascular +Ġcontempl ated +Ġbar ren +ĠL IST +Y ellow +ospons ors +Ġwhisk y +ĠM amm +ĠDeV os +min imum +H ung +44 2 +P ic +ĠSnap dragon +77 6 +Ġcar ving +Ġund ecided +Ġadvantage ous +Ġpal ms +ĠA Q +Ġst arch +L oop +Ġpadd le +Ġfl aming +ĠHor izons +An imation +bo ost +Ġprob abilities +ĠM ish +Ġex odus +ĠEditor ial +Ġfung us +Ġdissent ing +ĠDel icious +rog ram +ĠD yn +d isk +t om +Ġfab rics +ĠC ove +ĠB ans +Ġsoft en +ĠCON S +Ġin eligible +Ġestim ating +ĠLex ington +pract ice +of i +Ġshe dding +ĠN ope +Ġbreat hed +ĠCorinth ians +y ne +ek i +B ull +Ġatt aching +reens hots +Ġanaly se +ĠK appa +Ġuns ustainable +Ġinter pol +ank y +he mer +Ġprot agonists +Ġform atted +ĠBry ce +ĠAch illes +ĠAb edin +sh ock +Ġb um +b os +qu a +ĠW arn +q t +ĠDi abetes +8 64 +ĠIn visible +Ġvan ish +Ġtrans mitting +Ġmur ky +ĠFe i +Ġawa ited +ĠJur assic +umm ies +Ġmen acing +g all +C ath +B uilt +ild o +ĠV otes +Ġon t +Ġmun itions +ĠFre em +ÃŃ n +Ġdec ency +lo pp +ie ved +ĠG ord +Ġun thinkable +ĠNews week +Ġ3 21 +He at +Ġpresent er +ji ang +Ġpl ank +ĠAval on +Ġben z +ĠR out +Ġslam ming +ĠD ai +ou ter +ĠCook ie +ĠAlic ia +ge y +Ġvan ity +Ġow l +á µ +t ested +ĠAw akens +Ġcan v +Ġblind ly +ĠRid ley +ĠEm ails +Requ ires +ĠSer bian +ograp hed +if rame +eter ia +Ġaltern ating +qu iet +Ġsoc iology +ĠUn lock +ĠCommun ism +Ġo ps +Ġatt ribution +Ġab duction +ĠAb ram +Ġsidel ined +ĠB OOK +Ġref ining +ĠFe eling +ĠOs lo +ĠPru itt +r ack +ang ible +Ġcaut iously +ĠM ARK +eed s +M ouse +ĠStep h +ĠP air +S ab +99 7 +ĠBa al +B ec +Ġcomm a +ĠP all +ĠG ael +Ġmisunder stand +ĠP esh +Order able +Ġdis mal +ĠSh iny +% " +Ġreal istically +Ġpat io +ĠG w +ĠVirt ue +Ġexhaust ing +wh atever +oph ys +y ip +4 18 +Ad just +ĠWa iting +ess on +ĠMaz da +ĠDo zens +Ġstream lined +Ġincompet ence +ĠM eth +Ġeth os +ON ES +Ġincent iv +Ġgr itty +ĠBut cher +Head er +Ġexp onential +à Ł +Ġcorrel ate +Ġcons ensual +s ounding +R ing +Orig in +Ġcon clusive +fe et +ac ly +ĠF ernandez +Buy able +Ġd ucks +aunt lets +Ġel ong +Ġ28 6 +Ġsim ul +G as +ĠK irst +Ġprot r +ĠRob o +ĠAo E +op ol +Ġpsych ologically +sp in +ilater ally +ĠCon rad +W ave +44 1 +ĠAd vertisement +ĠHarm on +ĠOri ental +is Special +Ġpresum ptive +Ġw il +ĠK ier +ne a +Ġp pm +Ġhar bour +ĠW ired +comp any +Ġcor oner +atur days +ĠP roud +ĠN EXT +ĠFl ake +val ued +ce iver +Ġfra ught +Ġc asing +Ġrun away +Ġg in +ĠLaure nt +ĠHar lem +ĠCur iosity +qu ished +Ġneuro science +ĠH ulu +Ġborrow er +Ġpetition er +ĠCo oldown +W ARD +Ġinv oking +conf idence +For ward +Ġst s +pop ulation +Delivery Date +Fil m +ĠC ov +quick Ship +quickShip Available +prim ary +isSpecial Orderable +inventory Quantity +channel Availability +BO X +ĠMulti player +ĠJen ner +77 8 +ĠM d +Ġ~ /. +M N +Ġchild ish +Ġantioxid ant +ĠChrom ebook +Ġ27 4 +Ġscreen play +Ġadvent urous +ĠRelations hip +respons ive +ming ton +Ġcorner stone +ĠF ey +F IR +Ġrook ies +ĠF eaturing +Ġorig inate +Ġelectro des +ant es +Ġscript ures +Ġgl ued +Ġdiscont ent +Ġaff licted +lay out +B rave +Ġm osa +ĠQuant ity +ĠH ik +w inner +H ours +Ġent ail +ĠCell s +olog ue +Ġv il +Ġpre acher +Ġdecor ative +d ifferent +Ġprejud ices +ĠSm oking +ĠNotting ham +so Type +Ġrhyth ms +ĠAl ph +bl ast +Ste el +ĠDaniel le +Ġstr ife +Ġrem atch +so DeliveryDate +ĠF ork +t rip +ol ulu +hes es +C G +ĠPOLIT ICO +ost a +ĠDr ift +é¾įå ¥ +é¾įå¥ ij士 +Ġvet ting +ĠJin ping +ĠRec ession +Min or +ĠF raud +enf ranch +Ġconven ed +ĠNA ACP +ĠMill ions +ĠFarm ing +ĠW oo +ĠFl are +rit o +imm igrant +Ġvac ancy +ĠHE AD +ĠV aj +eg al +ĠV igil +Stud y +Ġru ining +Ġr acks +Ġhe ater +ĠRand olph +ĠBr ush +ĠT ir +Ø ¨ +Ġc ov +% ] +Ġrecount s +ĠO PT +ĠM elt +Ġtr uce +Ġcas inos +Ġcrus ade +Ġcarn age +Ġstri pe +ĠK yl +Text ures +Ġ6 98 +Ġpro clamation +Ġgood ies +Ġ........ .. +pro claimed +P olit +Ġtop ical +Ġspecial ize +ĠA min +g m +Ġanch ored +Ġbear ings +s ample +ĠHigh land +ĠAut ism +Ġmerc enary +Ġinterview er +L ER +ĠSom ers +Ġembry o +ĠAss y +Ġ28 1 +ĠEd iting +ĠCh osen +6 60 +Ġp ci +ĠThunder bolt +BI LL +Ġchuck led +jri wal +h of +Ġearth ly +() { +ind ependence +Ġdisp ers +ĠV endor +ĠG areth +Ġp als +P enn +ĠSub mit +ic um +Th u +Ġcl andestine +Ġcann ibal +ĠCl erk +E Stream +gal itarian +âĻ ¥ +g ew +Ġhor rend +ĠL ov +ĠRe action +ocr in +Class ic +Ġecho ing +Ġdiscl osing +ĠIns ight +og un +ĠInc arn +upload s +pp erc +guy en +Ġ19 01 +ĠB ars +68 7 +Ġb ribes +ĠFres no +ur at +ĠRe ese +Ġintr usive +Ġgri pping +ĠBlue print +ĠR asm +un ia +man aged +ĠHeb do +Ġ3 45 +Ġdec oding +Ġpo ets +Ġj aws +ĠF IGHT +am eless +ĠMead ows +ĠHar baugh +Inter view +ĠH osp +ĠB RA +Ġdelet ion +m ob +W alker +ĠMoon light +ĠJ ed +ĠSoph ia +Ġus ur +Ġfortun ately +ĠPut ting +ĠF old +Ġsan itation +Ġpart isans +IS ON +B ow +ĠCON C +ĠRed uced +ĠS utton +Ġtouch screen +Ġembry os +âĢ¢âĢ¢ âĢ¢âĢ¢ +ĠK rug +com bat +ĠPet roleum +Ġam d +ĠCos mos +Ġpresc ribing +Ġconform ity +ours es +Ġplent iful +Ġdis illusion +ĠEc ology +itt al +Ġf anc +Ġassass inated +regn ancy +Ġperenn ial +ĠBul lets +Ġst ale +Ġc ached +ĠJud ith +ĠDise ases +All en +Ġl as +Ġsh ards +ĠSu arez +ĠFriend ship +inter face +ĠSupp orters +add ons +46 2 +ĠIm ran +ĠW im +Ġnew found +ĠM b +An imal +Ġd arling +and e +Ġrh y +ĠTw isted +pos al +yn ski +Var ious +× ľ +ĠK iw +uy omi +Ġwell being +ĠL au +an os +Ġunm ist +Ġmac OS +Ġrest room +ĠOl iv +ĠAir ways +Ġtimet able +9 80 +Ġrad ios +v oy +ias co +Ġcloud y +ĠDraw ing +Any thing +Sy ria +ĠH ert +st aking +Ġun checked +Ġb razen +ĠN RS +69 7 +onom ic +est ablish +Ġl eng +Ġdi agonal +ĠF ior +L air +ĠSt ard +Ġdef icient +jo ining +be am +Ġomn ip +Ġbl ender +Ġsun rise +Mo ore +ĠF ault +ĠCost ume +ĠM ub +Fl ags +an se +Ġpay out +ĠGovern ors +ĠD illon +ĠBan ana +N ar +Ġtra iled +Ġimperial ist +um ann +ats uki +4 35 +ĠRoad s +Ġsl ur +ĠIde ally +Ġt renches +C trl +Ġmir rored +ĠZ el +ĠC rest +Comp at +ĠRoll s +sc rib +ĠTra ils +omet ers +w inter +Ġimm ortality +il ated +Ġcontrad icts +un iversal +ill ions +ĠM ama +opt im +AT URE +Ġge o +et ter +ĠCar lo +4 24 +Ġcanon ical +ĠStrongh old +n ear +Ġperf ume +Ġorche stra +od iac +Ġup he +Ġreign ing +vers ive +Ġc aucuses +ĠD EM +Ġinsult ed +Ġ---- -- +ĠCr ush +Ġroot ing +ĠWra ith +Ġwh ore +Ġto fu +C md +ĠB ree +Ġ$ _ +Ġr ive +ĠAd vertising +Ġw att +ĠH O +Ġpersu asive +ĠParam eters +Ġobserv ational +ĠN CT +ĠMo j +ĠSal on +Ġtr unc +Ġexqu isite +ĠMar a +Ġpo op +ĠAN N +Ex c +ĠWonder ful +ĠT aco +Ġhome owner +ĠSmith sonian +orpor ated +mm mm +Ġlo af +ĠYam ato +ĠInd o +Ġcl inging +á s +Ġimm utable +h ub +Or ange +Ġfingert ips +ĠWood en +ĠK idd +ĠJ PM +ĠDam n +C ow +c odes +48 2 +Ġiniti ating +ĠEl k +ĠCut ting +Ġabsent ee +ĠV ance +ĠLil ith +G UI +Ġobsc ured +Ġdwar ves +ĠCh op +ĠB oko +Val ues +Ġmult imedia +Ġbrew ed +Reg ular +CRIP TION +ĠMort al +Ġa pex +Ġtravel er +Ġbo ils +Ġspray ing +Rep resent +ĠStars hip +4 28 +Ġdisappro val +Ġshadow y +Ġlament ed +ĠRe place +ĠFran ç +67 7 +d or +Ġunst oppable +Ġcoh orts +gy n +ĠClass ics +ĠAm ph +Ġsl uggish +ĠAdd iction +ĠPad res +Ġins cription +Ġin human +min us +ĠJere miah +at ars +Ter ror +ĠT os +ĠSh arma +ast a +c atch +Ġpl umbing +ĠTim bers +Sh ar +H al +ĠO sc +Ġcou pling +hum ans +Ġsp onge +Ġid ols +ĠSp a +ĠAdv ocate +ĠBe ats +lu a +Ġtick ing +Ġload er +ĠG ron +8 10 +Ġstim ulated +Ġside bar +ĠManufact urer +ore And +19 73 +Ġpra ises +ĠFl ores +dis able +ĠElect rical +ra ise +E th +Ġmigr ated +Ġlect urer +K ids +ĠCa vern +Ġk ettle +Ġgly c +ĠMand ela +ĠF ully +å§ « +FIN EST +Ġsquee zing +ĠRy der +amp oo +oreAnd Online +Inst oreAndOnline +Buyable InstoreAndOnline +Ġcommem orate +ĠRamp age +Aust in +ĠSh roud +ĠRu ins +9 15 +ĠK H +Ġwater front +ĠE SC +b aby +ĠC out +ĠEm blem +Ġequival ents +49 2 +Un ique +ĠNiet zsche +brow ser +Ġim itation +ĠWere wolf +ĠKir in +ac as +' ," +Ġà ¾ +Review ed +Ġc unt +Ġvo ic +ĠLen ovo +Ġbond ed +48 1 +Ġinhib itors +Ġendeav ors +ĠHav ana +ĠSt out +ĠJ olly +A ctor +*/ ( +Ġoccur rences +ĠT ens +Incre ased +ĠACT ION +Ġ ãĢĮ +ĠRank ings +ĠB reat +Ġ30 9 +D ou +Ġimpact ing +ĠDuc hess +pre fix +Q B +Ġsummon ing +Ġbest owed +ĠKe pler +ĠPOW ER +c ube +ĠK its +ĠG rip +Ġop ium +Ġrep utable +t oc +ich ael +ĠR ipple +Ġcaf é +ĠZ oom +ĠBur ma +Ġwa ive +Ġst alls +Ġdem eanor +inc erity +Ġfluor ide +ĠSH OULD +Par is +Ġlong ing +Ġpl at +Ġgross ly +Ġbull s +Ġshowc asing +ex pected +ĠG addafi +engine ering +Re peat +ĠK ut +Ġconce ivable +Ġtrim med +osc ope +ĠCand idate +ĠT ears +rol og +Lew is +S UP +Ġroad map +Ġsal iva +Ġtrump et +Jim my +Ġmirac ulous +Ġcolon ization +Ġam put +ĠGN OME +ate ch +D ifferent +ĠE LE +ĠGovern ments +ĠA head +ãħĭ ãħĭ +word press +L IB +ĠIn clude +ĠDor othy +0 45 +ĠColomb ian +Ġle ased +88 4 +Ġde grading +ĠDa isy +i ations +Ġbapt ized +Ġsurn ame +co x +Ġblink ed +ãĥ ¢ +Ġpoll en +Ġder mat +Ġre gex +ĠNich olson +ĠE ater +ç ľ +rad or +Ġnarrow er +Ġhur ricanes +Ġhalluc inations +r idden +ISS ION +ĠFire fly +Ġattain ment +Ġnom inate +Ġav ocado +ĠM eredith +Ġt s +Ġreve rence +Ġe uph +Ġcr ates +ĠT EXT +Ġ4 43 +Ġ3 19 +J SON +iqu ette +Ġshort stop +ic key +Ġpro pelled +Ġap i +ĠTh ieves +77 9 +Ġovers aw +Ġcol i +ĠNic ola +Ġover cl +ik awa +ĠC yr +Ġ38 4 +78 9 +ĠAll ows +10 27 +Det roit +TR Y +set up +ĠSocial ism +Sov iet +s usp +ĠAP R +ĠShut down +Ġal uminium +zb ek +ĠL over +GGGG GGGG +Ġdemocr acies +Ġ19 08 +ĠMer rill +ĠFranco is +gd ala +Ġtraff ickers +ĠT il +ĠGo at +Ġsp ed +ĠRes erv +Ġpro d +55 2 +Ġc ac +ĠUn iv +ĠSch we +Ġsw irling +ĠWild erness +ĠEgg s +Ġsadd ened +Ġarch aic +H yd +Ġexcess ively +B RE +Ġaer ospace +ĠVo ices +Cra ig +Ġign ited +In itially +ĠMc A +Ġhand set +Ġreform ing +Ġfrust rations +ĠDead pool +ĠBel ichick +ract or +ĠRagnar ok +ĠD rupal +ĠApp roximately +19 20 +ĠHub ble +arm or +ĠSar as +ĠJon as +Ġnostalg ic +Ġfeas ibility +Sah aran +Ġorb iting +Ġ9 70 +R u +Ġsh in +ĠInvestig ators +Ġinconsist encies +ĠP AN +B G +Ġgraz ing +Ġdetect ors +ĠStart up +ĠFun ny +ĠNa omi +Consider ing +Ġh og +ut f +ce mic +Ġfort ified +ĠFun ctions +Ġcod ec +nut rition +H at +" ! +micro soft +55 8 +ĠTh in +ĠA CE +Al ias +ĠO PS +p apers +P K +ãĢ İ +Ġimpro bable +N orthern +equ al +Ġlook out +Ġty res +ĠMod ified +ĠK op +Abs olutely +Ġbuild up +sil ver +Ġaud i +Ġgro tesque +ĠSab er +ĠPres byter +ON Y +Ġglac iers +ĠSho als +ĠK ass +ĠH RC +ĠNic ol +ĠL unch +ĠF oss +âĸ Ĵ +AD RA +ĠOne Plus +o ing +ground s +Ġincident al +Ġdatas ets +68 9 +ĠClarks on +Ġassemb ling +ĠCorrect ions +Ġdrink ers +Ġqual ifiers +Ġle ash +Ġunf ounded +ĠH undred +Ġkick off +T i +Ġrecon cil +ĠGr ants +ĠCompl iance +ĠDexter ity +Ġ19 06 +w arn +D allas +Max imum +n ard +av ia +be aut +ens itivity +tr ace +Ġpione ers +ĠF ract +ãĢ ı +Ġpre cept +Ġgloss y +ĠI EEE +Ac ross +Ġ6 80 +S leep +che on +Ġsatir ical +ĠMin otaur +ĠCla ude +Ġr é +ape go +Ġcar rot +ĠSem in +ino a +Ġz o +Ind ependent +Ġdiagn oses +ĠC ue +M AR +Ġrend ition +ĠK ik +Ġpath ology +Ġselect s +Link edIn +Ġass ay +ĠD res +Ġtext ual +post ed +IT AL +ĠM aul +N eal +Ġinter connected +Ġerr atic +ĠVir us +Ġ5 30 +Ġenvironmental ists +ĠP helps +Ġeng agements +ĠIN ST +Ġeconom ical +nox ious +Ġg earing +izz y +Ġfavor ably +ĠMcG ill +T erm +Ġh anged +Ġball park +ĠRe yes +Ġbe ware +ĠP sal +ĠMass acre +q i +Ġin accessible +acly sm +Ġfr ay +ill ac +Ġbitter ly +ĠCert ification +Mich igan +Ġir respective +al ore +Em pty +Ġendorse ments +Ġund et +f g +equ ipped +Ġmerc iless +ĠC ust +Ġimm ature +Ġvou cher +ĠBlack well +Ñ ı +h awk +dis ciplinary +ile e +ĠMak oto +ĠD ude +ãĥĩ ãĤ£ +Y ears +Ġin ver +Ġsh aman +ĠY ong +ip el +ell en +ĠCath y +br ids +Ġs arc +65 1 +N ear +Ġground work +Ġam az +Ġ4 15 +ĠHunting ton +hew s +ĠB ung +Ġarbit rarily +ĠW it +ĠAl berto +Ġdis qualified +best os +46 1 +Ġp c +Ġ28 4 +ro bat +Rob in +Ġh ugs +ĠTrans ition +ĠOcc asionally +Ġ3 26 +ĠWh ilst +ĠLe y +Ġspaces hip +cs v +Ġun successfully +ĠA u +le ck +ĠWing ed +ĠGrizz lies +. � +Ġne arer +ĠSorce ress +ĠInd igo +El se +8 40 +let es +Co ach +Ġup bringing +ĠK es +Ġseparat ist +Ġrac ists +Ġch ained +Ġabst inence +lear ning +Ġrein stated +Ġsymm etry +Ġremind ers +ĠChe vy +Ġm ont +Ġexempl ary +ĠT OR +Z X +Ġqual itative +ĠSt amp +ĠSav annah +ĠRoss i +Ġp aed +Ġdispens aries +ĠWall s +ĠCh ronic +Ġcompliment ary +ĠBeir ut +Ġ+ --- +igs list +Ġcrypt ographic +mas ters +ĠCap itals +Ġmax imal +Ġent ropy +Point s +Ġcombat ants +l ip +ĠGl ob +ĠB MC +ph ase +th ank +HT TP +Ġcomm uter +Ġ\( \ +.. / +ĠReg ener +ĠDO I +ĠActiv ision +Ġsl it +os al +RE M +Ġch ants +Y u +Ke ys +Bre xit +ĠFor ced +Ari zona +Ġsquad ron +IS O +ĠMal one +Ġ3 38 +Ġcontrast ing +Ġt idal +Ġlib el +Ġimpl anted +Ġupro ar +ĠC ater +Ġpropos itions +M anchester +ĠEuro s +it amin +G il +ĠEl ven +ĠSe ek +ĠB ai +Ġredevelop ment +ĠTown s +ĠL ub +! ", +al on +K rist +Ġmeas urable +Ġimagin able +Ġapost les +Y N +7 60 +Ġster oid +Ġspecific ity +ĠL ocated +ĠBeck er +ĠE du +ĠDiet ary +uts ch +ĠMar ilyn +Ġbl ister +ĠM EP +ĠK oz +ĠC MS +y ahoo +ĠCar ney +Ġbo asting +ĠC aleb +By te +read s +ad en +Pro blem +ĠWood ward +S we +S up +ĠK GB +Set up +Ġtac it +Ġret ribution +Ġd ues +ĠM ü +. ? +ä¸ Ń +p ots +Ġcame o +ĠP AL +educ ation +A my +like ly +g ling +Ġconstitution ally +ĠHam m +ĠSpe ak +Ġwid gets +br ate +Ġcra ppy +ĠI ter +Ġanticip ating +ĠB out +P ixel +ĠY ep +ĠLaur ie +Ġh ut +Ġbullet in +ĠSal vation +Ġch ats +ear able +Honest ly +AL TH +onse qu +c ult +isco very +ovy ch +Ġse lves +ĠSat oshi +S ounds +Ġconver gence +ĠRosen berg +19 74 +Ġnas al +Ġfull est +Ġfer ocious +x us +ist e +AM S +Ġlobb ied +Ġso othing +ĠGun n +t oday +0 24 +Ġinspir ational +ĠN BN +p b +g ewater +or ah +all owed +ĠCol iseum +Ġspecial izing +Ġinsane ly +ĠT ape +del ay +Ġt arn +ĠP ound +Ġmel anch +Ġdeploy ments +il and +Ġless en +Ġfur ry +ĠUE FA +Ġblood shed +ĠMe ier +ither ing +Ġhe irs +ĠJ aw +ax ter +ĠPublic ations +Ġal ters +int ention +ĠWinc hester +d etermination +ĠLif etime +th in +Mon ster +7 80 +Ġapprox imation +Ġsuper markets +ĠSecond s +or os +h uge +Ġb ribe +ĠLIM ITED +un ed +Ġmis interpret +ĠIn jury +Ġ3 67 +Ġthreshold s +ĠCarn ival +Ġgastro intestinal +Ġguid eline +Ġde ceived +f eatures +Ġpurported ly +ĠRon nie +ĠNew t +Ġsp acious +as us +Ġsuperhero es +ĠCyn thia +le gged +k amp +ch io +Ġth umbnail +ĠShir ley +ill ation +Ġshe ds +ĠZ y +E PA +Ġdam s +Ġy awn +n ah +ĠPe ggy +ĠE rie +ĠJu ventus +ĠF ountain +r x +don ald +al bum +ĠComp rehensive +Ġc aching +ĠU z +ulner ability +ĠPrinc iple +ĠJ ian +ing ers +cast s +ĠOs iris +ch art +t ile +ĠTiff any +ĠPatt on +ĠWh ip +Ġovers ized +J e +ĠCind erella +ĠB orders +ĠDa esh +M ah +Ġdog ma +Ġcommun ists +v u +Coun cil +Ġfresh water +Ġw ounding +Ġdeb acle +Ġyoung ster +Ġthread ed +ĠB ots +ĠSav ings +ãģ Ĥ +ol ing +oh o +Ġillum ination +M RI +Ġlo osen +tr ump +ag ency +ur ion +Ġmoment arily +ĠCh un +ĠBud apest +ĠAl ley +D isk +Ġaston ished +ĠCon quer +ĠAccount ing +h aving +ĠWe in +ĠAl right +Ġrev olver +Ġdel usion +Ġrelic s +Ġad herent +qu ant +Ġhand made +or io +Ġcomb ating +c oded +Ġquad ru +re th +N ik +ĠTrib al +ĠMyster ious +Ġin hal +ĠWin ning +ĠClass ification +ch anged +Ġun ab +Ġsc orn +icip ated +w l +ond uctor +Ġrein forcing +ĠChild hood +an ova +Ġadventure r +Ġdoctor al +ĠStrateg ies +Ġengulf ed +ĠEnc ounter +Ġl ashes +Crit ical +ric ular +ĠU TF +oci ation +check ing +ĠConsult ing +Run time +per iod +ĠAs gard +Ġdist illed +ĠPas adena +ĠD ying +ĠCOUN TY +Ġgran ite +Ġsm ack +Ġparach ute +ĠS UR +Virgin ia +ĠF urious +78 7 +ĠO kin +Ġcam el +ĠM bps +19 72 +ĠCh ao +ĠC yan +j oice +ef er +ĠW rap +ĠDeb ate +S eg +Ġfore arm +ĠIgn ore +Ġtim estamp +Ġprob ing +ĠNo on +ĠGra il +f en +Ġdorm ant +ĠFirst ly +ĠE ighth +ĠH UN +ĠDes ire +or as +Girl s +ĠDes mond +z ar +am ines +O AD +exec ute +Ġbo obs +ĠAT L +_ ( +Chel sea +Ġmasturb ation +ĠCo C +Ġdestroy er +ĠCh omsky +Ġsc atter +ĠAss ets +79 6 +ĠC argo +Ġrecept ive +ĠSc ope +Ġmarket ers +Ġlaun chers +Ġax le +ĠSE A +se q +ĠM off +f inding +ĠGib bs +Georg ia +extreme ly +N J +Ġlab orers +st als +Ġmed iation +ĠH edge +at own +Ġi od +des pite +v ill +J ane +ex istence +Ġcoinc ided +ĠUt ilities +ĠChe ap +Ġlog istical +Ġcul mination +ĠNic otine +p ak +F older +Ġrod ents +st uff +Ġlaw fully +Ġreper to +io ch +j j +Dial ogue +HH HH +lic tion +Look s +Ġ29 7 +Ġtur rets +ĠAb andon +Ġinc ess +ĠTraff ord +Ġcur led +Ġprefer ring +Ġprivat ization +Ġir resist +ĠP anda +ĠSh ake +ĠMc Gr +ãĥ Ħ +und ers +Ġdiscrim inated +Ġbart ender +I LE +Atl antic +Ġprop ensity +ĠW iz +ĠG im +con ference +Ġrein forces +G h +w agon +Ġe erie +F al +Ġhug ged +rac ist +R IC +F u +Ġf iller +ĠSt ub +Ġeng raved +ĠWrest le +Ġimagin ative +ĠPe er +ĠFact ors +an us +ĠDrac ula +mon itor +Ġrou ters +ib ia +ĠBoo lean +end ale +ĠSl aughter +ĠSh ack +R FC +ĠSpiel berg +S ax +ĠPH OTO +ĠCl over +ĠR ae +Dep ending +ĠMem or +ar am +Ġpier ced +Ġcur tains +v ale +ĠInqu isition +ĠP oke +Ġforecast ing +Ġcompl ains +S ense +ĠHer mes +isc overed +Ġb ible +ĠMor ph +Ġg erm +78 5 +D ON +Ġcon gen +Ġcr ane +ĠD PR +Ġrespect fully +R oom +ĠN aw +ĠDal ai +re ason +ĠAng us +Educ ation +ĠTitan ic +Ë ľ +Ġo val +un ited +Ġthird s +Ġmoist ur +ĠC PC +M iami +Ġtent acles +ĠPol aris +ex c +ex clusive +ĠPra irie +Ġcol ossal +ĠBl end +sur prisingly +ÃŃ s +Ġindo ctr +Ġbas al +ĠMP EG +und o +Spl it +Develop ment +Ġlan tern +19 71 +Ġprov ocation +Ġang uish +ĠB ind +ĠLe ia +duc ers +ipp y +conserv ancy +Ġinitial ize +ĠTw ice +ĠSu k +Ġpred ic +Ġdi ploma +Ġsoc iop +Ing redients +Ġhamm ered +ĠIr ma +Q aida +Ġglim ps +ĠB ian +Ġst acking +Ġf end +gov track +Ġun n +dem ocratic +ig ree +Ġ5 80 +Ġ29 4 +Ġstraw berry +ID ER +Ġcher ished +ĠH ots +Ġinfer red +Ġ8 08 +ĠS ocrates +O regon +ĠR oses +ĠFO IA +Ġins ensitive +Ġ40 8 +Recomm end +ĠSh ine +Ġpain staking +UG E +ĠHell er +ĠEnter prises +I OR +ad j +N RS +L G +Ġalien ated +Ġacknowled gement +ĠA UD +ĠRen eg +Ġvou chers +Ġ9 60 +Ġm oot +ĠDim ensions +Ġc abbage +B right +g at +ĠK lu +Ġlat ent +Ġz e +ĠM eng +Ġdis perse +Ġpand emonium +H Q +Ġvirt uous +ĠLoc ations +ee per +prov ided +Ġse ams +ĠW T +iz o +PR OV +Ġtit anium +Ġrecol lection +Ġcr an +Ġ7 80 +ĠN F +49 1 +64 2 +p acking +59 8 +text ure +Sp ider +fre edom +cipl ed +ĠTAM ADRA +âĻ ¦ +aut hent +ĠW ANT +r ified +Ġr ites +Ġuter us +k iss +Ġâī ¤ +Ġsk illet +Ġdis enfranch +ĠGa al +Comp an +Ġage ing +gu ide +B alt +Ġiter ator +Ġdiscretion ary +t ips +Ġprim ates +ĠTechn ique +ĠPay ments +az el +ĠR OCK +stant ial +0 60 +Ġd mg +ĠJack ets +ĠPlay off +Ġnurs ery +ĠSy mb +art on +Ġannex ation +Color ado +Ġco ils +ĠSh oes +âĦ¢ : +ĠRo z +COM PLE +ĠEve rest +ĠTri umph +J oy +G rid +à ¼ +process or +ĠPros per +ĠSever us +ĠSelect ed +r g +ĠTay yip +St ra +Ġski ing +Ġ? ) +Ġpe g +Tes la +Ġtime frame +Ġmaster mind +ĠN B +scient ific +ĠSh it +gener ic +IN TER +N UM +Ġst roll +ĠEn ix +ĠM MR +ĠE MS +m ovie +Ĥ ª +Ġminim izing +idd ling +Ġilleg itimate +Ġprot otyp +Ġpremature ly +Ġmanual s +obb ies +ĠCass idy +D EC +des ktop +Ġaer os +Ġscreen ings +Ġdeb ilitating +ĠGr ind +nature conservancy +Ġf ades +ter mination +assets adobe +F actor +Ġdefinitive ly +P oké +ap ult +ĠLaf ayette +C orn +ĠCor al +Ġstagn ant +T ue +Ġdissatisf action +G ender +Ġkid neys +ĠG ow +ĠDef eat +ĠAsh ton +Ġcart els +Ġfore closure +ĠExpl ore +stre ngth +ot in +Ġveterin arian +Ġf umble +Ġpar ap +ĠSt rait +r ils +Ġpr ick +ĠBerm uda +ĠAm munition +skin ned +Ġab ound +ĠB raz +Ġshar per +ĠAsc ension +Ġ9 78 +Ġpreview s +Ġcommun ion +ĠX Y +Ġph ony +Ġnewcom er +Ġ3 32 +." ," +Ġredist ribution +Prot ect +ĠSo f +K al +Ġlip stick +w orst +Ġtang led +Ġretrospect ive +int eger +Ġvolunte ering +Ġ19 07 +Ġ -------------------- +ic hen +Ġunve iling +Ġsen seless +Ġfisher ies +\ - +Ġh inges +Ġcalcul us +My th +Ġund efeated +Ġoptim izations +Ġdep ress +Ġbill board +ĠY ad +ĠPy ramid +Is n +I de +Ġleg ion +ĠK ramer +ent anyl +Ġpenet rating +ĠHaw th +ĠPR ODUCT +ĠGer ard +ĠP act +ĠIn cluding +ĠEl ias +ĠEl aine +vis ual +Ġhum ming +Ġcond esc +ĠF asc +ä¸ Ĭ +Ġe galitarian +Ġdev s +ĠD ahl +O ps +D H +ĠB ounce +id ated +ald o +Ġrepublic an +Ġh amb +ĠS ett +ograph ies +CH APTER +Ġtrans sexual +Ġsky rocket +ans wer +Ġmark up +Ø ª +Ġhero ine +Comp are +ĠT av +Be ast +Ġsuccess ors +Ġna ïve +ĠBuck ley +st ress +me at +Ġdownload able +Ġindex ed +Ġsc aff +ĠL ump +ĠHom o +Stud io +In sp +Ġr acked +far ious +ĠPet ty +Ex ternal +Ġ19 09 +W ars +com mit +put ers +Ġun ob +ĠEr r +ĠE G +ĠAl am +ĠSiber ia +ĠAtmosp heric +IS TER +ĠSatan ic +trans lation +ĠL oud +tra umatic +l ique +Ġreson ate +ĠWel ch +Ġspark ing +ĠT OM +t one +Ġout l +Ġhandc uffed +ĠSer ie +8 01 +Ġland marks +ĠRee ves +Ġsoft ened +Ġdazz ling +ĠW anted +month s +Mag ikarp +Ġunt reated +ĠBed ford +M i +ĠDynam o +O re +79 5 +Ġwrong ful +Ġl ured +Ġcort isol +Ġve x +d rawn +ile t +Download ha +ĠF action +Ġlab yrinth +Ġhij acked +w aters +er ick +Ġsuper iors +ĠRow ling +ĠGu inness +Ġt d +99 2 +Ġune arthed +Ġcentr if +Ġsham eless +P od +ĠF ib +Ġ icing +Ġpredict or +Ġ29 2 +fore station +con struct +C and +@ # +Ġag itated +Ġre pr +OV A +Ġkn itting +ĠLim a +Ġf odder +68 4 +ĠPerson a +k l +7 01 +Ġbreak up +á ¸ +Ġapp alled +Ġantidepress ants +ĠSus sex +Har ris +ĠTher mal +ee ee +U pload +Ġg ulf +Ġdoor step +ĠSh ank +L U +ĠM EN +ĠP ond +s orry +Ġmis fortune +n ance +Ġb ona +M ut +Ġde graded +ĠL OG +ĠN ess +an imal +Ġa version +und own +Ġsupplement ed +ĠC ups +Ġ50 4 +Ġdep rive +ĠSpark le +Å Ĥ +ĠMed itation +auth ors +ĠSab an +ĠN aked +air d +ĠMand arin +ĠScript ures +ĠPerson nel +ĠMahar ashtra +Ġ19 03 +ĠP ai +ĠMir age +omb at +Access ory +Ġfrag mented +T ogether +Ġbelie vable +ĠGl adiator +al igned +ĠSl ug +M AT +Ġconvert ible +ĠBour bon +amer on +ĠRe hab +nt ax +Ġpowd ered +pill ar +Ġsm oker +ĠMans on +ĠB F +5 11 +ĠGood ell +ĠD AR +m ud +g art +Ġob edient +ĠTrans mission +ĠDon ation +8 80 +Ġbother ing +Material s +ãĤ ± +dest roy +Ġfore going +Ġanarch ism +ĠK ry +ice ps +Ġl ittered +ĠSch iff +Ġanecd otal +un its +Ġf ian +ĠSt im +ĠS OME +ĠInv aders +Ġbehaviour al +ĠVent ures +Ġsub lime +Ġfru ition +ĠPen alty +Ġcorros ion +¶ ħ +Ġlik ened +Ġbesie ged +ween ey +ĠCre ep +Ġlinem en +mult i +ic ably +ud der +Ġvital ity +Ġshort fall +ĠP ants +ap ist +H idden +ĠDro ps +med ical +Ġpron unciation +ĠN RL +Ġinsight ful +J V +ĠBe ard +ĠCh ou +Ġchar ms +Ġb ins +Ġamb assadors +ĠS aturdays +Ġinhib itor +ĠFr anch +6 01 +', ' +ĠCon or +art ney +ĠX peria +g rave +be es +ĠProtest ants +Ġso aking +ĠM andal +Ġph ased +Ġ6 60 +Ġsc ams +Ġbuzz ing +ĠItal ians +ĠLoren zo +ĠJ A +Ġhes itated +Ġcl iffs +ĠG OT +ingu ishable +Ġk o +Ġinter ruption +Z ip +Lear ning +Ġundersc ores +ĠBl ink +K u +57 9 +ĠAut ob +I RE +Ġwater ing +Ġpast ry +8 20 +Ġvision ary +ĠTempl ar +awa ited +Ġpist on +Ġant id +current ly +Ġp ard +Ġw aging +Ġnob ility +ĠY us +Ġinject ing +f aith +ĠP ASS +å º +Ġret ake +ĠPR OC +Ġcat hedral +b ash +Ġwrest lers +Ġpartner ing +Ġn oses +Ġ3 58 +Trans form +am en +Ġb outs +ĠId eal +ĠConstant in +Ġse p +ĠMon arch +att en +ĠPe oples +mod ified +Ġmor atorium +Ġpen chant +Ġoffensive ly +Ġprox ies +ok ane +ĠTaiwan ese +ĠP oo +ĠH OME +us ional +Ġver bs +ĠO man +vis ory +Ġpersu asion +Ġmult it +Ġsc issors +G ay +ow ay +oph ysical +l us +gn u +Ġap ocalyptic +Ġabsurd ity +Ġplay book +Ġautobi ography +I UM +Ġsne aking +ĠSim ulation +pp s +ell ery +Plan et +Ġright fully +Ġn iece +ĠN EC +ĠIP O +ĠDis closure +lean or +ous y +ST ER +Ġ28 2 +Cru z +Ch all +64 3 +ĠSurv ive +ĠF atal +ĠAm id +ap o +We apons +D EN +7 70 +ĠGreen wald +Ġlin en +al os +Ġpollut ants +ĠPCI e +k at +Ġp aw +ĠK raft +C hem +ĠTermin ator +Ġre incarn +Ġ] [ +ĠSe eds +Ġsilhou ette +ĠSt ores +Ġgro oming +ĠD irection +ĠIs abel +ĠBr idges +ðŁ ij +E ED +ĠM orsi +Ġval ves +ĠRank ed +ĠPh arma +ĠOrgan izations +Ġpenet rated +ĠRod ham +ĠProt oss +Ġove rest +Ġex asper +ĠT J +Ġ 000000 +Ġtrick le +Ġbour bon +WH O +Ġw retched +Ġmicrosc opic +Ġcheck list +Ġad orned +R oyal +Ad minist +ĠRet irement +ĠHig hest +We ather +ile ge +Ġincre ments +ĠC osponsors +Ġmas se +ĠS inn +r f +Ġh ordes +as sembly +75 4 +ĠNat asha +ĠTY PE +ĠGEN ERAL +Ġarr anging +Ġ40 7 +l ator +Ġg lean +Ġdisc redited +Ġclin icians +UN E +Ġachie ves +ĠEm erson +com plex += [ +Ġprincip ally +Ġfra il +p icked +Ġthan king +Ġre cl +ĠL AST +Ġsupp ressing +il ic +Ġantidepress ant +ĠLis bon +Ġth or +Ġsp a +Ġking doms +ĠPear ce +em o +Ġpl ung +Ġdiv est +Ġ ******************************** +b is +osp els +ad r +Sp irit +hall a +P ink +end ez +Ġresurrect ed +esc ape +ĠRosen stein +Ġge ological +Ġnecess ities +Ġcarn iv +ĠE lys +ĠBar ney +Ġ29 6 +dig y +ST ON +D OWN +Ġmil estones +Ġk er +Ġdismant ling +Ġre prim +Ġcross ings +19 45 +Ġpatri archy +Ġblasp hemy +Ġ3 59 +met ry +ĠOb esity +ĠDiff erences +bl ocking +ãĥķ ãĤ¡ +ich ita +ĠSab ha +ph alt +ĠCol o +ual a +effic ients +ĠMed ina +con sole +55 7 +ĠHann ibal +ĠHab it +ĠF ever +Ġthen ce +Ġsyn agogue +Ġessential s +Ġw ink +ĠTr ader +ID A +ĠSp oiler +ĠIceland ic +ĠHay ward +Ġpe ac +Ġmal ice +Ġflash back +Ġth w +Ġlay offs +L iquid +Ġtro oper +Ġh inge +ĠRead ers +Ph ill +ĠB auer +Cre ated +Ġaud its +ac compan +Ġunsus pecting +ier a +6666 6666 +Ġbro ch +Ġapprehend ed +ĠM alk +cer ning +ĠCod ex +O VER +M arsh +ĠD eng +ĠExp ression +Ġdisrespect ful +Ġasc ending +t ests +ĠPlaint iff +ster y +ĠAl ibaba +din and +ĠDem psey +Applic ations +mor al +Ġthrough put +Ġquar rel +Ġm ills +Ġhe mor +ĠC ASE +terror ist +st im +ifest yle +ro zen +CE PT +Ar k +u ci +lect ic +Ġirrit ating +she ets +A y +Ġrede emed +Ġhorn y +ĠTe ach +ĠS ear +dem ocracy +4 65 +ĠRest ore +Ġstand by +ĠP is +iff in +Ġsleep y +Ġextr ater +Ġcompl iments +Fram eworks +Ġinstall s +Ġb anging +sur face +found land +Ġmetaph ysical +Ġ28 3 +oul s +dev ices +Ar gs +ĠSac rifice +ĠMcC orm +es on +Cons ervative +ĠM ikhail +see ing +is ively +ĠRo oms +ĠGener ic +Ġenthusi astically +Ġgri pped +Ġcomed ic +ĠElectric ity +Ġgu errilla +Ġdec oration +ĠPerspect ive +Ġconsult ations +Ġun amb +Ġplag iar +Ġmagic ian +Ġe rection +ĠTour ism +or ied +ro xy +11 00 +T am +Ī è +Î ³ +× ª +ĠPred ators +Nit rome +Ġtelesc opes +project s +Ġun protected +Ġst ocked +ĠEnt reprene +nex pected +Ġwast ewater +V ill +Ġint imately +Ġi Cloud +ĠConst able +Ġspo of +Ġne farious +Ġfin s +Ġcens or +ĠMod es +ĠEs per +ar bon +Ġinter sections +Ġlaud ed +Ġphys i +Ġgener ously +ĠThe Nitrome +ĠTheNitrome Fan +Ġar isen +ĠÙ Ī +Ġg lands +ĠPav ilion +ĠGu pta +Ġuniform ly +Ġr amps +ri et +ĠWH EN +ĠVan essa +Ġrout ed +Ġlim p +ĠC PI +p ter +int uitive +Ġv aping +Ġexperiment ed +ĠOlymp us +ĠAm on +Ġsight ing +Ġinfiltr ate +ĠGentle man +Ġsign ings +ĠMe ow +ĠNav igation +che cks +4 33 +Ġel apsed +ĠBulg arian +esp ie +ĠS OM +d uring +Ġsp ills +anc a +ĠPly mouth +M AL +Ġdomest ically +ĠWater gate +ĠF AM +k illed +ed ited +ĠYour self +Ġsynchron ization +ĠPract ices +ST EP +Ġgen omes +ĠQ R +not ice +Ġloc ating +z in +Ġ3 29 +al cohol +Ġk itten +V o +Ġr inse +Ġgrapp le +ĠSc rew +ĠD ul +A IR +Ġle asing +ĠCaf é +Ġro ses +ĠRes pect +Ġmis lead +Ġperfect ed +Ġnud ity +Ġnon partisan +ĠCons umption +Report ing +Ġnu ances +Ġdeduct ible +ĠSh ots +Ġ3 77 +Ġæ ľ +ano oga +Ben ef +ĠB am +ĠS amp +if ix +Ġgal van +ĠMed als +rad ius +Ġno bles +Ġe aves +igr ate +K T +ĠHar bour +u ers +Ġrisk ed +re q +Ġneuro t +get table +ain a +Rom ney +Ġunder pin +Ġlo ft +ĠSub committee +ĠMong ol +b iz +Ġmanif ests +ass isted +ĠG aga +Ġsy nergy +Ġreligious ly +ĠPre f +ĠG erry +T AG +ĠCho i +4 66 +beh ind +ĠO u +Gold Magikarp +Ġhemor rh +R iver +Ġtend on +Ġinj ure +ĠF iona +Ġp ag +Ġag itation +|| || +ur an +ĠE SA +Ġest eem +Ġdod ging +Ġ4 12 +r ss +Ġce ases +ex cluding +Ġint akes +Ġinsert s +Ġemb old +ĠO ral +up uncture +4 11 +ĠUn ified +ĠDe le +Ġfurn ace +ĠCoy otes +ĠBr ach +L abor +Ġhand shake +Ġbru ises +Gr ade +éĹ ĺ +ĠGram my +ile en +St ates +ĠScandinav ian +ĠKard ash +8 66 +Ġeffort lessly +ĠDI RECT +ĠTH EN +ĠMe i +ert ation +19 68 +Ġgro in +w itch +Requ irements +98 5 +Ġroof s +Ġest ates +ĠH F +Ġha ha +Ġdense ly +ĠO CT +Ġpl astics +Ġincident ally +ĠTr acks +ĠTax es +Ġch anted +Ġforce ful +ĠBie ber +ĠK ahn +K ent +ĠC ot +lic ts +F ed +Ġhide ous +ĠVer d +ĠSynd icate +ĠIl legal +J et +ĠD AV +re asonable +c rew +Ġfundamental ist +Ġtruth ful +ĠJ ing +Ġl il +Ġdown ed +Ġen chanted +ĠPolic ies +ĠMcM aster +ĠH are +ides how +Ġpar ams +en cers +gorith m +Ġallow ances +Ġturb ulent +Ġcomplex ities +ĠK T +Ġ3 37 +ĠGen etic +F UN +D oug +t ick +Ġg igs +ument hal +Ġpatriarch al +Ġcal c +, ... +Ġc out +ĠGu an +Ġpath ological +ĠR ivals +Ġunder rated +Ġflu orescent +ĠJ iu +arna ev +ĠQu an +Ġ4 29 +Ġ ਠ+M ario +Con struct +ĠC itation +ĠR acial +ĠR SA +ĠF idel +Ġ3 95 +Person ally +C ause +à » +rad ical +in en +Ġvehement ly +ĠPap a +Ġintern ship +Ġfl akes +ĠRe ck +Luck ily +B ra +20 20 +rav ings +R N +W onder +Ser iously +Ġre usable +Ġpoll uted +ĠP eng +le igh +ind le +Ġcircuit ry +ĠMad onna +ĠB ART +Res idents +att ribute +Phil adelphia +Cl ub +Ġplan ner +Ġfr antically +Ġfaith fully +ĠTerrit ories +ĠL AT +ĠAnders en +an u +ĠP ARK +ĠS ora +i age +ĠPlay offs +ĠG CC +4 27 +Ġab norm +ĠL ever +Ġdisob edience +As ync +ĠShe a +V ert +Ġsk irts +ĠSaw yer +x p +Ġwors ening +Ġsc apego +ĠAng le +oth al +Ġtro ve +ĠSt y +ĠN guyen +mar ine +ide on +Dep ths +Bl og +ĠIll uminati +Ġtract s +Ġorgan ise +Ġo str +F s +Ġlever aging +ĠD aredevil +as ar +Ġl ang +Ġex termin +urs ions +ĠRom o +ãĤ¤ ãĥĪ +Ġcont ended +Ġencounter ing +ĠTable t +ĠAltern ate +sk ill +Ġswe ets +Ġco hesive +cap acity +Ġrep ud +Ġl izard +ro o +Ġpilgr ims +ĠR uff +ĠInstr ument +ĠLog o +uit ous +E H +Ġsales man +Ġank les +L ed +ĠPat ty +ud os +Own er +Ġdiscrep ancies +k j +M U +Ġuncond itional +Dragon Magazine +i ard +O ak +ĠConvers ation +be er +ĠOs aka +D elta +us ky +Ġsecret ion +Ġpl aza +Ġm ing +Ġde pletion +ĠM ous +ĠI TS +ĠH imal +ĠFle ming +Ġcyt ok +ĠH ick +Ġbat ters +ĠInt ellectual +6 75 +é r +IS ION +ĠQu entin +ĠCh apters +ih adi +Ġco aster +WAY S +ĠL izard +ĠY or +and ering +S kin +ha ust +ab by +Ġportray ing +Ġwield ed +d ash +Ġprop onent +Ġr ipple +Ġgrap hene +Ġfly er +Ġrec urrent +Ġdev ils +Ġwater fall +æĺ ¯ +go o +Text Color +Ġtam pering +IV ES +TR UMP +ĠAb el +ĠS AL +ĠHend ricks +ĠLu cius +b ots +Ġ40 96 +IST ORY +Gu est +ĠN X +in ant +Ben z +ĠLoad ed +ĠCle ver +t reatment +Ġta vern +Ġ3 39 +ĠT NT +ific antly +Tem perature +F el +Ġunder world +ĠJud ges +Ġ< + +Ġst ump +Ġoccup ancy +Ġab er +ĠF inder +) ", +ĠN unes +res et +in et +ect omy +Ġwell ness +ĠP eb +quart ered +and an +Ġneg atives +ĠTh iel +ĠCl ip +ĠL TD +Ġbl ight +Ġreperto ire +K yle +Ġqu er +ĠC es +Ġha pl +98 9 +ĠTh ames +isc opal +Des k +ivari ate +ĠEx cellence +found ation +Ġâ ĩ +X i +Ġmyster iously +esty les +Ġper ish +ĠEng els +ĠDE AD +09 0 +}} } +ĠUn real +Ġrest less +ID ES +orth odox +ĠInter mediate +Ġdin ners +ĠTr out +ĠSe ym +ĠHall s +og ged +Ġtraged ies +Ġdid nt +67 6 +Ġail ments +Ġobserv able +ĠV ide +ad apt +ĠD usk +Ġprofessional ism +ĠPres cott +ĠInd ies +p ox +ĠMe hran +W ide +Ġend emic +ĠPar an +B ird +Ġped als +ĠI U +ĠAdam ant +ĠH urt +Ġcorrel ates +urd en +Ġspons oring +cl imate +ĠUnivers ities +ĠK not +enn es +ĠDam ian +ĠAx el +S port +Ġbar b +ĠS no +sh own +ste en +ud ence +Ġnon violent +Ġhom ophobia +Ġbiom ass +ĠDet ail +Ġsrf N +ĠT une +accompan ied +I ENCE +Al bert +ĠMong o +z x +ĠCer berus +or bit +c ens +Ġsl ay +SH ARE +H Y +Ġb rawl +ĠPro be +Ġnonex istent +ĠClare nce +ĠBlack burn +Ġport als +ĠR ita +ĠRem ain +ĠLe vant +Ġtrick ed +ĠF erry +aver ing +ĠStraw berry +ĠAn swers +Ġhorrend ous +ĠA man +Supp lement +ĠT oad +Ġpe eled +Ġman oeuv +ĠU zbek +mond s +ĠH ector +Ġ40 2 +pe es +fix es +Ġd j +Ġres umes +Ġaccount ant +Ġadvers ity +Ġham pered +ĠL arson +Ġd oping +part s +H ur +Ġbe arded +Ġy r +ĠPlug in +å¥ ³ +Ġ/ ** +rol ley +Ġwaters hed +ĠSub mission +if lower +AS C +Ġcho ir +Ġsculpt ures +m A +incre asing +ai i +Ġsne akers +Ġconfront s +ĠEle phant +ĠEl ixir +Ġrec al +ĠT TL +w idget +ĠW ax +ĠGr ayson +Ġha irst +Ġhumili ated +ĠWAR N +app iness +ĠT TC +F uel +Ġpol io +Ġcomplex es +Ġbab e +ĠX IV +P F +). [ +P arts +Ġ4 35 +M eg +ĠY ards +ĠAL P +Ġy ells +Ġprin ces +Ġbull ies +ĠCapital ism +ex empt +FA Q +ĠSp onge +ĠAl a +Ġpleas antly +Ġbu f +Ġden ote +Ġunp ublished +Ġkne eling +asc a +Ġl apse +al ien +99 4 +Ġrefere es +ĠLaw yers +S anta +Ġpuzz ling +ĠProm etheus +ĠPh araoh +ĠDel ay +Ġfacilit ates +ĠC ES +Ġjew els +Ġbook let +ond ing +Ġpolar ization +ĠMor an +ĠSal ad +ĠS OS +ĠAdv ice +PH OTOS +IC AN +iat ures +ex press +ĠWonder land +ĠC ODE +ĠCL ASS +9 75 +Ġg rep +ĠD iesel +ĠGl ac +! ?" +Ġr m +o ine +disc rimination +ĠN urse +m allow +Ġv ortex +ĠCons ortium +Ġlarge Download +stra ight +augh lin +G rad +Ġpublic ized +ĠW aves +ĠRed d +Ġfest ivities +ĠM ane +ar ov +Ġfleet ing +ĠDr unk +ug en +C ele +Ġchromos omes +ĠD OT +-+-+ -+-+ +Ġbus iest +ĠBe aver +Sy rian +ĠK yr +k as +ĠCross Ref +19 50 +76 01 +Ġrepe aling +ĠWin ners +ĠMac ro +ĠD OD +bl ance +S ort +64 1 +Ġmet re +ĠD irk +Ġgo ggles +Ġdraw backs +Ġcomplain ant +Ġauthor izing +Ġantit rust +oper ated +Ġm ah +Ġexagger ation +Am azing +ĠSer aph +Ġha ze +w ow +Ġextingu ished +Ġcan yon +ĠB osh +Ġv ents +Ġsc rape +Cor rect +4 26 +Ġav g +Dem and +ĠâĪ ¼ +Ġmicrobi ota +"} ]," +ĠSt ev +B io +ĠPlan es +Ġsuggest ive +Ġdec ipher +ĠRefuge e +ĠKe jriwal +ĠGreen peace +Ġdecl ass +ĠSound ers +Ġth o +Ġdec rypt +Ġbr ushing +ĠJane iro +ip op +S i +8 77 +ĠGeoff rey +Ġc pu +ĠHaz el +Ġview points +Ġcris py +ĠNot ification +Ġsold er +ĠMod est +ĠHem isphere +Ġcass ette +in cludes +Ġident ifiers +ĠC ALL +in cent +T odd +ĠSwe ep +Ġ3 34 +b oss +Ġsm ir +gin x +Ġtown ship +Ġg rieving +ĠMos que +Net flix +AS ED +ĠMillenn ials +oc om +19 67 +Ġbold ly +s leep +Ġes che +arij uana +Ġsw irl +ĠPen al +Ġneglig ent +ĠStephen son +K ER +ĠZ oro +ris is +Ġlocal ization +ĠSeym our +ĠAng lic +red itation +prot ection +ĠPa ige +Ġo mit +ĠR ousse +ĠT ub +Ġinv itations +t ty +Ġm oss +ph ysical +C redits +Ġan archy +Ġchild care +Ġl ull +ĠM ek +ĠL anguages +lat est +ĠSan ford +Ġus ability +Ġdiff use +ĠD ATA +Ġsp rites +ĠVeget a +ĠProm otion +ãĥ¼ ãĤ¯ +rict ing +z ee +Tur kish +ĠTD s +pro ven +57 1 +Ġsmug glers +707 10 +Ġreform ed +ĠLo is +Ġun fl +ĠWITH OUT +ĠReturn ing +ann ie +ĠTom as +Fr anc +ĠProf it +ĠSER V +ĠR umble +ik uman +es an +Ġt esters +Ġgad get +Ġbrace let +ĠF SA +comp onent +Ġparamed ics +Ġj an +ĠRem em +ĠSk inner +Ġl ov +ĠQu ake +rom a +Ġfl ask +Pr inc +Ġover power +Ġlod ging +ĠK KK +ret te +Ġabsor bs +w rote +Ġ ," +K ings +ĠH ail +ĠFall ing +xt ap +ĠHel ena +ire ns +L arry +Ġpamph let +ĠC PR +G ro +ĠHirosh ima +Ġhol istic +". [ +Ġdet achment +Ġas pire +Ġcompl icit +ĠGreen wood +Ġresp awn +ĠSt upid +ĠFin ished +f al +b ass +Ġab hor +Ġmock ery +ĠFe ast +VID EO +Ġcon sec +ĠHung ry +P ull +ĠH ust +it ance +? ãĢį +) -- +ĠPar allel +con v +4 69 +ha ar +w ant +P aper +m ins +ĠTor o +ĠTR UMP +ĠR ai +D W +ĠW icked +ĠL ep +Ġfun ky +Ġdetrim ent +ios is +ache v +Ġde grade +im ilation +Ġret ard +Ġfrag mentation +Ġcow boy +ĠY PG +ĠH AL +Parent s +ĠS ieg +ĠStra uss +ĠRub ber +× IJ +Fr ag +Ġp t +Ġoption ally +ĠZ IP +ĠTrans cript +ĠD well +88 2 +M erc +ĠM OT +ãĥ¯ ãĥ³ +Ġhun ts +Ġexec utes +In cludes +Ġacid ic +ĠRespons ibility +ĠD umb +we i +And erson +ĠJas per +ight on +abs olutely +Ad ult +Ġpl under +Mor ning +ĠT ours +ĠD ane +Î º +ĠT EST +ĠG ina +Ġcan ine +aw an +Ġsocial ists +ĠS oda +Ġimp etus +ĠSupplement ary +oli ath +ĠKinn ikuman +mitted ly +second s +Ġorganis ers +Ġdocument aries +Vari able +GRE EN +Ġres orts +Ġbr agging +Ġ3 68 +Art ist +w k +bl ers +Un common +ĠRet rieved +Ġhect ares +Ġtox in +r ank +Ġfaith s +ĠG raphic +Ġve c +ĠL IA +Af rican +Ġard ent +end iary +L ake +ĠD OS +cient ious +ĠOk awaru +ĠAll y +ĠTim eline +D ash +ĠI c +contin ue +Ġt idy +Ġinstinct ively +ĠP ossibly +ĠOut door +ĠWould n +Ġl ich +ĠBr ay +ĠA X +Ġà ī +Ġ+ # +\ ' +Direct ory +ab iding +Ġf eral +ic ative +but t +Ġper verse +S alt +Ġwar ped +Ġnin eteen +Ġcabin ets +Ġsrf Attach +ĠSl oan +Ġpower ing +reg ation +F light +se vere +Ġst ren +Ġc og +ap ache +Ġâ Ŀ +Ġcaf eteria +p aces +ĠGrim oire +uton ium +Ġr aining +Ġcir cling +Ġlineback ers +c redit +Ġrep atri +ĠCam den +lic ense +Ġly ric +Ġdescript or +Ġval leys +Ġre q +Ġback stage +ĠPro hibition +ĠK et +Op ening +S ym +æĸ ¹ +Ġserv ings +Ġoverse en +Ġaster oids +ĠMod s +ĠSpr inger +ĠCont ainer +è » +ĠM ens +Ġmult im +Ġfire fighter +pe c +Ġchlor ine +Ð ¼ +end i +Ġsp aring +Ġpolyg amy +ĠR N +ĠP ell +Ġt igers +Ġflash y +ĠMad ame +S word +Ġpref rontal +Ġpre requisite +uc a +Ġw ifi +Ġmiscon ception +Ġharsh ly +ĠStream ing +ot om +ĠGiul iani +foot ed +Ġtub ing +ind ividual +z ek +n uclear +m ol +Ġright ful +49 3 +Ġspecial ization +Ġpassion ately +ĠVel ocity +ĠAv ailability +T enn +Ġl atch +ĠSome body +Ġhel ium +cl aw +Ġdi pping +XX X +Ġinter personal +7 10 +Ġsub ter +Ġbi ologists +ĠLight ing +Ġopt ic +Ġden im +end on +ĠC orm +Ġ3 41 +ĠC oup +Ġfear less +Ġal ot +ĠCliff ord +ĠRun time +ĠProv ision +up dated +lene ck +Ġneur on +Ġgrad ing +ĠC t +sequ ence +in ia +con cept +Ġro aring +ri val +ĠCaucas ian +Ġmon og +key es +Ġappell ate +Ġlia ison +EStream Frame +ĠPl um +! . +Ġsp herical +Ġper ished +Ġbl ot +Ġben ches +Ġ4 11 +Ġpione ered +Ġhur led +Jenn ifer +ĠYose mite +Ch air +Ġreef s +Ġelect or +ĠAnt hem +65 2 +Ġun install +Ġimp ede +Ġbl inking +Ġgot o +Dec re +A ren +Ġstabil ization +ĠDis abled +ĠYanuk ovych +Ġoutlaw ed +ĠVent ura +ten ess +Ġplant ation +Ġy acht +ĠHu awei +Ġsol vent +Ġgr acious +Ġcur iously +Ġcapac itor +Ġc x +ĠRef lex +Ph ys +ĠC f +pt in +cons ervative +Ġinv ocation +c our +F N +ĠNew ly +H our +As ian +ĠLe ading +ĠAer ospace +An ne +Ġpre natal +Ġdeterior ating +H CR +ĠNorm andy +ol ini +ĠAm bro +9 10 +Ġset backs +ĠT RE +Ġs ig +ĠSc ourge +59 7 +79 8 +Game play +Ġm sec +M X +Ġprice y +ĠL LP +aker u +Ġover arching +ĠB ale +Ġworld ly +Cl ark +Ġscen ic +Ġdisl iked +ĠCont rolled +T ickets +ĠE W +ab ies +ĠPl enty +Non etheless +Ġart isan +Trans fer +ĠF amous +Ġinf ield +ble y +Ġunres olved +ĠML A +ãĤ Ĥ +Cor rection +Ġdemocr at +ĠMore no +ro cal +il ings +Ġsail or +Ġr ife +h ung +Ġtrop es +Ġsn atched +ĠL IN +ĠB ib +ES A +ĠPre v +ĠCam el +run time +Ġob noxious +4 37 +Ġsum mers +Ġunexpl ained +ĠWal ters +cal iber +Ġg ull +ĠEnd urance +ä½ ľ +Ġ3 47 +Ir ish +Ġaer obic +Ġcr amped +ĠHon olulu +à © +us erc +ec ast +AC Y +ĠQu ery +ãĤ¹ ãĥĪ +Bet a +Ġsuscept ibility +ĠSh iv +ĠLim baugh +Ġà ĸ +ĠN XT +ĠM uss +ĠBrit ons +ES CO +EG IN +Ġ% % +Ġsec ession +ĠPat ron +ĠLu a +n aires +ĠJPM organ +us b +ocy te +Ġcouncill ors +ĠLi ang +f arm +Ġnerv ously +Ġattract iveness +ĠK ov +j ump +Pl ot +Ġst ains +ĠStat ue +ĠApost les +he ter +ĠSUP PORT +Ġoverwhel m +Y ES +Ġ29 1 +d ensity +Ġtra pping +M it +Ġf ide +ĠPam ela +atl antic +Dam n +Ġp ts +OP A +Ġserv icing +Ġoverfl owing +ul o +ĠE rit +t icket +light ing +ĠH mm +ãĥ¼ ãĥ« +im oto +Ġchuck le +4 23 +ãģ ķ +sh ape +Ġque ues +Ġanch ors +ãĤ¼ ãĤ¦ãĤ¹ +F er +Ġaw oke +Ġ6 66 +h ands +Ġdiver gence +Ġ50 5 +T ips +Ġdep ot +Ġske w +ĠDel iver +op ot +Ġdiv ul +ĠE B +uns igned +ĠUn i +X box +Ġfor ks +Ġ7 02 +å ¯ +Ġpromot ers +ĠV apor +Ġlev ied +sl ot +Ġpig ment +Ġcyl inders +C RE +Ġsn atch +Ġperpet ually +Ġl icking +ĠFe et +ĠKra ken +ĠHold en +ĠCLS ID +m r +Ġproject or +Ġden otes +Ġchap el +ĠTor rent +b ler +R oute +ĠDef endant +ĠPublisher s +ĠM ales +ĠInn ov +ĠAg ility +rit er +ty mology +st ores +L ind +Ġf olly +ĠZur ich +B le +Ġnurt ure +Ġcoast line +uch in +D omin +Ġfri vol +ĠCons olid +res ults +M J +Ġphyl ogen +Ġha uled +ĠW iley +ĠJess ie +ĠPrep are +ĠE ps +Ġtreasure r +I AS +Ġcolon ists +Ġin und +ĠWW F +ĠCon verted +6 000 +out side +ĠApp earance +ĠRel ic +ĠM ister +s aw +Ġresult ant +Ġadject ive +ĠLaure l +ĠHind i +b da +Pe ace +Ġreb irth +Ġmembr anes +Ġforward ing +Ġcoll ided +ĠCar olyn +K ansas +5 99 +ĠSolid GoldMagikarp +Be ck +Ġstress ing +ĠGo o +ĠCooper ative +Ġf s +ĠAr chie +L iter +ĠK lopp +J erry +Ġfoot wear +War ren +Ġsc ree +h are +Under standing +P ed +Ġanth ology +ĠAnn ounce +M ega +Ġflu ent +Ġbond age +ĠDisc ount +il ial +C art +ĠNight mares +Sh am +ĠB oll +uss ie +H ttp +Atl anta +Ġun recogn +ĠB id +Ġunder grad +Ġforg iving +ĠGl over +AAAA AAAA +4 45 +V G +pa io +kill ers +Ġrespons ibly +Ġmobil ize +Ġeffect ed +ĠL umin +Ġk ale +Ġinfring ing +ann ounced +Ġf itt +b atch +ĠT ackle +ĠL ime +ĠAP P +uke mia +Ġrub y +Ġex oner +ĠCas ual +0 70 +Ġpel vic +Ġautom ate +ĠK ear +ĠCoast al +Ġcre ed +Ġbored om +ĠSt un +ri ott +Ĥ İ +Ġregener ate +Ġcomed ians +ĠOP ER +Sp ons +id ium +on is +L ocated +05 7 +Ġsusp ense +ĠD ating +C ass +Ġneoc ons +ĠShin zo +Ġaw oken +ch rist +ĠMess ages +att led +ĠSpr ay +ĠSp ice +C W +Ġshield ing +ĠG aul +Am id +Ġparam ilitary +Ġmult if +ĠTan ner +il k +Ġgodd amn +g ements +Ġbe friend +m obi +Ġ3 88 +fold er +acc a +Ġins in +g ap +N ev +fif th +Ġpsychiat ry +b anks +TH IS +Ġhar b +ac qu +Ġfac ade +ĠPower Point +80 3 +Ġbl uff +Sh ares +Ġfavor ing +El izabeth +Ãį Ãį +Ġr anger +77 2 +ĠAr che +h ak +ĠGen etics +ĠF EMA +Ġev olves +Ġest e +ĠP ets +ĠM é +ĠInterest ing +ĠCanter bury +ch apter +ĠStar fleet +Sp anish +Ġdraw back +ĠNor wich +9 70 +n orth +ag anda +Ġtransform ative +ram ids +bi ology +ad ay +Ġpropag ation +ĠGam ma +ĠDen ise +ĠCalcul ator +ent imes +ĠB ett +Ġapp endix +ĠHD D +AK ING +Ġst igmat +Ġhol ster +Ġord inarily +Ch ance +ĠCont rary +Ġad hesive +Ġgather s +6 12 +re au +ony ms +ew ays +Ġindu ces +Ġinterchange able +se m +Wh it +Ġtr ance +Ġincorpor ation +ĠExt ras +Fin ancial +Ġawkward ly +ĠStur geon +ĠH Y +Norm ally +ĠEnd ing +ĠAss ist +enc rypted +Ġsub jug +Ġn os +Ġfan atic +C ub +C U +?" . +Ġirre versible +å Ĥ +03 1 +ĠH AR +sp read +ul ia += $ +Sc ope +L ots +Ġlif estyles +ol on +Ġf eds +Ġcongrat ulate +web kit +Ġindist inguishable +ĠSw ing +Ġcommand ments +qu ila +ab ella +m ethyl +ann abin +Ġo vere +Ġlob ster +ĠQU EST +ĠCONT IN +bern atorial +:::: :::: +ĠTra ve +ĠSam oa +AN I +75 2 +Ð ´ +userc ontent +ĠMod erate +y eah +ĠK itt +Ġwe e +Ġstuff ing +ĠInter vention +ĠD ign +Ġware houses +ĠF iji +Ġpel lets +Ġtake away +ĠT ABLE +ĠClass ical +col lection +Ġland fall +ĠMus cle +Ġsett les +ĠAD V +Ġ3 44 +L aura +Ġf ared +ĠPart ial +4 36 +oss ibility +ĠD aly +ĠT arant +ĠFu ji +am l +c ence +55 1 +ĠProced ures +ĠO CD +ĠU D +t in +Q UI +ach o +4 38 +Ġgl itches +Ġenchant ment +Ġcalcul ates +IR O +ĠH ua +alys es +ĠL ift +um o +Ġle apt +Ġhypothes ized +ĠGust av +it ans +VERS ION +æ ł +Rog er +Ġr and +ĠAd apter +Ġ3 31 +ĠPet ition +k ies +M ars +Ġunder cut +ze es +ĠLy ons +ĠDH CP +Miss ing +Ġretire es +Ġins idious +el i +> ) +. ãĢį +Ġfinal ists +ĠA ure +Ġacc user +Ġwas tes +ĠY s +ĠL ori +Ġconstitu encies +Ġsupp er +Ġmay hem +or ange +Ġmis placed +Ġmanager ial +Ġex ce +ĠCL I +Ġprim al +ĠL ent +Cry stal +h over +ĠN TS +end um +Ġd w +ĠAl c +n ostic +Ġpres erves +ĠTs arnaev +Ġtri pled +rel ative +Arc ade +k illing +ĠW EEK +ĠH anna +D ust +Com pleted +ģ « +Ġappro ves +ĠSur f +ĠLuther an +ven ants +Ġrobber ies +we ights +soft ware +at ana +ug al +Ġgrav y +ĠC ance +OLOG Y +ly ak +Ton ight +Ġunve il +Ġ19 04 +ĠMin ion +ent ious +st ice +pack ages +ĠG EAR +Ġg ol +ĠHutch inson +ĠProf ession +ĠG UN +ĠDiff erence +ĠTsuk uyomi +ĠLes bian +6 70 +Ġfug itive +ĠPlan etary +-------------------------------- ------------------------ +Ġacc rued +Ġch icks +Ġsto pp +Ġblock ers +C od +Ġcomment ers +ĠSomew here +ĠPhot ographer +the me +Ġmay oral +w u +Ġanten nas +Ġrev amped +ĠSubject s +it é +im ura +Ġentr ances +liter ally +Ġten ets +ĠO MG +ĠMP H +ĠDon key +ĠOff ense +Ġ" + +Sn ap +ĠAF B +Ġan imate +ĠS od +His panic +Ġinconsist ency +D b +F Y +Ex port +Ġa pe +Ġpear l +ib el +ĠPAC s +Ġ{ \ +Ġact u +ĠHS BC +camp us +Ġpay off +Ġde ities +ĠN ato +ou ple +Ġcens ored +ĠCl ojure +Ġconf ounding +en i +Ġreck on +op he +Ġspot ting +Ġsign ifies +Ġprop el +Ġfest ive +S uggest +Ġpled ging +ĠB erman +Ġrebell ious +Ġovershadow ed +Ġinfiltr ated +j obs +67 2 +Ġscal able +Ġdomin ion +ĠNew foundland +ĠMead ow +Ġpart itions +AM I +Ġsupplement ary +str ument +Ġhair y +Ġperpet uate +Ġnuts hell +ĠPot ato +ĠHob bit +Ġcur ses +Flo at +Ġquiet er +Ġfuel ing +Ġcaps ules +ĠL ust +ĠH aunted +Exec utive +Ġchild birth +G re +Ġrad iant +å İ +Ġm alls +Ġin ept +ĠWarrant y +Ġspect ator +E h +t hens +Ġculmin ating +æ © +ary a +ãĤ ® +ilit arian +ĠOR IG +ĠSp ending +pt ives +ĠS iren +ĠRec ording +ay ne +Ġv im +Ġspr ang +T ang +ĠM FT +mor ning +ĠWe ed +m peg +cess ion +ĠCh ung +7 30 +w arning +56 2 +handed ly +P oor +P olitics +: # +Ġp ian +Ġfec es +ĠDocument ation +Ġban ished +Ġ3 99 +ĠAR C +Ġhe inous +J ake +ĠAm ir +way ne +v re +os henko +Ġnotebook s +Ġfound ational +Ġmarvel ous +ixt ape +Ġwithdraw als +Ġh orde +ĠD habi +is able +ĠK D +Ġcontag ious +ĠD ip +ĠAr rows +Ġpronoun s +Ġmorph ine +ĠB US +68 2 +Ġk osher +fin ished +ĠInstr uments +Ġf used +yd en +ĠSal mon +F ab +aff ected +K EN +C ENT +Dom ain +Ġpoke mon +ĠDr inking +G rowing +ĠInvestig ative +ĠA ether +em i +Ġtabl oid +Ġrep ro +ĠNot withstanding +ĠBers erker +Ġdram as +Ġclich é +Ġb ung +ĠU RI +ĠD os +0 44 +Ġpast ors +Ġl s +Ġac rylic +aun ts +Ed ward +Ġmajor ities +B ang +Ġfield ing +ĠRepl acement +ĠAl chemy +pp ard +ĠRome o +ĠSan ct +ĠLav rov +ib ble +Inst ruct +Ġimp ractical +ĠPlay boy +ce phal +Ġsw aps +Ġk an +ĠThe o +Ġillust rating +Ġdismant led +ĠTrans gender +ĠG uth +UG H +Ġtriumph ant +Ġencomp ass +Ġbook mark +udd in +j er +Ġpred icate +ES H +Ġwhen ce +ĠAB E +Ġnon profits +Se qu +Ġdi abetic +Ġp end +Ġheart felt +sh i +Ġinter acts +ĠTele com +Ġbombard ment +dep ending +ĠLow ry +ĠAd mission +ĠBl ooming +ust ration +ene gger +B rew +Ġmol ten +ĠNer d +P IN +âĸ Ģ +ave ment +Ġtou red +Ġco efficients +ĠTray von +ans son +Ġsand y +t old +fl ows +Ġpop ulous +ĠT inder +ĠBl iss +R achel +Min imum +Ġcontest ant +ĠRed uce +ĠMor se +ĠGrass ley +ĠClick er +Ġexp r +Ġs incerity +Ġmar qu +Ġelic it +ĠPro position +ĠDemon ic +Ġtac os +G reek +Ġpost war +Ġin sofar +ĠP ork +Ġ35 2 +doctor al +walk ing +Ġmid term +ĠSam my +sight ed +ĠTR ANS +ic i +AL D +ĠUS L +ĠF ISA +ĠAm pl +ĠAlex andra +ine lli +Tr ain +Ġsign ify +ĠVers us +Ġob fusc +Ġk h +Ġagg ro +ĠRen ault +Ġ3 48 +5 18 +ox icity +0 22 +ĠTw ist +Ġgoof y +D ynamic +Ġbrief ings +m ight +8 99 +Ġderog atory +T ro +Ġfor ging +ĠKor an +ĠMar ried +ĠBuc s +Ġpal ate +ĠCon version +m able +4 13 +Ġ( _ +Ġs iph +ĠN EO +col lege +Ġmarg inally +Ġfl irt +ĠTra ps +ĠP ace +é »Ĵ +Ġgoalt ender +Ġforb ids +Ġcler ks +ĠT ant +ĠRobb ins +ĠPrint ing +Ġpremie red +Ġmagn ification +ĠT G +ĠR ouse +ĠM ock +odynam ics +Ġpre clude +ism o +ĠPul itzer +Ġaval anche +ĠK odi +rib une +ĠL ena +Elect ric +Ġref inery +Ġend owed +Ġcounsel ors +Ġd olphin +ĠM ith +Ġarm oured +hib ited +Beg in +ĠP W +O il +ĠV or +ĠShar if +ĠFraz ier +est ate +Ġj ams +Pro xy +Ġband its +ĠPresbyter ian +ĠPrem iere +t iny +ĠCru el +Test ing +Ġhom er +ĠV ERS +ĠPro l +ĠDep osit +ĠCoff in +Ġsemin ars +Ġs ql +ĠDef endants +Altern atively +ĠR ats +ç « +ethy st +' > +Ġiss uer +58 9 +Ġch aired +ĠAccess ories +man ent +Ġmar row +ĠPrim ordial +C N +Ġlimit less +ĠCarn age +Ġund rafted +q v +IN ESS +on ew +Ġco hesion +98 7 +Ġne cks +Ġfootball er +ĠG ER +Ġdetect able +ĠSupport ing +ĠCS V +oc ally +k Hz +Ġund e +Ġsh one +Ġbud ding +tra k +Stand ing +ĠStar craft +ĠKem p +Ben ch +Ġthw arted +ĠGround s +ath i +L isa +Dial og +ĠS X +V ision +Ġingen ious +Ù IJ +Ġfost ering +ĠZ a +ĠIn gram +Ġ" @ +N aturally +6 16 +0 35 +ĠF AC +H mm +55 4 +Ġacceler ator +ĠV end +Ġsun screen +Ġtuber culosis +rav iolet +ĠFunction al +ĠEr rors +ed ar +19 66 +ĠSpect re +ĠRec ipes +88 5 +ĠM ankind +L iverpool +Ġ| -- +Ġsubst itutes +ĠX T +w ired +Ġinc o +ĠAf gh +E va +ic c +S ong +K night +Ġdilig ently +ĠBroad cast +A id +Ġaf ar +ĠH MS +aton in +ĠGr ateful +Ġfire place +ĠOm ni +e uro +ĠF RE +ĠSh ib +ĠDig est +t oggle +Ġheads ets +Ġdiff usion +ĠSqu irrel +ĠF N +Ġdark ened +out her +Ġsleep s +ĠX er +gun s +Ġset ups +Ġpars ed +Ġmamm oth +ĠCur ious +g ob +ĠFitz patrick +ĠEm il +im ov +........ ..... +ĠB enny +Second ly +Ġheart y +Ġcons on +st ained +Ġgal actic +cl ave +Ġplummet ed +Ġp ests +Ġsw at +Ġrefer rals +ĠLion el +h oly +Ġunder dog +ĠSl ater +ĠProv ide +ĠAm ar +ress or +å Į +ong a +Ġtim id +Ġp iety +ĠD ek +Ġsur ging +az o +Ġ6 10 +Ġdes ks +ĠSp okane +ĠAn field +Ġwars hips +ĠCob ra +Ġar ming +clus ively +ĠBad ge +ag ascar +ĠPR ESS +ĠMcK enzie +ĠFer dinand +burn ing +Af ee +Ġtyr ann +ĠI w +ĠBo one +100 7 +ĠRe pt +Ċ Âł +Ġcar avan +ĠD ill +ĠBundes liga +Ch uck +Ġheal er +ãĥ¼ãĥ Ĩ +ĠH obby +Ġneg ate +Ġcrit iques +section al +mop olitan +Ġd x +Ġouts ourcing +ĠC ipher +t ap +Sh arp +Ġup beat +Ġhang ar +Ġcru ising +ĠNi agara +Ġ3 42 +ill us +ĠS v +Ġsubt itles +Ġsqu ared +Ġbook store +Ġrevolution aries +ĠCarl ton +ab al +Ut ah +Ġdesp ise +ĠU M +cons ider +aid o +Ġc arts +ĠT urtles +Tr aining +Ġhonor ary + ¢ +Ġtri angles +4 22 +Ġreprint ed +Ġgrace ful +ĠMong olia +Ġdisrupt ions +ĠB oh +Ġ3 49 +Ġdr ains +Ġcons ulate +Ġb ends +Ġm afia +ur on +ĠF ulton +m isc +Ġren al +Ġin action +ck ing +Ġphot ons +Ġbru ised +ĠC odes +og i +Ġn ests +ĠLove ly +ĠLib re +ĠD aryl +Ġ# ## +S ys +. ," +Ġfree zes +est ablishment +and owski +Ġcum bers +ĠSt arg +ĠBom bs +Ġleg ions +Ġhand writing +Ġgr un +ĠC ah +sequ ent +Ġm oth +ĠMS M +Ins ert +F if +Ġmot el +Ġdex ter +ĠB ild +hearted ly +Ġpro pe +ĠText ure +ĠJ unction +ynt hesis +oc ard +ĠVer a +ĠBar th +Ġμ g +Ġl ashed +Ġ35 1 +ĠZ amb +ĠSt aples +ĠCort ex +ĠCork er +Ġcontinu um +ĠWR ITE +unt a +rid or +Ġde ems +0 33 +ĠG OLD +p as +Ġrep ressive +ãĥĨ ãĤ£ +Ġbaff led +Sc ar +Ġc rave +Ġ ______ +Ġentrepreneurs hip +ĠDirector ate +Ġ' [ +Ġv ines +Ġasc ended +ĠGR OUP +ĠGood bye +Ġdo gged +ãĥ´ ãĤ¡ +Man ufact +Ġunimagin able +ri ots +ier rez +Ġrel ativity +ĠCraft ing +ra ught +ud en +c ookie +Ġassass ins +Ġdissatisf ied +ac ci +Ġcondu it +Sp read +ĠR ican +n ice +izz le +Ġsc ares +ĠWH Y +ph ans +5 35 +Ġprot racted +ĠKrist en +5 36 +ĠSc rib +ĠNe h +Ġtwent ies +Ġpredic ament +Ġhandc uffs +Ġfruit ful +ĠU L +ĠLud wig +Ġatt est +ĠBre aker +Ġbi ologically +ĠDeal er +Ġrenov ations +f w +ess en +Al ice +ĠHen ri +Ġun ilaterally +ĠS idd +h ai +ĠSt retch +S ales +Ġcumbers ome +ĠJ avier +Ġtrend y +Ġrot ting +ĠChall enges +Ġscra ps +Ġfac ets +ĠVer onica +ĠVer ge +ĠS ana +Al ien +ĠR ih +Ġrad ial +ect ar +Ġ6 30 +cl i +Mar ie +Ġwild fire +ĠCat o +h ander +Ġwait ress +Ġch ops +ĠS ECTION +Ġblunt ly +ĠCat alog +n ian +stud y +Ġpat rolling +ĠT enth +nex us +ĠN ON +op sy +Ġsc athing +s ie +Ġdeterior ated +V B +Naz is +Ġdep ictions +Ġauthent icated +ĠCon ce +k rit +Ġpromul g +ĠL ONG +U FC +ĠVis itors +ĠRec all +Ġrehab ilit +ĠSL I +Ġglac ier +ĠB ite +Ġ50 3 +Ġvom it +Ġfer mented +ĠKh alid +Ġgrad ed +ĠMag icka +ĠIch igo +power ful +ic ators +75 3 +Ġsh rew +Ġ35 6 +Ġlegal izing +Ġall otted +ĠArch demon +ith ing +igg urat +V OL +Le od +Ġo ily +Ġindu cing +Ġamy gdala +Ġadm ins +ĠAcqu isition +C AN +Ġsche matic +Ġmo an +ĠCamer oon +Ġt ink +Ġmer ry +Ġbutter flies +ĠGo ff +Ġworks pace +ĠCor ona +Ġj avascript +ĠD olphin +ĠCant or +4 64 +to e +AP S +ĠAg ing +Ġpadd ed +ĠZ heng +ĠHe ld +Ġest ranged +Ġ7 70 +. } +ĠDun ham +Ġsm okes +Ġcap itals +und ai +Sh in +ĠFound ing +Ġent itle +Ġcenter piece +D iscover +Ġthere to +al ert +ĠN ou +ĠAnaly st +l c +F H +FI ELD +ĠP OV +gr ay +Ġar cs +ĠH OT +Ġr s +Ġoblig atory +ĠArchitect s +ĠS ven +ĠF EC +0 200 +Christ mas +ĠAlban ia +rat om +58 7 +Ġhard ships +Ġaut os +ĠCharg es +Ġap es +Ġ3 76 +wal let +Ġintox ication +Ġgobl in +Ġ5 70 +++++++++ ++++++++ +ĠYel p +ĠMag netic +ĠBr iggs +R ail +Ġspawn s +ĠW iggins +Ġshowc ased +Ġres orted +ub en +Ġwh ipping +Ġim itate +Ġdigest ion +ĠUS PS +ĠG est +Ġye a +ĠT ight +ind al +ic as +` . +C AST +'' ; +ĠF et +opath ic +In valid +Ġregrett ed +Ġbro ccoli +ĠSc ores +e ve +Ġpost ings +Ġaccum ulating +Ġneed less +elf th +Ġmay ors +Ġsc rib +Ġanecd otes +Ġbot ched +ĠRib bon +ĠConstant ine +i uses +ess es +Ġdev ise +Comp ared +Ġp udding +Ġg arg +Ġev oke +79 7 +Ġdet ox +9 09 +ĠPie ces +ĠMcC artney +Ġmet ast +ĠK rypt +P OR +Ġt ending +ĠMerch ants +Pro of +ĠV arg +ĠPort able +ãĥ¼ãĥĨ ãĤ£ +B rain +25 00 +Ġfol iage +Ø ¹ +Ġment ors +ĠA ires +Ġminimal ist +Ġing ested +ĠTro jan +ĠQ ian +inv olved +0 27 +Ġer oded +RA FT +Ġbl urry +M ob +Ġbuff et +ĠFn atic +ae a +KN OWN +ĠIn it +s afety +en um +ACT ION +ĠCrus her +ĠD ates +Ġ ................ +c alling +ak ov +Ġvent ured +Ġ5 55 +au ga +H art +ĠA ero +M AC +Ġthin ly +Ġar ra +ST ATE +ild e +ĠJac qu +ĠFem ales +Ġthe orem +Ġ3 46 +Ġsmart est +ĠPU BLIC +ĠK ron +ĠB its +ĠV essel +ĠTele phone +Ġdec ap +Ġadj unct +ĠS EN +mer ga +Ġred acted +Ġpre historic +Ġexplan atory +ĠRun s +ĠUtt ar +ĠM anny +ĠAUTH OR +ĠUnle ashed +ĠBow ling +be ans +79 3 +Ġunivers es +Ġsens it +ĠK ung +re peat +ctr l +Ġp aced +Ġfull er +Cl ock +Ġrec omb +ĠF aul +ĠB unker +Ġpool ed +Ġan a +ĠM outh +LL OW +hum ane +Ġbull do +ĠMicha els +f am +Ġwreck ed +Ġport rays +ĠWh ale +ĠH es +Ġguess es +ĠBrow se +ĠL APD +Ġconsequ ential +ĠInn ocent +ĠD RAG +Ġtrans gress +ĠO aks +Ġtri via +ĠRes on +ĠA DS +-- + +ĠT oll +Ġgrasp ing +ĠTHE M +ĠT ags +ĠCon clusion +Ġpract icable +Ġho op +Ġunintention ally +Ġign ite +ĠM ov +ur ized +le hem +Ter min +Ġcolour ful +ĠLin ear +ĠEll ie +G y +Ġman power +Ġj s +Ġem oji +ĠSHAR ES +_ . +0000 7 +Ġsophistic ation +Ġunders core +Ġpract ise +Ġbl ob +op ens +Uk raine +Ke eping +Y C +J R +ult imate +Cl aim +Ġautom obiles +99 3 +ste el +Ġpart ing +ĠL ank +... ? +Ġ38 5 +Ġremem brance +Ġe ased +Ġcov ari +ĠS ind +Effect ive +Ġdisse mination +ĠMo ose +ĠCl apper +br ates +App ly +Ġinv is +Ġwors ened +âĢĶ - +Ġlegisl ator +ĠL ol +ĠRow e +Ġdealers hip +um ar +id ences +Ġinvestig ates +Ġc ascade +Ġbid der +ĠB EN +Iron ically +Ġpres iding +Ġd ing +Ġcontrad icted +Ġshut s +ĠF IX +Ġ3 66 +Dist rict +Ġsin ful +ĠChar isma +o ops +Ġtot ality +Ġrest itution +ĠOpt imus +ĠD ah +Ġcl ueless +urn ed +Ġnut rit +Ġland owners +Ġfl ushed +Ġbroad en +m ie +Ġprint ln +Ġn ig +ĠCorp us +J en +Ġprot o +ĠWik imedia +ĠPal o +C OR +Ġstory lines +Ġevangel icals +ĠDar rell +Ġrot or +ĠH W +sk illed +ery l +Ġbe gg +ĠBl umenthal +Ġwe aving +Ġdown wards +ĠJack et +ĠANG EL +Te chnology +Ġes oteric +alde hyde +Ġfur iously +Ġforeign er +We ak +CH O +ĠH ound +Exper ience +ĠPlay station +ĠM IA +ĠU ng +cl oth +ag all +Ġcal ming +iz ens +St ruct +ĠW itches +ĠCeleb ration +Ġ........ ...... +pt roller +ĠTC U +Ġb unny +ãĥ į +ut orial +Ġup scale +ĠSt a +ĠCol ossus +Ġchlor ide +ĠZ ac +ĠRe asons +ĠBrook ings +ĠWH ITE +][ / +ĠL ose +9 05 +Ġunders ide +ern els +Ġv ape +do zen +upp et +ĠST OP +mat ical +ĠStat ements +hed dar +P AC +Custom er +Ġmem os +ĠP J +end ars +ĠLim its +l augh +Ġstabil ized +ĠALE C +Y A +Up grade +al am +Ġtechn o +Ġan ew +fore seen +Ġcolleg iate +ĠPy ro +ĠD ism +Ġfront line +Ġammon ia +I U +Qu ite +John ny +ass in +G OP +ĠSt yles +ĠSovere ign +acter ial +5 49 +ĠR IP +ĠL ists +Ġ3 64 +ĠRece p +s ocket +ĠByr d +ĠCand le +An cient +Ġappell ant +en forcement +ace a +ans ki +Ġold s +88 6 +Ġsl urs +Ġem pires +Ġbuck le +Ġalien ation +ĠAber deen +Ġunic orn +Ġoverr iding +ĠL X +pp a +Ġdesp ised +ĠB ugs +ĠB ST +S outhern +5 33 +Ġhall mark +ĠPost er +Ġstem med +Ġprincip als +ĠT ECH +ĠSand wich +It aly +Ġche esy +ĠSet TextColor +ĠProt ective +ĠC ohn +J O +apt op +Re ason +Lead er +ĠUnder stand +ĠFr idays +ĠContin uous +Ġcl ipping +ĠR ye +Ġber th +tim er +ann is +re act +Ġbuff alo +ĠPar as +Ġ6 55 +Ġpres ided +ĠSun rise +Ġve ts +Ġcl oves +ĠMcC ull +Stre ngth +G AN +Ġill iter +ĠPric ing +l é +Ġresist or +Ġbr un +ĠSuff olk +Ñ ĭ +ĠL iver +Re leased +Ġwhat s +8 60 +ĠMe asures +Ġden ouncing +ĠRy zen +Ġsou ven +Ġcareg ivers +ch ini +ĠScar lett +Ġt rough +Cong ratulations +Ġtax is +ĠTrad ition +j it +Ġtable top +Ġhither to +Ġdis information +off ensive +h ra +ĠDISTR ICT +Ġcompl icate +chen ko +ĠRecon struction +Ġpalp able +Ġa usp +Ġ4 28 +Ġshowc ases +ĠPublic ation +know ledge +inn on +4 19 +Ġretri eval +and ers +Ġref ute +Ġinqu ired +g ur +Ġneg ativity +Ġcons erve +Ġafter life +Ġpres upp +ĠGill espie +Ġm t +ĠD N +T ap +Ġper pend +ĠS my +does n +Ġsp illing +Ġhyp ers +K ate +® , +ke pt +ĠP owered +Ġj a +ĠK lux +ard e +ab an +Ġ4 44 +Ġflatt ened +ĠImprove ments +urg a +ĠK und +Ġins cribed +Ġfac ult +Ġunpre pared +ĠCons umers +Ġsatisf ies +Ġpul monary +Ġinf iltration +Ġex ternally +Ġcongrat ulations +ag han +Ġair liner +Ġfl ung +Ġfly ers +G D +Ġsnipp ets +Ġrec ursive +Ġmaster ing +L ex +Ġovert ly +v g +Ġluck ily +Ġenc ro +ĠLanc et +ĠAbyss al +function al +Ġs ow +Ġsqu id +Ġnar ration +Ġn aughty +ĠHon our +ĠSpart ans +Ġsh atter +ĠTac oma +ĠCal ories +ĠR aces +Sub mit +Ġpurpose fully +w av +ĠY ok +F est +ĠG err +Met ro +Ġit iner +f amous +Ġ" { +in line +was her +Iss ue +ĠCL IENT +oz o +Vers ions +7 25 +ĠGl ock +Ġshield ed +ĠPC R +ENC Y +ĠWe ld +ĠSim pl +Ġredirect ed +ĠK ham +Ġ( > +Ġlab ou +Ġdi apers +ss l +Ġcell ar +organ isms +ore sc +ĠBer ks +did n +Sh ipping +C hest +Ġund one +Ġmillion aire +Ġc ords +ĠYoung er +appropri ately +Ġsequ els +u ve +ant icipated +Ġle wd +ĠSh irt +ĠDmit ry +V eter +Ġsl aying +ĠY ar +Ġcompl ication +I owa +ĠEric a +ĠBL M +g irlfriend +b odied +6 26 +19 63 +Ġintermedi ary +Ġcons olation +M ask +ĠSi em +ow an +Beg inning +Ġfix me +Ġculmin ated +Ġcon duc +ĠVolunte er +Ġpos itional +Ġgre ets +ĠDefin itions +Ġthink er +Ġingen uity +Ġfresh men +ĠMom ents +Ġ35 7 +ate urs +ĠFed Ex +s g +69 4 +Ġdwind ling +ĠBO X +sel age +Ġt mp +Ġst en +ĠS ut +Ġneighbourhood s +Ġclass mate +f ledged +Ġleft ists +Ġclim ates +ATH ER +ĠScy the +ul iffe +Ġs ag +Ġho pped +ĠF t +ĠE ck +ĠC K +ĠDo omsday +k ids +Ġgas ped +Ġmon iker +ĠL od +ĠC FL +t ions +r ums +fol ios +Ġm d +Ġunc anny +Ġtrans ports +ĠLab rador +Ġrail ways +Ġappl iance +ĠCTR L +æ Ģ +Pop ulation +ĠConfeder acy +Ġunb earable +Ġdors al +ĠIn form +op ted +ĠK ILL +Mar x +Ġhypoc ritical +q us +ĠN umerous +ĠGeorg ian +ĠAmbro se +ĠL och +Ġgu bernatorial +ĠX eon +ĠSupp orts +ens er +ee ly +ĠAven ger +19 65 +Ar my +Ġju xtap +Ġcho pping +ĠSpl ash +ĠS ustainable +ĠFin ch +Ġ18 61 +ict ive +at meal +ĠG ohan +Ġlights aber +ĠG PA +ug u +ĠRE PL +vari able +Ġher pes +Ġdesert s +ac iously +Ġsitu ational +week ly +ob l +Ġtext ile +ĠCorn wall +Ġcontrace ptives +ĠA ke +] - +ä¹ ĭ +: , +ĠW em +ĠB ihar +Ġ' . +Ġbe re +Ġanal ogue +ĠCook ies +Ġtake off +Whe el +Ġmaj estic +Ġcomm uting +0 23 +ĠCor pse +ass ment +min i +Ġgor illa +ĠAl as +ere e +Ġacquaint ances +ĠAd vantage +Ġspirit ually +Ġey ed +pm wiki +ĠE nder +Ġtrans lucent +Ġnight time +ĠIM AGES +5 45 +ĠK amp +ĠFre ak +Ġ ig +Port land +4 32 +ĠM ata +Ġmar ines +Ġh ors +ater asu +ĠAtt ribution +Ġ-------- - +Ġk ins +ĠBEL OW +++ + +Ġre eling +ol ed +Ġcl utter +ĠRel ative +Ġ4 27 +B US +Ġa vert +ĠChe ong +ĠA ble +ĠPry or +Develop er +Ġen cyclopedia +ĠUSA F +ĠG arry +Sp ain +Bl ocks +Ġexp osition +ĠGamer Gate +W OR +Ġstockp ile +Ġclot hed +ĠT one +ĠR ue +t umblr +Ġtreacher ous +Ġf rying +Ñ Į +ĠS ph +Ġrest raints +Ġemb odies +ĠG es +S afety +Ġnegoti ators +min ing +ĠAppalach ian +L OS +ĠJenn a +Ġpass ers +ç ĭ +sn ap +Ġshort en +creat or +Ġinn umerable +uther land +67 4 +ĠW OM +ĠAs cend +ĠArm ory +ĠTrans action +K ick +Ġsuit case +day Name +Ġwaste ful +mar riage +ĠMcC abe +ite ch +ĠO ss +Cl osure +ĠTreasure r +Ġindec ent +ĠD ull +Ġresid ences +19 59 +ĠS ettlement +Ham ilton +Ġself ies +ĠRank ing +ĠBark ley +ĠB ore +ĠW CS +ĠMar itime +ĠH uh +ĠForest ry +Ġcultiv ating +ĠBall ard +Ġg arrison +ĠSD L +9 30 +Ġnas cent +Ġirresist ible +Ġaw fully +\/ \/ +Ġequ ate +Ġanthrop ology +ĠSylv ia +Ġintest ine +Ġinnoc uous +cess ive +ag ra +ĠMet roid +G rant +8 55 +ģ ĸ +Ġ" _ +ãĥĥ ãĥī +Ġappra isal +ĠFred dy +04 6 +Ġ40 6 +Ġ18 30 +Ġd ocking +St atic +Ġp ont +ĠVolt age +ĠSt ead +ĠMort gage +ĠJon ah +Y L +CLASS IFIED +Ġas bestos +nik ov +Ġcoll agen +ĠOrb ital +P ocket +7 99 +Ġhy brids +inc hes +Ġinv oice +und y +Ġinequ alities +T rend +w ashed +B ALL +Ġluc id +ĠComment ary +Ġw itty +Br andon +Ġbru ising +Ġ6 20 +es cent +box ing +P OL +Ġ3 78 +R ect +Ġlic ences +ĠMcG ee +p ressed +D anny +Ġj ammed +ord inate +Ġle th +Ġdistingu ishes +ĠYam aha +IL S +ĠH ume +ĠC ategories +Rober ts +Ch art +Ġbeet le +ĠGra veyard +Ġ($ ) +o ÄŁ +Ġtw ilight +are lla +á ½ +Ġbooth s +ĠH HS +ĠFeld man +Ġexcav ation +Ġphilosoph ies +at ography +ĠGar age +te chnology +Ġunfor gettable +Ġver ifying +Ġsubord inates +E ls +Ġne b +G aming +EN A +ĠAchieve ment +it ters +ĠG abe +Ġd umps +for cer +Ġpo ignant +ĠM BA +ĠHe idi +ime i +Ġm ages +Ġliber ate +Ġcircum cised +ĠMer maid +ĠMat th +t ogether +ĠW ichita +Ġstore front +ĠAd in +V II +Four th +Ġexplore rs +W ER +Not able +Bro ok +m ens +F aith +-------- - +ĠJ ou +¬ ¼ +Ġpine apple +Ġam alg +el n +ark able +ĠãĤµ ãĥ¼ãĥĨãĤ£ +ĠãĤµãĥ¼ãĥĨãĤ£ ãĥ¯ãĥ³ +Ġov arian +ĠE choes +Ġhairc ut +Ġp av +Ġch illed +anas ia +Ġsty led +Ġd ab +ni per +Ġminister ial +ĠD UP +T an +Ġsul ph +ĠD eter +ĠBo hem +od an +Ġeduc ator +â ĵĺ +sp ir +Ch icken +ĠE leanor +Ġqu i +Ġheav iest +Ġgrasp ed +U RA +Ġcro oked +Jess ica +pro blem +Ġpred etermined +Ġman iac +Ġbreath s +ĠLauder dale +Ġh obbies +y z +Cr ime +Ġcharism a +d L +Ġle aping +Ġk ittens +Ang elo +ĠJ ACK +ĠSu zanne +Ġhal ting +ENT ION +Ġswall owing +ĠEarthqu ake +Ġeight eenth +ĠN IC +ĠIN F +ĠCons cious +Ġparticular s +circ le +7 40 +Ġbene volent +Ġ7 47 +Ġ4 90 +Ġr undown +ĠVal erie +ĠB UR +Ġcivil isation +ĠS chn +W B +ot ide +intern ational +Ġj ohn +Ġ19 02 +Ġpe anuts +Ġflav ored +k us +Ġro ared +Ġcut off +é £ +Ġorn ament +Ġarchitect ures +Ġ3 69 +ol or +ĠWild e +ĠC RC +ĠAdjust ed +Ġprov oking +land ish +Ġrational ity +Ġjust ifies +Ġdisp el +Ġa meric +ĠPol es +Ø © +Ġen vis +ĠD oodle +ä½ ¿ +igs aw +auld ron +Techn ical +T een +up hem +ĠX iang +Ġdetract ors +ĠZ i +ĠJournal ists +Ġconduc ive +ĠVolunte ers +Ġs d +Know ing +Ġtrans missions +ĠPL AN +ĠL IB +Ġall uded +Ġob e +Ġd ope +ĠGold stein +Ġwavelength s +ĠDest ination +nd a +ug i +Ġattent ive +ĠLe an +ral tar +Ġman g +mb uds +ak ings +b ender +Ġacc ol +Ġcraw led +N OW +Min nesota +Ġflour ished +ĠZ up +ĠSuper visor +ĠOliv ier +Ex cellent +Ġwid en +D one +Ġw ig +Ġmiscon ceptions +Cor p +W an +Ġvener able +ĠNot ably +ĠKling on +an imate +Bo ost +ĠS AY +miss ing +ibli ography +mel on +Ġpay day +Ø ³ +bo le +Ġve iled +ĠAl phabet +It alian +Ġever lasting +ĠR IS +ĠC ree +rom pt +Ġh ating +Ġgrin ning +Ġge ographically +OS H +Ġwe eping +ĠÂłĠÂłĠÂłĠÂł ĠÂłĠÂłĠÂłĠÂł +Ġimpe cc +Let ter +Ġblo ated +PL A +ĠFe in +Ġper sever +Th under +Ġa ur +ĠR L +Ġpit falls +âĸ º +Ġpredomin ant +Ġ5 25 +7 18 +AP E +7 14 +Ġfarm land +ĠQ iao +Ġv iolet +ĠBah amas +Ġinflic ting +ĠE fficiency +Ġhome brew +Ġundert ook +Ġcur ly +ĠHard ing +man ia +59 6 +Ġtem pered +Ġhar rowing +ĠP ledge +ĠFranken stein +è ª +M otion +Ġpredict ably +ĠExpl osion +oc using +er d +col o +FF ER +Ġback field +ĠV IDE +ue bl +N arr +ĠArg ument +Ġgen omic +Ġbout ique +Ġbatt ed +ĠB inary +Ġg amb +ĠRh ythm +67 3 +Ġa float +ĠOlymp ia +Y ING +Ġend if +is in +Ġwin ters +Ġsc attering +I v +D istance +Ġtr u +ĠCom fort +Ġne xus +Ġair flow +ĠByz antine +p ayers +con i +ĠB etsy +D eal +ĠN ug +ĠContin ent +red ibly +Ġoptim izing +al beit +Ġec static +ĠPro to +ç · +iv ot +âĸ Ħ +em p +rou nder +Ġcl out +ĠI ST +66 3 +ĠDoll ars +ĠD AC +Ġsubsc ribed +Ġrehears al +Ġam ps +ĠSh ang +es m +Ġspr inkle +Ġassail ant +ĠO o +ĠCoin base +T act +Ġret ina +Ġn uns +R ON +att o +Ġj ug +ĠSV G +Ġb ikini +ĠFI LE +ĠFound ers +ep ort +ĠK P +Ġrest ores +ĠTh ick +Ġash ore +Ġappro vals +R ender +M AG +G raham +ĠCort ana +ãĥ³ ãĤ¸ +ss h +or ians +ars ity +ĠInsp ired +u pper +Ġsign alling +Ġreb uke +Ġfl ares +Ġdownt ime +Stud ies +Ġstagn ation +ĠSequ ence +Ġgr unt +Ġass ures +ĠPL A +59 2 +Ġintra ven +d epend +Sus an +ĠManz iel +Man ia +Cont ract +Ġsl ams +Ġcult ured +Ġcred itor +L IST +ĠH UM +ĠChatt anooga +serv ed +Ġclo aked +ĠF TP +p owder +ĠSt ella +uct ive +Ġcheap ly +ĠMU CH +ĠGalile o +Ġsu ites +spe ech +Ġdeliber ations +ĠCh ips +« ĺ +Bal ance +ĠWyn ne +ĠAk ron +Ass et +Ġhon oured +Ġed ged +Like wise +anim ous +ĠW age +ĠEz ek +ad vertisement +ĠRT X +ĠM AD +Ġmigr ating +ĠS QU +Ġ4 75 +Ed ited +Ġshorth and +ĠBas ics +Ġcro tch +ĠEV EN +Ġv m +effic iency +Ġcal ves +ĠF rie +ĠBrill iant +Ġstri kers +Ġrepent ance +Ġarter ies +r l +B ed +h ap +Ġcrypt ography +ĠSab res +Ġ4 14 +vi ks +ih ara +aps es +T alking +Ġintertw ined +Ġdoc ks +Ġalle le +ĠArt ifact +ĠH IM +t orn +ç ķ +Ġop acity +ĠE ly +os uke +Ġn ipple +Ġhand written +ĠV K +ĠChamber lain +ĠLa os +ig raph +g row +Ġtr illions +Ġdescend ant +ĠSail or +as uring +Ġce ilings +ĠWare house +f lying +ĠGl ow +Ġn ont +Ġmiscar riage +Ġrig s +Ġmin istries +Ġelabor ated +Ġdel usional +ĠHum ane +Ġ3 79 +n ets +Ġblack out +add ers +Ġn p +ĠT ire +ro sc +Ġsub div +Ġlink age +Ġchron ological +ĠHER O +Ġres ettlement +ĠVin yl +Ġpast oral +ĠMob il +ĠBar bar +Co oldown +ĠF ritz +c riminal +re pe +Ġbell ig +ĠBre ed +Ġ4 18 +Ġsem blance +ij k +Ġcur tail +Ġclin ch +cont ained +ĠProm pt +ast on +Ġw i +Ġpursu its +5 15 +ĠGl oss +Ġfl ips +Ġcoup ons +Ġcl oning +ĠLike ly +Rem oved +ĠQu artz +r ices +ĠSpe ars +Ġp ious +Ġdep reciation +ĠD are +oun ces +am az +O nt +Ġp innacle +d ocker +0 26 +ĠW yr +ĠPro per +Ë Ī +n il +By tes +Ġseek er +t rial +Ġunf olds +ĠMar se +Ġextravag ant +ĠSurviv ors +RED ACTED +ĠSpeed way +ĠCra igslist +sub mit +ĠGener ations +Ġup holding +Ġblood stream +ĠMiss ions +ĠL awn +Ġlim bo +ene i +H uh +ĠWild cats +pre p +ĠMark us +ĠFor bidden +rit ic +IN O +Ġexhib iting +requ ent +ch uk +Ġhabit ual +ĠComp atibility +Dr ag +RIP T +uj ah +GR OUND +Ġdelinqu ent +Ġburn er +Ġcontempor aries +Ġgimm ick +load s +Ġno zzle +p odcast +ĠW ak +ĠStat en +ĠK uh +ãģ ĵ +inter rupted +Ġinv incible +ĠBurn ett +cig arette +ĠPeb ble +ĠTem porary +ĠMar ino +58 2 +Ġwast eland +ident ly +T x +Ġr ite +ĠPan asonic +ĠM iddles +ĠHort on +ae us +Ġc uring +Ġm ats +Ġadj ourn +Ġfears ome +pe z +bo ats +Ġpro pell +Ġconflic ted +ĠAng er +Ġinsurg ent +K arl +Ġco ales +Ġsouth western +Ġdis su +ĠO vert +******** **** +Ġbox ed +ĠBr une +aa a +Ġgard ening +ĠEng el +tr acks +Ġpur ified +Ġplace holder +ĠL ikes +Ġd an +G ab +Ġe ct +ĠF aw +ĠEl iot +Ġ' , +otrop ic +ĠRu in +hed on +Ġca ul +Ġa ft +ĠCad illac +gh a +ass ian +ud eb +ĠT ick +Ġadjust s +AR GET +5 37 +isc he +ant y +ĠFried rich +ĠBl izz +ĠA OL +Camp aign +Ġmamm al +ĠVe il +ĠK ev +ĠMaur it +ĠDam ien +N ation +E astern +Ġ{ : +Ġ= ================================ +Ġstereotyp ical +Ġatt ic +ĠCy borg +requ ire +Ġaward ing +ĠPap ua +bt n +b ent +B oo +Ġ( = +ĠX ander +ĠSomers et +Ġcatch y +Ġcert ify +STR UCT +Ġit al +Ġt ides +ĠBr ands +G ray +comp etitive +Ġcur ator +ĠD G +omin ium +ĠGM Os +ci ating +ĠCarm en +ow ard +Balt imore +Ġr gb +C u +Ġwip es +spe ll +IT NESS +Ġsummar izes +ĠRe vis +Ġwhistlebl owers +ĠBre ach +Ġcro chet +k os +ews ki +Ġrep et +Ġcrim son +ĠKar achi +read able +dim ension +ĠI gor +ild ed +ĠZ ed +ĠKe ane +ĠCos metic +DE P +Ġretreat ing +ĠU A +ens ical +Ġd usk +ĠDick ens +Ġaren as +ĠPass age +level s +Ġcur v +P ope +Ġch ores +ĠEl ise +ĠComp ass +b ub +Ġmamm alian +ĠSans krit +ĠAN C +ĠCr ack +Q ual +L aun +amp unk +Ġlearn ers +Ġglam orous +Ġfur the +erm ott +c and +Gener ic +Ġnarr ated +Ġdisorder ly +ĠTrans actions +ĠDet ention +ĠR oku +Ä į +Ġunder statement +ĠS aur +ĠRodrig o +ĠAS AP +S in +Ġre joice +Method s +Ġelectro de +Ġworsh ipped +Ġid i +ĠPhys icians +Ġpop up +Ġde ft +ĠRem oval +ĠBu enos +ver bs +Ġfun k +ush a +rict ion +ore a +ĠBang alore +ĠKen obi +zz i +Ġnorm ative +Ġgobl ins +Ġcaf es +ĠUN CLASSIFIED +ĠF ired +S IGN +Ġs clerosis +ĠV oter +ĠSon ny +ĠExt end +ĠEV s +Ar senal +Ġp si +Ġwid est +ĠT us +Ġlo oms +Ġjust ifying +ĠGr anger +è ¯ +Ref er +58 3 +Ġflour ishing +ab re +Ġr ave +ĠCont ra +Ġ18 98 +Add s +Ġf ul +ĠCo oke +some one += # +67 1 +Ġy ak +Ġar te +ĠMis cellaneous +ĠDet ection +ĠCl ancy +â ģ +ass ies +Ġval iant +ĠFemin ist +cor ruption +V el +P ear +Ġsucc inct +Ġquick est +k w +Ġsp itting +ĠL ibraries +åħ ī +ant z +D ad +ĠSpec ifications +rup ulous +and r +RES ULTS +Ġsnow ball +Ġpred is +ĠB axter +ĠNurs ing +ĠCh aff +s we +Ġout age +Ġnest ing +Ġnotor iety +tr igger +on ite +j on +Ġf ou +ook ed +ĠCelebr ity +re ality +Ġfat ig +Ġhug ging +Ġbother s +ĠPan zer +ĠCh andra +fig ured +Ġvol ts +ĠCloud s +Ġfee ble +ĠCur ve +ĠAs us +78 6 +abs or +ĠV ICE +ĠH ess +Ġmanufact ures +Ġgri zz +ĠPower ful +ac id +Ġsub sections +ĠKrug man +ĠAl ps +is u +Ġsequ est +ĠUlt ron +ĠT inker +ĠGo ose +Ġmism atch +Att orney +Ġmorph ology +ĠSix ers +ut tered +ĠE LECT +gr an +Rus sell +ĠG SL +Ġfort night +Ġ. ) +Ġapost le +pr one +el ist +Unt itled +ĠIm plementation +ist ors +Ġtank er +Ġpl ush +Ġattend ants +ĠT ik +ĠGreen wich +ĠY on +ĠSP L +cell s +unt led +S olution +ĠQu é +Ġvac ated +Ġupt ick +ĠMer idian +æ ĥ +ĠDr ill +9 25 +58 4 +Ġrenov ated +ĠKub rick +zy k +Ġl ousy +pp el +ohyd rate +ĠI zzy +lesi astical +CC C +ĠAj ax +Ġad apters +ĠPetra eus +Ġaffirm ation +ĠST OR +le ms +ad oes +ĠConstantin ople +Ġp onies +Ġl ighthouse +Ġadherent s +ĠBre es +omorph ic +Fight ing +Ġpl aster +ĠP VC +ĠOb st +Ġdear ly +ĠTo oth +icks on +Ġsh aming +P lex +A gg +ĠâĢ¦ " +Ġsub reddits +Ġpige on +ĠResident ial +ĠPass ing +Ġl um +ĠP ension +Ġpessim istic +Ġ4 32 +z inski +c ade +0 75 +Ġapolog ised +iy ah +Put ting +Ġgloom y +ĠLy me +=-=-=-=- =-=-=-=- +ĠT ome +ĠPsych iatric +ĠH IT +c ms +ap olog +Ġbreak er +Ġdeep en +Ġtheor ist +ĠHigh lands +Ġb aker +Ġst aples +Ġinterf ered +ĠAb ortion +jo ined +ch u +Ġform ulate +Ġvacc inations +Ġban ter +phe us +Ġoutfield er +ĠM eter +Ġ# #### +Ġ18 95 +Ġnarrow ing +ĠST ORY +f p +ĠC ST +ign ore +Ġproclaim ing +ĠR U +ĠB ALL +yn a +65 3 +Ġpos it +P RE +59 4 +ĠRegist rar +ĠPil grim +ic io +Ġpre tt +Ġlif eless +Ġ__ _ +Ne igh +ĠCh urches +orn o +Ġor cs +Ġkind red +ĠAud it +Ġmillenn ial +ĠPers ia +g ravity +ĠDis ability +ĠD ARK +W s +od on +Ġgrand daughter +ĠBro oke +ĠA DA +ER A +Ġpick ups +ĠWil kinson +ĠSh ards +ĠN K +Ġexp el +ĠKis lyak +Ġj argon +Ġpolar ized +ian e +Pub lisher +Ġreb utt +Ġapprehens ion +ĠK essler +Ġpr ism +F UL +19 64 +ĠL oll +ä ¿ +le thal +Å Ł +Ġg hetto +Ġb oulder +ĠSlow ly +ĠOsc ars +ĠInst ruction +ĠUl tr +ĠM oe +N ich +ĠP ATH +( * +ĠRE LEASE +un ing +rou se +en eg +Ġre imb +ĠDet ected +Do S +Ġster ling +Ġaggreg ation +ĠLone ly +ĠAtt end +hig her +Ġairst rike +ks on +SE LECT +Ġdef lation +ĠHer rera +C ole +rit ch +Ġadvis able +F ax +Ġwork around +Ġp id +mort em +ers en +Ġtyp o +Ġal um +78 2 +ĠJam al +script s +Ġcapt ives +ĠPres ence +ĠLie berman +angel o +Ġalcohol ism +ass i +Ġrec ite +Ġgap ing +Ġbask ets +ĠG ou +Brow ser +ne au +Ġcorrect ive +und a +sc oring +ĠX D +Ġfil ament +Ġdeep ening +ĠStain less +Int eger +Ġbu ggy +Ġten ancy +ĠMub arak +Ġt uple +ĠD roid +ĠS itting +Ġforfe it +ĠRasm ussen +ixt ies +es i +ĠKim mel +Ġmetic ulously +Ġap opt +ĠS eller +08 8 +ec ake +hem atically +T N +Ġmind less +Ġdig s +ĠAcc ord +ons ense +em ing +br ace +Ġe Book +ĠDist ribut +ĠInvest ments +w t +] ), +beh avior +56 3 +Ġbl inding +ĠPro testers +top ia +Ġreb orn +ĠKel vin +ĠDo ver +ĠD airy +ĠOut s +Ġ[ / +Ï Ģ +b p +ĠVan ity +ĠRec ap +ĠHOU SE +ĠF ACE +Ġ4 22 +69 2 +ĠAnt ioch +cook ed +Ġcoll ide +Ġa pr +Ġsle eper +ĠJar vis +Ġalternative ly +ĠLe aves +ĠM aw +Ġantiqu ity +ĠAdin ida +Ġab user +Poké mon +Ġass orted +ĠRev ision +ĠP iano +ĠG ideon +O cean +Ġsal on +Ġbust ling +ogn itive +ĠRah man +Ġwa iter +Ġpres ets +ĠO sh +ĠG HC +oper ator +Ġrept iles +Ġ4 13 +ĠG arr +ĠCh ak +Ġhas hes +Ġfail ings +Ġfolk lore +Ġab l +ĠC ena +ĠMac Arthur +ĠCOUR T +Ġperipher y +app ers +Ġreck oned +ĠInf lu +ĠC ET +Ġ3 72 +ĠDefin itive +ass ault +4 21 +Ġreservoir s +Ġd ives +ĠCo il +DA Q +Ġvivid ly +ĠR J +ĠBel lev +Ġec lectic +ĠShow down +ĠK M +ip ed +reet ings +ĠAs uka +L iberal +ĠÏ Ħ +Ġbystand ers +ĠGood win +uk ong +S it +ĠT rem +Ġcrim inally +ĠCirc us +ch rome +88 7 +Ġnan op +ĠOb i +ĠL OW +o gh +ĠAuth ors +ob yl +Ur ban +Ġt i +ĠWe ir +t rap +ag y +Ġparent heses +Ġout numbered +Ġcounter productive +ĠTob ias +ub is +P arser +ST AR +Ġsyn aptic +ĠG ears +Ġh iber +Ġdebunk ed +Ġex alted +aw atts +H OU +Ch urch +ĠPix ie +ĠU ri +ĠForm ation +ĠPred iction +C EO +Ġthro tt +ĠBrit ann +ĠMad agascar +ë ĭ +Ġbill boards +ĠRPG s +ĠBe es +complete ly +F IL +Ġdoes nt +ĠGreen berg +re ys +Ġsl ing +Ġempt ied +ĠPix ar +ĠDh arma +l uck +ingu ished +Ġend ot +Ġbab ys +05 9 +che st +r ats +Ġr idden +Ġbeet les +Ġillum inating +Ġfict itious +ĠProv incial +Ġ7 68 +Ġshe pherd +ĠR ender +Ġ18 96 +C rew +Ġmold ed +ĠXia omi +ĠSp iral +Ġdel im +Ġorgan ising +Ġho ops +ĠBe i +z hen +Ġfuck in +Ġdec ad +Ġun biased +am my +sw ing +Ġsmugg led +Ġk ios +ĠP ERSON +ĠInquis itor +Ġsnow y +Ġscrap ing +ĠBurg ess +P tr +ag ame +R W +Ġdro id +ĠL ys +ĠCass andra +Jac ob +Ġ35 4 +Ġpast ure +Ġfr anc +ĠScot ch +ĠEnd s +ĠI GF +def inition +Ġhyster ical +ĠBrown e +77 1 +Ġmobil ization +æ ķ +iqu eness +Th or +Ġspear headed +Ġembro iled +Ġconject ure +jud icial +Ch oice +Ġpaper back +P ir +Ġrec overs +ĠSur ge +ĠSh ogun +ĠPed iatrics +ãģ ł +Ġsweep s +ĠLabor atories +ĠP acks +al us +add in +Ġhead lights +g ra +Ev idence +COL OR +Ad min +Ĭ ± +Ġconco ct +s ufficient +Ġun marked +Ġrich ness +Ġdiss ertation +Ġseason ing +Ġg ib +ĠM ages +un ctions +ĠN id +che at +ĠTM Z +c itizens +ĠCatholic ism +n b +Ġdisemb ark +ĠPROG RAM +a ques +Ty ler +Or g +ĠSl ay +ĠN ero +ĠTown send +IN TON +te le +Ġmes mer +9 01 +Ġfire ball +ev idence +aff iliated +ĠFrench man +ĠAugust a +0 21 +Ġs led +Ġre used +ĠImmun ity +Ġwrest le +assemb led +Mar ia +Ġgun shots +ĠBarb ie +Ġcannabin oids +ĠTo ast +ĠK inder +IR D +Ġre juven +Ġg ore +Ġrupt ure +Ġbre aching +ĠCart oon +Ġ4 55 +ĠPale o +6 14 +Ġspe ars +ĠAm es +ab us +Mad ison +GR OUP +Ġab orted +y ah +Ġfel on +Ġcaus ation +Ġprep aid +Ġp itted +op lan +ĠShel ley +ĠRus so +ĠP agan +Ġwill fully +ĠCan aver +und rum +ĠSal ary +ĠAr paio +read er +ĠR ational +ĠOver se +ĠCa uses +Ġ* . +Ġw ob +Ke ith +ĠCons ent +man ac +77 3 +6 23 +Ġfate ful +et imes +Ġspir ited +ĠD ys +Ġhe gemony +Ġboy cot +ĠEn rique +em outh +Ġtim elines +ĠSah ara +ĠRel ax +ĠQuin cy +ĠLess ons +ĠE QU +SE A +N K +ĠCost co +Incre ase +Ġmotiv ating +ĠCh ong +am aru +ĠDiv ide +Ġped igree +ĠTasman ia +ĠPrel ude +L as +9 40 +57 4 +Ġch au +ĠSp iegel +un ic +-- > +ĠPhil ips +ĠKaf ka +Ġuphe aval +Ġsent imental +Ġsa x +ĠAk ira +ser ial +Mat rix +Ġelect ing +Ġcomment er +ĠNeb ula +ple ts +ĠNad u +ĠAd ren +Ġen shr +ĠR AND +fin ancial +ĠCly de +uther ford +Ġsign age +Ġde line +Ġphosph ate +rovers ial +f ascist +ĠV all +ĠBeth lehem +Ġfor s +Ġeng lish +S olid +N ature +Ġv a +ĠGu ests +Ġtant al +Ġauto immune +;;;;;;;; ;;;; +ĠTot ally +ĠO v +Ġdef ences +ĠCoc onut +Ġtranqu il +Ġpl oy +Ġflav ours +ĠFl ask +ãĤ¨ ãĥ« +ĠWest on +ĠVol vo +8 70 +Ġmicro phones +ver bal +R PG +Ġi ii +; } +0 28 +Ġhead lined +Ġprim ed +Ġho ard +ĠSh ad +ĠEN TER +Ġtri angular +Ġcap it +l ik +ĠAn cients +Ġl ash +Ġconv ol +Ġcolon el +en emy +G ra +Ġpub s +ut ters +Ġassign s +ĠPen et +ĠMon strous +ĠBow en +il ver +H aunted +ĠD ing +start ed +pl in +Ġcontamin ants +ĠDO E +ff en +ĠTechn ician +R y +Ġrob bers +Ġhot line +ĠGuard iola +ĠKau fman +row er +ĠDres den +ĠAl pine +E lf +Ġf mt +ĠS ard +urs es +g pu +Un ix +Ġunequiv ocally +ĠCitizens hip +qu ad +m ire +ĠS weeney +B attery +6 15 +Ġpanc akes +Ġo ats +M aps +ĠCont rast +mbuds man +ĠE PS +Ġsub committee +Ġsour cing +Ġs izing +ĠBuff er +ĠMand atory +Ġmoder ates +ĠPattern s +ĠCh ocobo +ĠZ an +ĠSTAT ES +ĠJud ging +ĠIn her +* : +Ġb il +ĠY en +Ġexh ilar +oll ower +z ers +Ġsn ug +max imum +Ġdesp icable +ĠP ACK +ĠAn nex +Ġsarcast ic +Ġlate x +Ġt amp +ĠS ao +b ah +ĠRe verend +ĠChin atown +ĠA UT +d ocumented +ĠGA BA +ĠCan aan +ĠÙ ħ +Ġgovern s +pre v +E sc +ĠEst imates +OS P +Ġendeav our +ĠCl osing +omet ime +every one +Ġwor sen +Ġsc anners +Ġdev iations +ĠRobot ics +ĠCom pton +Ġsorce rer +Ġend ogenous +Ġem ulation +ĠPier cing +ĠA ph +ĠS ocket +Ġb ould +ĠO U +ĠBorder lands +Ġ18 63 +G ordon +ĠW TO +Ġrestrict s +Ġmosa ic +Ġmel odies +ç Ħ +T ar +Ġdis son +ĠProv ides +Ġ ...... +b ek +F IX +Ġbro om +ans hip +Do ctors +Ġner ds +ĠReg ions +na issance +Ġmet e +Ġcre pt +pl ings +Ġgirlfriend s +kn it +ig ent +ow e +Ġus hered +ĠB az +M obil +4 34 +ĠPres ents +orig in +Ġins omnia +ĠA ux +4 39 +ĠCh ili +irs ch +G AME +Ġgest ation +alg ia +rom ising +$ , +c row +ĠIn spection +at omic +Rel ations +J OHN +rom an +ĠClock work +ĠBak r +m one +M ET +Ġthirst y +Ġb c +Ġfacult ies +R um +Ġnu ance +ĠD arius +ple ting +fter s +etch up +Reg istration +ĠK E +R ah +Ġpref erential +ĠL ash +ĠH H +Val id +ĠN AV +Ġstar ve +ĠG ong +z ynski +ĠAct ress +Ġw ik +Ġun accompanied +lv l +Br ide +AD S +ĠCommand o +ĠVaugh n +Wal let +Ġho pping +ĠV ie +Ġcave ats +Ġal as +if led +ab use +66 1 +Ġib n +Ġg ul +Ġrob bing +t il +IL A +Ġmit igating +Ġapt ly +Ġty rant +Ġmid day +ĠGil more +ĠDe cker +Ġ§ § +part ial +Ex actly +Ġphen otype +Ġ[+ ] +ĠP lex +ĠI ps +vers ions +Ġe book +Ġch ic +g ross +":" "},{" +ĠSur prisingly +M organ +Ġresid ues +ĠConf ederation +in feld +Ġl yr +mod erate +Ġperpend icular +V K +Ġsynchron ized +Ġrefres hed +Ġad ore +ĠTor ment +ol ina +Ġ26 00 +Item Tracker +Ġp ies +ĠF AT +ĠR HP +0 48 +ĠRES P +ĠB J +all ows +P and +Ġunw elcome +ĠV oc +ĠBast ard +ĠO W +ĠL AR +ĠHeal er +Environment al +ĠKen yan +ĠTr ance +ĠP ats +Ġali ases +ĠGar field +Ġcampaign er +Ġadvance ments +ĠOkin awa +ĠC oh +ows ky +Ġstar ved +Ġsize able +Ġ: -) +Ġm RNA +Ġsusp ensions +ist ar +Scot land +Pr in +-------------------------------- ---------------- +Ġ50 2 +Ġteasp oons +Ġ10 50 +Ġcoerc ive +ĠMason ic +edd ed +ĠPass enger +Ġl att +Ġbr aces +ĠSt eal +ĠNY T +ĠK ats +ĠCel est +ae z +T u +ĠCoul ter +ðŁ ĺ +Fl ickr +ĠWil mington +ith s +++ ; +Ġv ending +Ġneg ro +ĠPh i +ĠYellow stone +Call back +Ġsh ampoo +ĠSh ades +w at +Ġsuper human +Ġridic uled +Ġhol iest +om bo +Ġintern s +Ġh one +ĠPar agu +UR I +Ġd angling +ãĤ » +so v +ict ional +av ailability +Ġrev ocation +Ġd ow +in ic +ĠTHE IR +Ġis o +Ġout ings +ĠLeth al +Ġ) )) +Ġinacc ur +Ġout landish +Ġan us +let ico +id on +l ol +Ġun regulated +Ġsuccumb ed +Ġc uff +ĠWast eland +let al +Ġsub str +Ġcoff ers +Ġautom akers +ov i +ĠX ue +ĠDayton a +Ġjar ring +Ġf umes +Ġdisband ed +z ik +itt on +Ġstriking ly +Ġsp ores +Ad apter +.) : +ĠLynd on +ival ry +Ġor ally +Ġtumult uous +Ġdisple asure +Ġcon es +or rect +Ġappe ase +Ġder by +ĠTrip oli +ĠAl ess +Ġp oked +ĠGu ilty +v P +En ough +Ġorig inals +6 99 +Ġrabb i +Ġproverb ial +Ġpostp one +el ope +ĠMist y +Ġstaff ed +ĠUn employment +redit ary +Ġdilig ent +re comm +me asures +as in +8 25 +Ġpond s +Ġmm ol +ĠS AR +ĠC ARE +Ġ3 71 +Ġclen ched +ĠCors air +Ġcaric ature +z n +att ach +ĠSch ro +spe ak +p ainted +ĠS uc +ĠE NT +Ġcell ul +ĠP aid +di agn +WH ERE +Ġtext ed +B arn +Ġret racted +ĠRe ferred +S av +Ġup keep +Ġwork places +ĠTok ens +Ġampl ify +cl inical +Ġmult ic +mber g +Ġconvol uted +Reg ion +5 65 +ĠTop ic +Ġsn ail +Ġsal ine +Ġins urrection +ĠPet r +f orts +B AT +ĠNav ajo +Ġrud imentary +ĠLak sh +OND ON +Me asure +Ġtransform er +ĠGodd ard +Ġcoinc ides +ir in +R ex +ĠB ok +qu it +Ġshotgun s +Ġprolet arian +Ġsc orp +ĠAd a +5 14 +Ġsl ander +record ed +Ġemb ell +ris ome +Ġapolog izing +ĠMul cair +ĠGib raltar +Cl a +Ġall ot +ĠAtt ention +Ġ4 33 +le ave +Ġwh ine +ĠIss a +ĠFa ust +ĠBar ron +hen y +Ġvictim ized +J ews +Ġnurt uring +ett el +W inged +ĠSub tle +Ġflavor ful +ĠRep s +eng ed +call back +Ġdirection al +Ġcl asp +ĠDirect ions +plan et +icult ure +Hel per +ic ion +ac ia +Ġç ¥ŀ +Ġsur ges +Ġcan oe +ĠPrem iership +be en +Ġdef ied +ĠTro oper +Ġtrip od +Ġgas p +ĠE uph +ĠAd s +vern ight +high ly +R ole +Ġent angled +ĠZe it +6 18 +ĠRust y +Ġhaven s +ĠVaugh an +HA EL +ĠSER VICE +/ , +Ġstr icken +Ġdel usions +Ġb is +ĠH af +Ġgrat ification +Ġent icing +UN CH +Ad ams +ĠOL ED +ĠBeet le +Ġ18 99 +ĠSO FTWARE +ateg or +V L +ĠTot em +ĠG ators +AT URES +Ġimped ance +Reg istered +ĠC ary +ĠAer ial +on ne +en ium +Ġd red +ĠBe g +Ġconcurrent ly +Ġsuper power +ĠX an +j ew +imes ter +ĠDick inson +âĶ ģ +F la +Ġp ree +ĠRoll ins +© ¶æ +Ġden omination +ĠL ana +5 16 +Ġinc iting +sc ribed +j uries +ĠWond ers +app roximately +Ġsusp ending +Ġmountain ous +ĠL augh +oid al +N s +Det ect +) = +ĠL uthor +ĠSchwarz enegger +ĠMull er +ĠDev i +ec ycle +J ar +6 13 +ĠL ongh +B ah +ĠSP ORTS +n w +Ġref inement +Ġwater ways +Ġd iner +Bl ade +68 3 +F ac +Ġinitial s +Ġro g +Ġparan ormal +B UT +Ġ[ ( +ĠSw anson +ĠM esh +âĸ ¬ +Impro ve +ĠRad iation +ĠEst her +ĠE sk +ĠA ly +ik y +Ġir rad +ĠBuck ingham +Ġref ill +Ġ. _ +Re pe +CON CLUS +Ġdifferent iated +Ġchi rop +ĠAt kins +Pat tern +Ġexc ise +Ġcab al +N SA +ĠST A +ĠS IL +ĠPar aly +Ġr ye +ĠHow ell +ĠCount down +ness es +alys ed +Ġres ize +ãĤ ½ +Ġbudget ary +ĠStr as +w ang +Ġap iece +Ġprecinct s +Ġpe ach +Ġsky line +Ġ35 3 +pop ular +App earances +ĠMechan ics +ĠDev Online +S ullivan +Z en +Ġp u +op olis +5 44 +Ġde form +Ġcounter act +ĠL ange +Ġ4 17 +Con sole +77 4 +Ġnodd ing +Ġpopul ism +Ġhe p +Ġcoun selling +compl iance +U FF +Ġunden iably +Ġrail ing +ĠHor owitz +ĠSim one +ĠBung ie +Ġa k +ĠTal ks +x ff +fl ake +Cr ash +Ġsweat y +Ġban quet +ĠOFF IC +Ġinvent ive +Ġastron omer +ĠStam ford +ĠSc are +ĠGRE EN +olic ited +Ġr usher +Ġcent rist +ight ing +Ġsub class +Ġdis av +Ġdef und +ĠN anto +oci ate +m ast +Ġpac if +Ġm end +e ers +imm igration +ESS ION +Ġnumber ing +Ġlaugh able +ĠEnd ed +v iation +em ark +P itt +Ġmetic ulous +ĠL F +Ġcongrat ulated +ĠBir ch +Ġsway ed +Ġsemif inals +Ġhum ankind +m atter +ĠEqu ip +opa usal +S aid +ĠLay out +Ġvo icing +Ġth ug +Ġporn ographic +I PS +Ġmo aning +Ġgriev ance +Ġconf essions +esc al +TEXT URE +Aut hent +os aurus +P urchase +Ġreleg ation +al ter +ĠÂł Âł +Ġr iddled +Ġo gre +ĠLow ell +Occ up +E at +ĠHy der +ĠAdvis er +Com merce +H unt +ĠOr th +ĠComp etitive +ĠCL A +CD C +Ġsal ads +F le +Ġindustrial ized +` , +ĠO WN +Ġbec k +ĠPart icularly +oub t +Ġm M +ĠHuss ain +ĠChen nai +Ġ9 20 +Ġappoint ing +ĠCull en +,,,, ,,,, +Ġp ores +ver ified +Ġbi ochemical +em ate +Ġcoward ly +ĠHels inki +ĠEthiop ian +S OURCE +ER C +est ro +Ġbi otech +ĠS our +Ġbrew er +Bloom berg +Ġintens ify +Gl ass +an co +ĠF DR +gre SQL +ĠF ires +©¶æ ¥µ +ec o +100 1 +ĠHom eless +Ġinstant aneous +ĠH aste +ig el +D iamond +Ġp aving +Ġland fill +Ġd ads +h oun +: ] +Ġinc endiary +ĠLiving ston +ĠHil bert +ĠChe cks +st yles +in ators +ĠCl ive +ph rine +Ġchimpan zees +Ġp all +ĠJ M +ĠAad haar +ð Ŀ +Ġachie vable +dis abled +P ET +OOOO OOOO +M ot +Ġint angible +Ġbal let +ĠWe bs +ĠEst imated +Effect s +Ġb ailed +Josh ua +Ġturb ulence +Ġoccup ant +ĠDay light +Ġ36 1 +me et +Ġstat ically +Ġon look +Ġk i +il legal +Ġvel vet +Ġdehyd ration +Ġacqu ies +ĠRe z +ak ura +ĠU pton +at ro +Ġincomp rehensible +Ġback door +ĠRh ino +7 27 +Ġmath s +) + +Ġhe resy +Ġd f +ĠRoc he +ĠL ydia +Ġpanc reat +re ply +arre ll +Ġsolicit ation +Ġcirc adian +BI P +Ġfor ay +Ġcrypt ic +iz u +ime o +ĠTom ato +ĠH oms +ex amination +Ġqu arry +ĠVal iant +ĠJer icho +ĠIN CLUD +Ġ18 40 +5 19 +Ġres ists +Ġsnap shots +ĠSp ur +ĠAnt iqu +Log in +Ġbest selling +Ġant ic +ĠS utherland +ãĤ¢ ãĥ« +Ġ~ / +ĠP arm +è ĥ +P ages +int ensity +Ġimm obil +Ġ18 65 +zz o +Ġn ifty +Ġf entanyl +ĠPres ervation +op hen +Ġd arts +ĠD inosaur +po inters +ĠR ite +s uggest +aware ness +ĠSher idan +Ġst ances +Ġsor cery +Ġper jury +ĠNik ola +ie ver +Ġf iance +ĠJordan ian +ĠBall oon +Ġn ab +Ġk b +Ġhuman ities +ĠTan aka +hill ary +Ġconsult ancy +ĠZ ub +Ġrem ission +Ġconf id +CH Q +ĠF ug +Ġimpro vis +Y ep +/ _ +Ġunwilling ness +Ġport folios +05 5 +ĠInstruct or +aim an +Ġclaim ants +M bps +ĠBy e +re ceived +T weet +Ġind emn +ri z +am ara +N at +Ġeval uates +ĠL ur +ep ad +FO X +ĠTh ro +Ġrust y +Ġbed rock +ĠOp rah +J B +Ġmanip ulative +Ġwill ful +Ġrel apse +Ġext ant +The me +S ensor +ĠSt ability +go vern +Ġpo ppy +Ġkn ack +Ġins ulated +ĠT ile +ĠExt rem +Ġunt old +Ġconver ge +Ġref uel +ig roup +Ġdistort ions +Ġrav aged +Ġmechan ically +ĠRe illy +ĠN ose +ĠIncarn ation +ĠBeck y +abb ling +Ġt aco +Ġr ake +Ġmelanch oly +Ġillust rious +ĠDart mouth +Gu ide +ĠR azer +ĠBen z +Ult imate +ĠSur prise +Ġpage ant +off er +Who ever +Ġw iser +Ġchem ist +ĠHE LL +ĠBul k +Ġpl utonium +ĠCO VER +Ö ¼ +f ailed +Ġtire lessly +Ġinf ertility +ĠTr ident +ĠShow time +ĠC iv +V ice +requ ires +itt ance +Ġun controlled +interest ing +56 1 +Ġinnov ate +ateg ic +L ie +ĠS elling +U l +Ġsav ior +ĠT osh +Ġsw ast +P ASS +Ġr ink +Ġcard io +ĠI ro +ud i +Ġv antage +Ġv ans +ĠNi ño ++ = +Ġpropag ate +< ? +Ġmethod ological +204 39 +Ġtrig lycer +Ġing rained +ĠAn notations +arr anted +6 17 +ĠS odium +ĠA AC +techn ical +mult ipl +Ġ3 73 +å ĭ +Ġdec isively +Ġboost ers +Ġdessert s +ĠGren ade +Ġtest ifying +ĠSc ully +ID s +Ġlock down +ĠSc her +ĠR é +ĠWhit man +ĠRams ay +rem ote +Ġh ikers +ĠHy undai +Ġcons cientious +Ġcler ics +ĠSiber ian +ut i +is bury +Ġrel ayed +Ġqu artz +ĠC BI +seek ers +ull a +Ġweld ing +ĠSh al +ble acher +T ai +ĠSam son +Ġt umble +ĠInvest or +Ġsub contract +ĠShin ra +ow icz +j andro +d ad +Ġtermin ating +ĠNe ural +ä» £ +Ġleak age +ĠMid lands +ĠCaucas us +í ķ +c it +ll an +iv ably +ĠAlb ion +Ġ4 57 +Ġregist rations +Ġcomr ade +Ġclip board +0 47 +Ġdiscour aging +ĠO ops +Ad apt +Ġem path +n v +ĠPR OT +ĠDon n +ĠP ax +ĠB ayer +t is +Squ are +Ġfoot prints +part icip +ĠChile an +B rend +ind ucing +M agn +Ġclub house +ĠMagn um +Ġenc amp +ĠEth nic +uch a +ere y +Ġw atered +ĠCal ais +Ġcomplex ion +Ġsect s +Ġren ters +Ġbr as +oÄŁ an +Time out +Man agement +Ġinf ographic +P okemon +Cl ar +Ġloc ality +Ġfl ora +as el +P ont +Ġpop ulate +ĠO ng +Ġsubs istence +Ġa uctions +ĠMcA uliffe +ĠL OOK +br inger +Ġtit an +Ġmanif old +ĠâĹ ı +Ġcalibr ated +Ġcal iphate +ĠSH E +ĠCommission ers +ce ivable +j c +W inner +5 24 +Ġcond one +Other wise +Ġp iling +Ġem body +ĠCrime an +ut ics +ĠEx hibition +Ġ4 26 +e ering +Ġv ying +ĠH UGE +* =- +Ġprin cipled +à ¦ +Ġquir ks +ĠEdit ors +put ing +G ES +ĠF TA +ठ¾ +add on +ĠH AM +ĠFrie za +W oman +. $ +Ġc rib +ĠHer od +Ġtim ers +ĠSp aces +ĠMac intosh +at aka +Ġgl ide +Ġsmell ing +ĠB AL +Ġun su +Ġcond os +Ġbicy cl +ĠRev ival +55 3 +Ġjugg ling +H ug +ĠKardash ian +ĠBalk ans +mult iple +Ġnutrit ious +oc ry +19 00 +Ġinteg rates +Ġad joining +ĠF older +roll ment +ven ient +Ġu ber +y i +Ġwh iff +ĠJu ven +ĠB orough +net te +Ġb ilingual +ĠSp arks +ph thal +man ufact +Ġt outing +ĠPH I +Ke efe +Rew ard +Ġinf all +ĠTem per +typ ically +ĠNik ol +Ġregular s +Ġpseud onym +Ġexhib itions +Ġbl aster +Ġ40 9 +w arming +Ġrever ber +Ġrecip rocal +Ġ6 70 +ip ient +b ett +ĠBe gins +Ġit ching +ĠPh ar +Ass uming +Ġem itting +ĠML G +Ġbirth place +Ġt aunt +ĠL uffy +ĠAm it +Ġcir cled +ĠN ost +enn ett +Ġde forestation +ĠHist orically +ĠEvery day +Ġovert ake +79 2 +Ġn un +ĠLuc ia +Ġaccompan ies +ĠSe eking +ĠTr ash +an ism +R ogue +Ġnorth western +ĠSupplement al +ĠNY U +ĠF RI +ĠSat isf +x es +5 17 +Ġreass ured +Ġspor adic +Ġ7 01 +Ġmed ial +Ġcannabin oid +Ġbarbar ic +Ġep is +ĠExplos ive +ĠD ough +Ġuns olved +Support ed +Ġacknowled gment +sp awn +Ġkit chens +Ġ- = +talk ing +ic ist +ĠPeg asus +ĠPS U +Ġphot on +ĠAuthent ication +R G +@# & +76 2 +ĠCl air +Ġdi aper +Ġbr ist +ĠProsecut ors +ĠJ em +6 28 +ĠEvery where +ĠJean ne +equ ality +ãĥ© ãĥ³ +object s +ĠPel icans +Ġ39 2 +Ġbl u +b ys +ĠA go +Ġinstruction al +Ġdiscrim inating +ĠTR AN +ĠCorn el +ag os +Ġty re +Ġas piration +ĠBrid gewater +": - +! ". +ĠEn s +ĠCoc o +P ie +Ġdet ach +ĠC ouch +Ġphys ique +ĠOccup ations +osc opic +en ough +B uzz +App earance +Y P +Ġrac er +Ġcompl icity +r pm +T oy +Ġinterrupt s +ĠCat alyst +Ġut ilitarian +imp act +Ġsp aghetti +Ġp orous +Ġeste emed +Ġinc iner +ĠI OC +7 48 +Ġesp resso +ĠSm ile +abil ia +6 35 +Ġmathematic ian +Ġ4 24 +ĠK L +ĠH IP +Ġover heard +ĠT ud +ĠT ec +Ġqu izz +Ġfl attering +Ġcon n +âĢ İ +Ġatt aches +ĠR OS +ĠAC S +Ġt cp +ĠSh ame +sk ip +res pected +ĠTrin idad +gr ain +Ġfooth old +ĠUnch arted +ĠJul io +z l +av ored +ĠAn xiety +er rors +ĠCent auri +its ch +D addy +Ġclutch ing +ĠIm plement +ĠGut ierrez +Ġ7 60 +Ġtele portation +end ra +Ġrevers ible +st ros +Ad venture +08 3 +Ġliber ating +Ġas phalt +ĠSp end +AR DS +im sy +PR ES +ĠEmer ging +Ġwild fires +Ġtechn ologically +Ġem its +ĠART ICLE +Ġirregular ities +Ġcher ish +çī Ī +Ġst ink +ĠR ost +Econom ic +Ġcough ing +ĠMcC ann +pro perties +ilant ro +Ġreneg oti +Trans lation +Ġin quest +ĠGra pe +oot ers +gu i +ĠSwords man +ace ae +h itting +Ġr c +Ġexert ed +ĠS AP +it ent +Ġperil ous +Ġobsc urity +Ġassass inate +Ġab original +Ġresc uing +ĠSh attered +lock ing +all ion +Ch anging +ĠHar rington +ĠB ord +ĠAfgh ans +Jam ie +aret z +ĠAugust us +Ġ38 6 +8 30 +Ġj og +ok ingly +Tr igger +ĠH OR +Stat istics +Ġviewers hip +Ġadd itives +h ur +Ġmaxim izing +ĠR ove +ĠLou ie +ĠBuck et +ĠCHR IST +ou sel +Ġstre aks +ir ted +Ġt ert +Ġcolonial ism +Ġbur ying +y k +Cond ition +ĠDPR K +By Id +75 1 +âĹ ¼ +Ġwor risome +Ġvoc ational +sl ice +Ġsa ils +ĠCorrection al +95 4 +Ġt ul +K id +l uster +Ġfam ilial +ĠSp it +ĠEp iscopal +Specific ally +ĠVol cano +run s +q s +Ġve tted +Ġcram med +t rop +here r +Thank fully +Ġper cussion +Ġor anges +Ġround up +Ġ4 99 +x ious +Char acters +ĠZion ism +ĠR ao +ÃĽ ÃĽ +W F +Ġunintention al +ONE Y +Gr ab +Com mercial +Ġglut amate +ĠMcK enna +ru ciating +ning ton +ih u +Ch an +ĠSw ap +Ġleaf lets +Ġfunction ally +er ous +F arm +Ġcal oric +ĠLiter ally +con cert +Ġshe nan +Ġrep aid +ey es +Ġbas hing +ĠG orge +Ġcollabor ations +Ġun account +itch ie +Ġteam work +pp elin +Ġpip ing +Ġmin ced +Ġd iam +ri eg +Ġmasc ara +Ġsuck er +ĠMo ons +App s +ĠPe ck +Ġper v +ĠFl oat +o ley +ĠN ish +im ize +Ġarom atic +u in +end ish +! / +ĠB icycle +ĠAS IC +ile ged +ĠQuad ro +ios yn +Ġlock out +ĠW ink +SP EC +Attempt s +Ġseed ed +red o +ias is +Ġsn ag +ãĥķ ãĤ© +ãĤ ¶ +Ġground ing +Ġrelie ver +Ġfrivol ous +ĠG ifts +ĠF aces +Es pecially +Ġmicrobi ome +im ag +ĠSch l +ĠP les +ĠBle ach +ĠIr win +ĠE aton +ĠDisc iple +Ġmultipl ication +Ġcoer ced +Ġ4 19 +st h +E vil +B omb +Ġex orc +Ġstag gered +L ESS +Ġinert ia +ĠED IT +Ġgo b +Tr aditional +Ġclass y +Lear y +ĠP AGE +yr s +Ġtrans porter +Ġmat ured +Ġhij ab +Ġbi ome +Where as +Ġex termination +ĠT ues +ĠT akeru +ĠAud rey +er ial +ĠAd en +aff les +Ġnarciss istic +ĠB aird +UT F +I re +ĠCon nie +Ch amp +Ġwhis pering +ĠH att +D K +Ġdis infect +Ġdeduct ed +Ġpart ake +Ġdown grade +ĠEs ports +ĠContin uing +Ġdemocr atically +icro bial +itt a +Ġlim estone +Ġexempt ed +ĠFren zy +H erm +7 28 +Ġfled gling +Met a +765 61 +69 3 +% : +w ake +5 26 +ĠDis cipline +Ġvirgin ity +ĠLeg ions +ĠFrank ie +int ent +Ġrest rooms +ĠRou ter +da q +Ġobjection able +âĨ ij +w ark +ĠRah ul +g ain +activ ation +abs olute +ĠAccess ed +Ġ24 00 +ogg les +Ġsecond ly +ĠDEF ENSE +Ġpost age +wra pper +sh arp +7 29 +Ġcommun icates +Ġadd on +ĠMil itia +H ong +Ġsl umped +ĠJP EG +ĠI car +ad ish +68 1 +Ġmaj esty +ĠWolf gang +ĠEl astic +u per +Ġv iz +Ġunconscious ly +ĠST D +ĠS ass +Ġflower ing +ĠHel ic +ĠDra per +ĠAm ateur +Ġman ure +Ġdis ingen +ĠLe i +br ing +9 49 +Ġinhib ited +Ġhead quartered +Ġen igmatic +�� � +Ġred ress +R H +Ġratt led +Ġd iction +l io +ĠT BA +ĠSN AP +C alling +Ġfasc ists +ĠD ove +iew icz +0 36 +Ġco asts +ĠR ect +Ġ) ] +L ot +6 29 +ĠS EM +ĠPeters en +ĠExpl ain +ĠBo ards +ĠBe zos +ĠJ ournals +Ġ20 24 +p arser +Ġmist rust +Ġgr ate +ĠL ocked +bo a +S aint +g aming +Ġvow el +in ately +bl ow +All ah +Ġun matched +Ġb ordering +ĠExp end +n r +Or acle +rou ch +Ġcont iguous +ac us +Ġdist raught +58 1 +Ġanat omical +O X +ap ixel +8 33 +ĠPL US +Ġres usc +Ġab iding +57 3 +Ġvac ancies +Em ily +Ġhyp othal +ĠWer ner +ĠWe e +ĠDJ s +5 13 +Ġwitch craft +Ġac upuncture +ent ary +benef it +Product s +ĠP SP +ĠMP G +ĠJ inn +ĠJ arrett +Ġ4 45 +ĠIm aging +ĠP yth +Fin ish +Ġte x +Ġjuven iles +Ġhero ism +Ġdoubt less +ĠA ki +ĠT end +ĠPatri arch +Ġbit ters +ĠTele communications +it atively +ag na +Ġr g +ĠS OLD +Ġcomp ulsion +ĠN asa +ĠKath ryn +Ġmillion aires +Ġintrins ically +Ġbolst ered +time out +fl o +Ġtut or +p our +Stat ement +Ġ{ * +ĠRud olph +ĠKimber ly +rog ens +adi q +] + +Ġindign ation +Ġfract uring +ĠRe leases +ĠGr ain +pro tein +L ago +Ġvac ations +Ġboot ed +ĠTH REE +ĠH G +oresc ence +Ġt f +Ġso ar +iosyn cr +Ġgl ances +ĠSp oon +ĠJ ury +ĠCow boy +Ġcreat ively +Hig her +Ġsolic itor +Ġhaw k +ac io +89 6 +Ġsuperf lu +Ġbombs hell +ct ure +Ġbroker age +Ġraid ing +Ġf rench +Ġang led +Trans action +ĠGen ocide +u pe +ĠHait ian +57 2 +! : +Ġunwitting ly +iter ator +sc roll +Ġtall ied +Ġbi omedical +ĠC ARD +Ġe uphem +Ġbrain storm +a quin +K o +Mic helle +ĠR unes +ĠBall istic +ud ers +Ġmod esty +ĠiP ads +ĠEzek iel +Y E +Ġstars hip +Ġpower fully +Ġper l +ĠSh ade +ĠQu art +ĠE EG +Ġfisher man +OS ED +ĠTyp ical +df x +Ġmes hes +Ġet ched +worth iness +Ġtopp led +Ġ3 96 +or ius +We iss +Ġmy sql +ĠVal halla +Ù Ĵ +le asing +Ġrec omp +rap nel +S el +04 3 +Ġder ailed +ĠGu ides +IR T +Ġde human +ĠBritt any +" )) +Ġex claim +Ġb alk +Ġ8 40 +CLA IM +int el +L AB +Ġpe gged +Ġast roph +sm oking +Ġrig ging +Ġfix ation +Ġcat apult +ins ide +ĠC ascade +ĠBolshe vik +G aza +Dep th +Ġloud spe +Ġalmond s +me yer +l eness +j en +f resh +Ġunbeat en +ĠSqu id +ĠPres umably +Tim er +B W +Ġro sters +Ġell ipt +ĠHar riet +dat abase +ĠMut ual +ĠComm odore +uk ed +kn ife +ĠCOMM UN +h ya +Ġmel ts +arch ives +Ġrat ification +Ġmultip lying +Ġinter oper +Ġasc ert +w ings +ver ting +ĠScorp ion +ay e +ĠPorts mouth +ĠM TA +n it +iaz ep +Ġqu arantine +Ġslides how +Ġcent imeters +Ġsyn opsis +Ġsp ate +th irst +Ġnom inating +ĠMel vin +Pre view +Ġthro b +Ġgener ational +ĠRad ius +rest ling +put able +aw ar +N ECT +Ġunlaw fully +ĠRevel ations +Wik ipedia +sur v +Ġeye ing +ij n +ĠF W +Ġbr unt +Ġinter stellar +Ġcl itor +ĠCroat ian +ĠCh ic +ev a +ĠDis app +ĠA kin +iner ies +d ust +Interest ed +Ġgen esis +ĠE ucl +ö n +p icking +Ġmut ated +Ġdisappro ve +ĠHD L +Ġ6 25 +Ì ¶ +c ancer +Ġsqu ats +Ġle vers +Disc uss += ] +D ex +ĠVIDE OS +A UD +Ġtrans act +ĠKin ect +ĠK uala +ĠC yp +7 47 +Ġsh attering +Ġarsen ic +ĠInt ake +ĠAngel o +ĠQu it +ĠK he +Ġ18 93 +M aker +0 29 +ĠPain ting +Dis able +9 16 +Ġanal ges +Ġtact ile +Ġprop hes +Ġd iced +ĠTravel s +ĠHe ader +ĠClub s +Ass istant +Ġinc rim +Ġd ips +Ġcruc ifix +ĠShan ahan +ĠInter pret +Ġ40 90 +al ogy +abb a +Ġsimul ac +hus band +S IM +Ġrecy cle +uc er +ed ged +Ġre naissance +ĠBomb ay +Cath olic +ĠL INE +ĠCl othing +re ports +Ġpl aus +Ġd ag +ĠM ace +Z I +Ġintr uder +ĠVeter inary +g ru +Ġsne aky +ĠS ie +ĠC innamon +P OSE +Ġcou rier +ĠC NS +Ġemanc ipation +s it +Ġplay through +ĠFac ilities +v irt +ĠG auntlet +Thom pson +Ġunbeliev ably +Param eters +Ġst itching +ign e +ĠTH ESE +Priv acy +Ġshenan igans +Ġvit ri +ĠVal id +59 1 +Ń · +ĠProt otype +ink a +SC P +ĠT id +è Ī +old ed +Ġindividual ity +Ġbark ing +Ġm ars +ĠW D +Ġ8 20 +Ġt ir +Ġsl apping +Ġdisgr untled +ĠAng ola +ri us +ĠTorn ado +ĠTh urs +Ġcapt cha +Ġang st +ĠP og +ĠAssass ins +ĠAd idas +Ġjoy ful +Ġwh ining +Emer gency +Ġphosph orus +Ġatt rition +oph on +ĠTimber wolves +ĠJ ah +ĠBr inging +ĠW ad +ĠEn sure +oh l +ĠX ie +omm el +c mp +Ġz ipper +Ġrel at +ĠCor ridor +m ilo +T ING +Av g +Ġcro pped +] } +Ġr aged +ĠLump ur +ĠGuer rero +our ke +N ut +Ġoff sets +og lu +dr m +Ġmort als +lat able +Ġdismiss ive +ä¸ ī +Ġthro ats +Ġchips et +ĠSpot light +Catal og +art ist +G b +Ġch illy +Ġst oked +Ġ3 74 +W ard +L atin +Ġf iasco +Ġble ach +Ġb rav +Enh anced +Ġin oc +ĠFior ina +_ > +Ġle ukemia +Ġel uc +Ġannoun cer +ĠLith uan +ĠArm ageddon +å ĩ +Len in +ĠR uk +Ġpe pp +ĠRom antic +ĠP IT +ĠInter stellar +ĠAt kinson +R aid +J s +Go al +C ourse +Ġvan ishing +es ley +ĠR ounds +Els a +59 3 +Ġredund ancy +ĠST AND +Ġprop hetic +Ġhabit able +ry u +Ġfaint ly +M ODE +Ġfl anked +IR C +Aw esome +Ġsp urious +ĠZ ah +ĠMS G +Ġsh ading +Ġmotiv ational +ĠSant ana +ĠS PR +Ġexc ruciating +om ial +ĠM iko +ĠLe opard +A byss +Ġ[ | +d irty +Ġbath s +Ġdem oral +and re +P B +Ġun ification +Ġsac rament +Ġ[ & +Ġpric eless +Ġgel atin +Ġeman ating +ĠAll aah +98 6 +Ġout burst +Ġer as +ĠX VI +ĠSP I +O tt +ĠLaz arus +PL IED +F lying +blog s +W isconsin +R aven +Ġreb ate +Ġcreep s +ĠSp an +ĠPain ter +ĠKir a +ĠAm os +ĠCor vette +Cons umer +ĠRec over +ck i +Ġpes ky +ĠIn vention +Compan ies +Ġchalleng ers +ad emic +ĠUkrain ians +ĠNeuro log +ĠFors aken +Ġent rants +Ġemb attled +Ġdef unct +ĠGlac ier +Ġpo isons +ĠH orses +m akes +ĠD irt +Ġ4 23 +hh h +ĠTrans formation +QUI RE +................ .. +Ġtrave ller +ĠSe xy +ĠK ern +ip olar +Ġransom ware +oooooooo oooooooo +E c +rub y +Prof essional +ĠOut break +arg ument +G rey +ĠFif a +ĠCH O +ĠFOR M +ĠAm trak +- [ +Ġcr adle +Ġantioxid ants +ãģ®å ® +7 36 +ĠNAS L +ĠContribut ions +Ind iana +ĠST EP +C SS +Ġsal ient +Ġall ocations +yr ights +Ġm ashed +ĠCut ter +Sex ual +Ġp ounded +Ġfan base +Ġc asc +ĠTrans parency +Ġanaly tic +ĠSummon er +× ŀ +ĠAD C +det ail +Ġvan quished +Ġcr abs +ar ie +Dest roy +ĠS ack +Ġtrans istor +Al abama +ĠK oen +ĠFisher ies +c one +Ġannex ed +ĠM GM +es a +Ġf aked +ĠCong ratulations +Ġhind ered +Ġcorrection al +ĠI TV +lee ve +Ġin appropriately +lic ks +Ġtresp ass +Ġp aws +Ġnegoti ator +ĠChrist ensen +lim its +ĠDian ne +Ġeleg ance +ĠContract s +an ke +Ob j +Ġvigil ance +Ġcast les +ĠN AD +ĠHol o +Ġemph atically +ĠTit us +ĠServ ing +ĠRich ie +ĠP igs +5 68 +Ġanim osity +ĠAtt ributes +ĠU riel +M Q +my ra +ĠApplic ant +Ġpsychiat rists +ĠV ij +ĠAb by +ag ree +P ush +Ġk Wh +hib a +Ġinc ite +ĠWe asley +ĠTax i +minist ic +hy per +ĠF arn +Ġ6 01 +ĠNation wide +F ake +95 2 +Ġma ize +Ġinteract ed +Ġtransition ed +Ġparas itic +Ġharm onic +Ġdec aying +Ġbas eless +ns ics +Ġtrans pired +Ġabund antly +ĠFore nsic +Ġtread mill +ĠJ av +ab and +Ġssh d +Ġfront man +ĠJak arta +oll er +dro ps +ĠSERV ICES +rompt u +oph ical +h ospital +bled on +6 45 +Ġmid range +ĠEV ENT +cul ated +raw led +Ġper ched +Ġover board +ĠPe el +ĠP wr +ĠCar th +ĠCOM PLE +co e +sh all +Ġdeter rence +M ETHOD +ĠAbs ent +M EN +Ġs ill +ĠLE VEL +Y ork +Ġsin ners +ĠOP EC +ĠN ur +ĠDesign s +se lection +Ġunw orthy +CH A +Ġstreng thens +88 3 +ed ly +Ġslic ing +Ġmal nutrition +Ġfilm making +ĠPol k +ur ated +Ġ4 21 +bre akers +!' " +Ġwet lands +ĠDisc rimination +Ġallow able +Ġste ered +ĠSic ily +S AM +Ġmust ache +Ġm ids +Ġcl ipped +Ġcirc ulate +Ġbr ittle +ĠBuild ings +ra ised +ĠRound up +Ġwealth ier +Ġoverw rite +Ġover powered +ĠGerr ard +s ites +PD ATED +Ġacute ly +ĠGam ble +Ġp im +ĠK us +Typ ically +De ploy +ĠMoroc can +p otion +com be +Ġvigil ante +Ġ36 3 +St ew +ĠB agg +Ġres ided +ĠSp o +Ġrem nant +Ġempt iness +br ainer +Ġout patient +pri ority +Ġle ptin +ĠPay ton +ĠGle aming +ĠS hed +ĠPol o +ĠMormon ism +rest ricted +arl ane +w x +Ġcreat ine +ĠAn on +ĠST UD +ĠJ UL +ĠT ee +5 28 +08 9 +Ġhat ched +Dis patch +ĠCompos ite +Ġ45 1 +p uff +ĠX COM +ĠOr n +ĠTH ANK +END ED +ĠAshe ville +Ġà ľ +Ġman go +ĠS lightly +world ly +ĠW ander +ĠExp and +ĠCh r +M ist +Ġorthodox y +ĠUN ESCO +reg ate +Else where +k ie +ir led +Ġtopp le +Ġadopt ive +ĠLeg s +d ress +ĠS agan +b are +ĠGl ou +Cr unch +Ġhelp ers +Ġchron ically +ĠH uma +1 0000 +Ġaccommod ating +äº Ķ +Ġwrink les +Ġdod ged +four th +Ġpre con +Ġcompress or +ĠK are +Ġev ict +ĠWar wick +im ar +Ġmodern ization +Ġband wagon +Ġref uted +Ġnet ted +ĠNa ples +ĠGen ie +per ors +Ġfield ed +Ġde re +ĠPar ables +le es +Ġtr out +asp ers +Ġn ihil +Ġhapp iest +Ġflo ppy +ĠLo ft +ĠHe ard +Ġun ison +Ġl ug +ĠRed mond +class ic +Supp orters +SH IP +G MT +Ġfue lled +ç IJ +Ġd d +ĠEmin em +Ġ18 97 +NY SE +Ġsecret aries +ĠF IA +ĠCanaver al +F avorite +Ġp omp +Ġdetain ee +ers hip +aim on +i our +ĠA pex +Ġplant ations +am ia +ac ion +R ust +Ġtow ed +ĠTru ly +5 77 +Ġshel tered +r ider +W o +Ġl air +ĠInt elligent +impro ve +m atically +Ġet iquette +ad ra +all o +ĠJun o +any thing +ĠStru ggle +ĠPred ict +ĠGr imes +ĠAMER ICA +ct x +ĠSit uation +W OOD +Ġsol uble +me ier +Ġintoler able +ang ering +Ġun interrupted +Ġtool tip +Ġinterrog ated +Ġgun ned +ĠSne ak +æŃ ¦ +Ġt ether +Ġcr umble +L ens +Ġclust ered +ĠSy l +ĠHas an +Ġdystop ian +w ana +Ġjoy stick +ĠTh ib +amm u +Tom orrow +5 46 +Ġoverc ame +Ġminim ized +cept or +Run ner +ENG TH +ĠBrend a +ĠAchieve ments +Ġtor ches +Ġrapp ort +ĠInvestig ator +ĠHand ling +rel ation +g rey +8 15 +Ġk cal +ĠComm ands +d q +Ġcur ls +Ġbe arer +Ġcyn icism +it ri +ĠUse ful +B ee +D CS +Ġab ras +P ract +BIL ITIES +7 12 +Ġdebug ger +Ġdebt or +ĠL ia +ĠK ers +Ġexacerb ate +ĠSt acy +ĠB land +ĠSc enes +Ġbranch ing +âĸĪâĸĪâĸĪâĸĪ âĸĪâĸĪâĸĪâĸĪ +ape ake +Ġs alsa +Ġmish and +ĠKon ami +ĠN ib +Ġanecd ote +Ġagree able +Ï ī +ĠNath aniel +ĠHe isman +ĠB eware +Ġ18 86 +spect ive +69 1 +5 22 +Ġinhib its +Ġhas hing +Ġ18 89 +å° Ĩ +v ich +P ure +Ġsolid ly +Ġaspir in +im aru +Ġstreet car +ĠU CS +ĠJ udd +Ġflash backs +p ins +Ġ14 40 +ĠUN HCR +ĠSym ptoms +T IT +5 38 +F ra +% ); +Ġo oz +Ġcur few +Ġcal med +Ġparticip ates +Te X +Ġnons ensical +Ġfull back +ĠDe L +mon key +h ari +Ġmetabol ites +Ġloot ed +ĠAL WAYS +ĠB CC +L t +oc het +B one +Ġveto ed +Ġg cc +ĠCL ICK +Ġ18 88 +s af +Ġstiff ness +Ġlow ly +ĠGe h +vers on +ors et +Ġun foreseen +Ġan esthesia +ĠOpt ical +Ġrecon structed +ĠT up +sh ows +NEW S +ĠNewsp aper +ĠA SA +ter a +N umbers +Ġinexpl icable +× ij +Ġhard ness +unt arily +ĠA cer +grad ient +ARD IS +Ġwood land +Ġmetaph ors +ĠWem bley +ĠPa vel +phil is +Ġre writing +Ġpercept ual +Ġ10 70 +worm s +ĠDown s +Ġunsur prisingly +Ġtag ging +fl ame +Ġlit res +Ġboun ces +ĠB abe +sh ut +Ġoverd oses +ĠShe ila +ĠCh au +ĠBl ess +Capt ure +ĠSign ificant +ĠSc ion +Ġ38 9 +ĠMc H +ĠTitan ium +ĠMe al +amed a +ag ents +agg ressive +B illy +76 3 +ĠS aying +DER R +it one +Coll ins +B ound +Ġbol ted +ĠDM CA +95 3 +Ġun iqueness +Ġep igen +un ci +ant am +Ġreck oning +ch airs +OG R +ĠSen egal +Ġ18 62 +re levant +Ġ ¯ +Ġpharm acies +ĠG eral +v ier +Y an +OR PG +Ġrab id +b ending +ĠUN ITED +Ġ4 65 +As sembly +Ġwe ep +Ġbe hest +ĠMother s +ĠJ ace +h id +Ġwh irlwind +ĠUN IVERS +Ġut opian +Ġkidn ap +Ph ilipp +K in +89 3 +Ġlivest ream +ĠM ISS +Ġsub versive +ĠTechn iques +ĠJUST ICE +ĠB ASE +Ġ38 7 +Ġassail ants +ĠHard core +Ġsprink led +ĠP se +é ļ +print ed +ĠH au +OR GE +ĠT OUR +Ġl aced +Ġit ch +G iving +Ġport ed +78 1 +//////////////// //////////////// +bre eding +Ġlog ger +ĠH OL +inn ie +First ly +Ġembry onic +Ġdeleg ated +p ai +O IL +Ġcentr ally +ĠR x +ĠSc outing +D utch +Ġhe reditary +ĠCru iser +s at +5 29 +ĠMar riott +other mal +Ġprohib itions +E arn +ĠSt ab +ĠColleg es +ĠBel ief +st retched +ĠL H +ĠEntity Item +C IA +Ġun rem +Ġlaure ate +Ġdenomin ations +sum mary +h ler +S pect +ĠK laus +ĠBe ans +Ġins ur +ĠPA X +Ġfield er +ĠV et +ĠSp arrow +z ie +ĠS Q +ĠMond ays +ĠOff line +ĠLer ner +ĠExt ensions +Ire land +Ġpatron age +Ġcontrast ed +ĠMan ia +h irt +Mos cow +Ġcondem ns +ĠAn ge +Ġcomp osing +ĠPe pe +ĠP addock +Ġheter ogeneity +Ġide ologically +Ġf ishes +Ġcur sing +ĠR utherford +ĠFlo ating +ĠAm elia +Te a +Syn opsis +Ġstun ts +Ġbe ad +Ġstock ing +ĠM ILL +ob ook +mass ive +\ < +Ġh ump +ĠPref erences +Engine Debug +ge ist +ĠNiet o +ome ver +ish y +eval uate +col onial +Altern ative +ĠGo Pro +ĠV ortex +ĠNET WORK +ans ky +Sec ure +ĠTh rust +Sn ake +Ġparcel s +Ġsam urai +Ġactress es +N ap +M F +ifer ation +Be er +5 23 +ĠI ly +oint ment +P ing +Ġstri ped +ĠMell on +oss ession +Ġneut ron +end ium +Ġa ph +ĠFlav oring +Ġ38 3 +Ġrespons iveness +ĠJ indal +ĠHitch cock +Den ver +ĠDRAG ON +sm anship +ĠDu pl +Ġs ly +Ġweb cam +ĠTw ain +ĠDar ling +ili ate +cons umer +D IT +Ġnames ake +Ġun orthodox +Ġfun er +ĠPL oS +ĠCONTR OL +ozy g +ogl obin +F ACE +ER G +ĠD ia +ĠF iesta +ce le +0 34 +Ġencl ave +âĸ¬ âĸ¬ +on ement +al ist +M and +Ġhome grown +ĠF ancy +Ġconcept ions +ĠCont ains +ure en +Ġreiter ate +Ġme ager +Ġinstall ments +Sp awn +6 27 +Ġphot oc +ĠCab rera +ĠRos enthal +ĠLans ing +is ner +Ġinvest s +ĠUFO s +EX P +Hard ware +Ġtr agically +Ġconced es +ie ft +ch am +bor gh +ĠSch r +ĠMel anie +ĠH oy +Ġvisit ation +Ġid iosyncr +Ġfract ions +Ġfore skin +ob os +Ġpo aching +ĠVI EW +Ġstimul ates +ĠG ork +can on +M IC +ĠNem esis +ĠInd ra +ĠDM V +Ġ5 29 +Ġinspect ing +Ġgrand ma +ĠW hedon +ĠSh ant +ĠP urg +ik an +ĠT eg +ĠCL R +z ac +Vict oria +ĠVer ify +ion ics +Ġpart ying +ĠM ou +col our +Ġtestim onies +l ations +Ġpress uring +hi ro +ac ers +Ġf id +ang ler +ĠCS I +Ġhere after +Ġdiss idents +report ing +iph any +che v +Ġsol itude +Ġl obe +Ġind is +Ġcred ential +re cent +ad ult +ĠNir vana +ĠFranch ise +L ayer +H yp +ĠBerks hire +Ġwill s +t if +Ġtot em +ĠJud ah +rep air +Inst ant +5 48 +Ġemb assies +Ġbott leneck +Ġb ount +Ġtyp ew +ĠAl vin +j ing +im ilar +R ush +Ġbr im +ĠHEL P +A im +] ' +Ġpass ively +Ġbound ed +ĠR ated +Ġcriminal ity +Ġbiom ark +Ġdisp atcher +ĠTow ards +Ġ+ ++ +right eous +f rog +ĠP anc +C arter +0 32 +æ© Ł +Ġult raviolet +ĠLic ensed +ĠT ata +ĠBl essing +ĠG AM +Ġchem ically +ĠSe af +ĠRE LE +ĠMerc enary +capital ist +Ġform ulations +Ġann ihilation +ĠVer b +ĠAr gon +Ġun loaded +Ġmorp hed +Ġconqu ering +back er +I ELD +Ġtheft s +Ġfront runner +ĠRoy ale +ĠFund amental +el ight +C hip +necess ary +ay n +ĠSl ip +Ġ4 48 +cern ed +P ause +Ġshock ingly +ĠAB V +Ġcomp osure +7 33 +ĠMotors port +ah ime +Mur ray +M ach +Ġgr ids +Ġdeb ian +Ġfurther more +Ġdexter ity +ĠCollect ions +os lov +il age +b j +ĠMont eneg +Ġstrut Connector +Ġmassac res +Ġbrief s +fet ched +uv ian +ol ition +Fail ure +emon ic +Ġfl ared +Ġclaim ant +Ġc ures +Ġgive aways +ĠSubst ance +al ions +Ġcr inge +ĠK ul +Ġarist ocracy +ĠUl ster +ol ated +h ousing +ĠM IS +Ġgl ared +ĠWil helm +ne eds +lam bda +build ers +ĠV IS +Ġradi ator +ĠGhost busters +Ġ4 36 +act ual +Ġher ds +ç a +watch ing +Ġcounter ing +Ch arge +Ġchar red +Ġwar heads +Ġiod ine +ĠM acy +04 1 +Ġdepart ures +ĠS ins +Ġdy ed +ĠConcept s +g ado +7 13 +Ġquot ations +Ġg ist +ĠChrist y +Ġant igen +ĠHem p +ĠD rawn +ĠB arg +ez vous +Ġp aternity +Ġar du +ĠAnch orage +ĠR ik +Ġover loaded +ĠUs ername +ĠTam my +ĠN au +ĠCell ular +Ġw aning +Ġrod ent +ĠWor cester +il ts +ĠT ad +Ġdwell ings +Ġbull ish +4 31 +Ġretali ate +Ġmig raine +ĠChev ron +CH ECK +Ġdon key +c rim +SP A +ĠAn alog +Ġmarqu ee +ĠHa as +B ir +ĠGD DR +ĠDownload s +Ġwill power +ĠFor th +ĠRecord ed +Ġimp ossibility +ĠLog ged +ĠFr anks +ĠR att +in itions +Ġclean ers +Ġsore ly +Ġflick ering +ĠEx amination +c atching +allow een +Ms g +Ġdun no +F a +Ġdys ph +c razy +.' '. +Ġmain line +Ġc s +Ġp tr +ĠW ally +ig un +95 1 +ĠBig foot +f ights +Ġretrie ving +J r +Ġdupl ication +ĠExpl an +Ġrel ational +Ġqu aint +Ġbisc uits +Ġad o +Ġsh udder +Ġantid ote +blood ed +ks h +Ġsa uces +Ġrein vest +Ġdispens ary +ĠD iver +Ġ9 000 +stud ent +Ġin separ +esc ap +Ġtodd lers +ĠGP IO +ĠAss ignment +head ers +Ġlack luster +Ġab ack +95 6 +Ġtool bar +7 45 +Ġo ust +Ġcontempl ation +ĠPRES IDENT +Ġ4 58 +==== == +Ġguarantee ing +ĠHe ist +ĠCann es +Ļ ½ +Ġcollabor ator +ĠAm p +Ġg ou +ĠSH ALL +st ories +78 3 +Ġmobil ized +Ġbro od +ĠL U +ĠðŁ ij +Ġref in +ĠAnthrop ology +v ind +ill i +Ġwarrant ies +ĠB abel +Ġsw ath +Ġc aches +Ġantagon ists +art ifacts +Ġhot ly +ĠSt arts +ĠG ö +z ag +!! !!! +Ġsc ourge +Ġcons piring +ru its +re verse +ĠShe en +ĠJes uit +ĠGiov anni +ad ies +Ġbutt ocks +ear cher +ac an +Ġvolley ball +Ġshroud ed +Ġscore board +b ats +ĠI PM +Ġass es +Ġde regulation +ĠTe legram +ĠReb oot +Ġ7 000 +ĠCan ary +Ġk ernels +ĠFranç ois +ĠD uff +ĠP on +ĠLe ica +ĠGar min +Ġor phans +ĠClaud ia +Ġcal endars +ĠLe ilan +ent o +R ocket +Ġbr unch +ĠHaw king +ain ers +Ġsens ibilities +Ġk W +ĠK and +Ġre claimed +Ġinteresting ly +× © +rom y +J M +ĠEnhance ment +b ush +Sk ip +Ġrapp ers +Ġg azing +p edia +ath lon +Rev olution +Ġsn ipers +Ġre verted +Ġconglomer ate +T erry +79 4 +Ġhars her +Ġdes olate +ĠHit man +Comm ission +Ġ( / +âĢ¦ ." +Com par +Ġampl ification +om inated +Ġreg ress +ĠColl ider +Ġinform ants +Ġg azed diff --git a/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/special_tokens_map.json b/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/special_tokens_map.json new file mode 100644 index 00000000000000..773bd68cf09004 --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/special_tokens_map.json @@ -0,0 +1,23 @@ +{ + "bos_token": { + "content": "<|endoftext|>", + "lstrip": false, + "normalized": true, + "rstrip": false, + "single_word": false + }, + "eos_token": { + "content": "<|endoftext|>", + "lstrip": false, + "normalized": true, + "rstrip": false, + "single_word": false + }, + "unk_token": { + "content": "<|endoftext|>", + "lstrip": false, + "normalized": true, + "rstrip": false, + "single_word": false + } +} diff --git a/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/tokenizer_config.json b/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/tokenizer_config.json new file mode 100644 index 00000000000000..48314a4d098cbc --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/tokenizer_config.json @@ -0,0 +1,33 @@ +{ + "add_bos_token": false, + "add_prefix_space": false, + "bos_token": { + "__type": "AddedToken", + "content": "<|endoftext|>", + "lstrip": false, + "normalized": true, + "rstrip": false, + "single_word": false + }, + "clean_up_tokenization_spaces": true, + "eos_token": { + "__type": "AddedToken", + "content": "<|endoftext|>", + "lstrip": false, + "normalized": true, + "rstrip": false, + "single_word": false + }, + "errors": "replace", + "model_max_length": 1024, + "pad_token": null, + "tokenizer_class": "GPT2Tokenizer", + "unk_token": { + "__type": "AddedToken", + "content": "<|endoftext|>", + "lstrip": false, + "normalized": true, + "rstrip": false, + "single_word": false + } +} diff --git a/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/vocab.json b/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/vocab.json new file mode 100644 index 00000000000000..a15dd0028acd1d --- /dev/null +++ b/api/core/model_runtime/model_providers/__base/tokenizers/gpt2/vocab.json @@ -0,0 +1,50259 @@ +{ + "!": 0, + "!!": 3228, + "!!!": 10185, + "!!!!": 13896, + "!!!!!": 50184, + "!!!!!!!!": 34635, + "!!\"": 37160, + "!\"": 2474, + "!\",": 40754, + "!\".": 48220, + "!'": 13679, + "!'\"": 49296, + "!)": 8133, + "!),": 26290, + "!).": 19588, + "!,": 28265, + "!--": 28112, + "!.": 43179, + "!/": 48443, + "!:": 48725, + "!?": 22857, + "!?\"": 42720, + "!]": 36463, + "\"": 1, + "\"!": 40484, + "\"\"": 15931, + "\"\"\"": 37811, + "\"'": 30543, + "\"(": 18109, + "\")": 4943, + "\"))": 48774, + "\"),": 12340, + "\").": 11074, + "\");": 15341, + "\",": 1600, + "\",\"": 2430, + "\"-": 26793, + "\".": 1911, + "\"...": 26214, + "\".[": 42924, + "\"/>": 26700, + "\":": 1298, + "\":\"": 2404, + "\":\"\",\"": 34713, + "\":\"\"},{\"": 47182, + "\":\"/": 15473, + "\":-": 48219, + "\":[": 20598, + "\":[\"": 26358, + "\":[{\"": 32509, + "\":{\"": 8351, + "\";": 8172, + "\">": 5320, + "\"><": 22039, + "\">": 23785, + "\"}": 20662, + "\"},": 25719, + "\"},\"": 13018, + "\"},{\"": 11919, + "\"}],\"": 42785, + "\"âĢ¦": 24426, + "\"âĢĶ": 15327, + "#": 2, + "##": 2235, + "###": 21017, + "####": 4242, + "########": 7804, + "################": 14468, + "################################": 29113, + "#$": 29953, + "#$#$": 34206, + "$": 3, + "$$": 13702, + "$$$$": 36737, + "$,": 47113, + "$.": 35307, + "${": 38892, + "%": 4, + "%\"": 39658, + "%%": 16626, + "%%%%": 36917, + "%)": 4407, + "%),": 15920, + "%).": 18823, + "%);": 49563, + "%,": 7441, + "%-": 33963, + "%.": 7225, + "%:": 48529, + "%;": 26525, + "%]": 39850, + "&": 5, + "&&": 25226, + "'": 6, + "'\"": 29653, + "''": 7061, + "''''": 39115, + "''.": 35384, + "'';": 44648, + "')": 11537, + "'),": 33809, + "').": 27691, + "');": 24036, + "',": 3256, + "',\"": 40264, + "','": 41707, + "'-": 29001, + "'.": 4458, + "'.\"": 30827, + "'/": 26488, + "':": 10354, + "';": 17020, + "'>": 44167, + "'?": 30960, + "']": 20520, + "'d": 1549, + "'ll": 1183, + "'m": 1101, + "'re": 821, + "'s": 338, + "'t": 470, + "'ve": 1053, + "(": 7, + "(\"": 7203, + "($": 16763, + "(&": 39434, + "('": 10786, + "((": 19510, + "()": 3419, + "())": 28955, + "());": 35430, + "(),": 22784, + "().": 22446, + "():": 33529, + "();": 9783, + "(){": 39893, + "(*": 46491, + "(-": 32590, + "([": 26933, + "(\\": 38016, + "(_": 28264, + "({": 15090, + ")": 8, + ")!": 31520, + ")\"": 16725, + ")\",": 42501, + ")'": 33047, + ")(": 5769, + "))": 4008, + ")))": 22305, + "))))": 35514, + ")),": 36911, + ")).": 29720, + "));": 18125, + ")*": 27493, + ")+": 47762, + "),": 828, + "),\"": 27267, + ")-": 13219, + ")--": 42944, + ").": 737, + ").\"": 21387, + ")...": 26513, + ").[": 42669, + ")/": 20679, + "):": 2599, + ");": 1776, + ")": 46904, + "-.": 34507, + "->": 3784, + "-[": 49146, + "-|": 22831, + ".": 13, + ".\"": 526, + ".\"\"": 32203, + ".\")": 19570, + ".\",": 33283, + ".\",\"": 41424, + ".\"[": 18161, + ".#": 32535, + ".$": 48082, + ".'": 2637, + ".'\"": 11496, + ".''": 13531, + ".''.": 50113, + ".(": 12195, + ".)": 2014, + ".),": 12179, + ".).": 15729, + ".):": 47308, + ".*": 15885, + ".,": 1539, + ".,\"": 44388, + ".-": 7874, + ".--": 9816, + "..": 492, + "...": 986, + "...\"": 9313, + "...)": 23029, + "....": 1106, + ".....": 12359, + "......": 16317, + ".......": 25780, + "........": 2109, + ".........": 34617, + ".............": 44274, + "................": 4181, + "..................": 49129, + "........................": 27754, + "................................": 8864, + "................................................................": 23193, + "...?": 44825, + "...]": 22345, + "../": 40720, + "./": 19571, + ".:": 11207, + ".;": 15089, + ".<": 29847, + ".>": 32756, + ".?": 40791, + ".[": 3693, + ".]": 8183, + "._": 13557, + ".}": 44587, + ".âĢĵ": 37585, + ".âĢĶ": 13402, + ".ãĢį": 43735, + ".�": 40670, + "/": 14, + "/\"": 30487, + "/#": 31113, + "/$": 32624, + "/(": 29006, + "/)": 34729, + "/*": 15211, + "/**": 35343, + "/+": 28404, + "/,": 47454, + "/-": 16327, + "/.": 11757, + "//": 1003, + "///": 20379, + "////": 9705, + "////////": 16150, + "////////////////": 27246, + "////////////////////////////////": 49704, + "/>": 15913, + "/?": 20924, + "/_": 47835, + "/âĢĭ": 27643, + "0": 15, + "00": 405, + "000": 830, + "0000": 2388, + "00000": 20483, + "000000": 10535, + "0000000": 24598, + "00000000": 8269, + "0000000000000000": 25645, + "00007": 44808, + "0001": 18005, + "0002": 34215, + "001": 8298, + "0010": 37187, + "002": 21601, + "00200000": 36490, + "003": 11245, + "004": 22914, + "005": 22544, + "006": 28041, + "007": 25816, + "008": 25257, + "009": 28694, + "01": 486, + "010": 20943, + "0100": 39103, + "011": 28555, + "012": 30206, + "013": 30273, + "014": 28645, + "015": 25150, + "016": 27037, + "017": 29326, + "018": 29159, + "019": 30484, + "02": 2999, + "020": 33618, + "0200": 44613, + "021": 46821, + "022": 44087, + "023": 45310, + "024": 40839, + "025": 36629, + "026": 45987, + "027": 44698, + "028": 46957, + "029": 48891, + "03": 3070, + "030": 39101, + "031": 43637, + "032": 49959, + "033": 44427, + "034": 49841, + "035": 44215, + "036": 48597, + "04": 3023, + "040": 36676, + "041": 50049, + "043": 48768, + "044": 43977, + "045": 40350, + "046": 45438, + "047": 48000, + "048": 47202, + "05": 2713, + "050": 28669, + "052": 37841, + "055": 47838, + "057": 43526, + "059": 46712, + "06": 3312, + "060": 41322, + "07": 2998, + "070": 43509, + "075": 46396, + "08": 2919, + "080": 33057, + "083": 48290, + "088": 46556, + "089": 49352, + "09": 2931, + "090": 42534, + "1": 16, + "10": 940, + "100": 3064, + "1000": 12825, + "10000": 49388, + "1001": 47705, + "1007": 44318, + "101": 8784, + "1016": 27956, + "102": 15377, + "1024": 35500, + "1027": 40403, + "103": 15197, + "104": 13464, + "105": 13348, + "106": 15801, + "107": 15982, + "108": 15711, + "1080": 24045, + "109": 14454, + "11": 1157, + "110": 11442, + "1100": 42060, + "111": 16243, + "1111": 26259, + "112": 14686, + "113": 16616, + "114": 16562, + "115": 15363, + "116": 18298, + "117": 17657, + "118": 16817, + "119": 16315, + "12": 1065, + "120": 10232, + "1200": 27550, + "121": 19244, + "122": 18376, + "123": 10163, + "124": 17464, + "125": 11623, + "126": 19420, + "127": 16799, + "128": 12762, + "129": 18741, + "13": 1485, + "130": 12952, + "131": 22042, + "132": 19924, + "133": 16945, + "134": 19880, + "135": 17059, + "136": 20809, + "137": 19708, + "138": 20107, + "139": 20219, + "14": 1415, + "140": 15187, + "141": 23756, + "142": 23726, + "143": 21139, + "144": 18444, + "145": 18781, + "146": 20964, + "147": 20198, + "148": 18294, + "149": 19442, + "15": 1314, + "150": 8628, + "1500": 33698, + "151": 24309, + "152": 17827, + "153": 21395, + "154": 21526, + "155": 18742, + "156": 21599, + "157": 18458, + "158": 21273, + "159": 19707, + "16": 1433, + "160": 14198, + "1600": 36150, + "161": 25948, + "162": 25061, + "163": 24136, + "164": 23237, + "165": 20986, + "166": 23055, + "167": 21940, + "168": 14656, + "169": 22172, + "17": 1558, + "170": 17279, + "171": 27192, + "172": 23628, + "173": 25399, + "174": 22985, + "175": 17430, + "176": 24096, + "177": 22413, + "178": 23188, + "179": 21738, + "18": 1507, + "180": 15259, + "1800": 39188, + "181": 27057, + "182": 24294, + "183": 24839, + "184": 22883, + "185": 21652, + "186": 25096, + "187": 23451, + "188": 20356, + "189": 23362, + "19": 1129, + "190": 19782, + "1900": 48104, + "191": 26492, + "192": 17477, + "1920": 40454, + "193": 24943, + "194": 22913, + "1945": 41931, + "195": 22186, + "1950": 42751, + "1959": 45403, + "196": 25272, + "1960": 38503, + "1963": 45192, + "1964": 46477, + "1965": 45271, + "1966": 44227, + "1967": 42830, + "1968": 42246, + "1969": 38391, + "197": 24991, + "1970": 30986, + "1971": 41208, + "1972": 41023, + "1973": 40220, + "1974": 40828, + "1975": 38449, + "1976": 38108, + "1977": 37781, + "1978": 37950, + "1979": 33581, + "198": 22337, + "1980": 23664, + "1981": 35411, + "1982": 30763, + "1983": 29279, + "1984": 28296, + "1985": 29110, + "1986": 28054, + "1987": 27301, + "1988": 26709, + "1989": 25475, + "199": 19104, + "1990": 19891, + "1991": 24529, + "1992": 23847, + "1993": 24465, + "1994": 22666, + "1995": 21908, + "1996": 22288, + "1997": 21498, + "1998": 21113, + "1999": 18946, + "2": 17, + "20": 1238, + "200": 2167, + "2000": 11024, + "200000": 33470, + "2001": 14585, + "2002": 16942, + "2003": 16088, + "2004": 15724, + "2005": 14315, + "2006": 13330, + "2007": 12726, + "2008": 11528, + "2009": 10531, + "201": 1264, + "2010": 10333, + "2011": 9804, + "2012": 6999, + "2013": 6390, + "2014": 4967, + "2015": 4626, + "2016": 5304, + "2017": 5539, + "2018": 7908, + "2019": 23344, + "202": 19004, + "2020": 42334, + "203": 22416, + "204": 18638, + "20439": 47936, + "205": 21261, + "206": 22136, + "207": 22745, + "208": 21315, + "209": 22567, + "21": 2481, + "210": 21536, + "211": 21895, + "212": 21777, + "213": 26427, + "214": 22291, + "215": 23349, + "216": 20666, + "217": 24591, + "218": 28727, + "219": 28896, + "22": 1828, + "220": 17572, + "2200": 34294, + "221": 26115, + "222": 23148, + "223": 22047, + "224": 24137, + "225": 18182, + "226": 24909, + "227": 24403, + "228": 23815, + "229": 23539, + "23": 1954, + "230": 19214, + "231": 25667, + "232": 24339, + "233": 25429, + "234": 24409, + "235": 22370, + "236": 24940, + "237": 24693, + "238": 23721, + "239": 23516, + "24": 1731, + "240": 16102, + "241": 28872, + "242": 27877, + "243": 26660, + "244": 25707, + "245": 22995, + "246": 26912, + "247": 23753, + "248": 23045, + "249": 21626, + "25": 1495, + "250": 9031, + "2500": 44688, + "251": 28072, + "252": 22800, + "253": 28592, + "254": 24970, + "255": 13381, + "256": 11645, + "257": 28676, + "258": 25600, + "259": 25191, + "26": 2075, + "260": 21719, + "261": 30057, + "262": 29119, + "263": 29558, + "264": 18897, + "265": 22980, + "266": 25540, + "267": 25674, + "268": 25022, + "269": 26276, + "27": 1983, + "270": 20233, + "271": 28977, + "272": 29807, + "273": 27367, + "274": 28857, + "275": 23195, + "276": 27988, + "277": 27019, + "278": 25870, + "279": 26050, + "28": 2078, + "280": 21033, + "281": 30368, + "282": 32568, + "283": 30290, + "284": 30336, + "285": 26279, + "286": 27033, + "287": 27800, + "288": 25270, + "289": 27693, + "29": 1959, + "290": 24369, + "291": 33551, + "292": 32759, + "293": 31675, + "294": 27696, + "295": 25710, + "296": 27137, + "297": 26561, + "298": 27728, + "299": 22579, + "3": 18, + "30": 1270, + "300": 6200, + "3000": 23924, + "301": 18938, + "302": 22709, + "303": 22572, + "304": 21288, + "305": 22515, + "306": 20548, + "307": 22996, + "308": 21495, + "309": 26895, + "31": 3132, + "310": 26717, + "311": 36244, + "312": 27970, + "313": 25838, + "314": 33638, + "315": 27936, + "316": 33400, + "317": 34125, + "318": 36042, + "319": 35175, + "32": 2624, + "320": 19504, + "321": 36453, + "322": 37283, + "323": 32637, + "324": 33916, + "325": 26582, + "326": 39195, + "327": 34159, + "328": 34256, + "329": 37967, + "33": 2091, + "330": 26073, + "331": 31697, + "332": 32148, + "333": 20370, + "3333": 24840, + "334": 31380, + "335": 27326, + "336": 29211, + "337": 31496, + "338": 28460, + "339": 29626, + "34": 2682, + "340": 23601, + "341": 33660, + "342": 31575, + "343": 32118, + "344": 33535, + "345": 27712, + "346": 30557, + "347": 30995, + "348": 28978, + "349": 27371, + "35": 2327, + "350": 14877, + "351": 35273, + "352": 33394, + "353": 33319, + "354": 32182, + "355": 28567, + "356": 32066, + "357": 27277, + "358": 31128, + "359": 30743, + "36": 2623, + "360": 15277, + "361": 35195, + "362": 35667, + "363": 35447, + "364": 26780, + "365": 24760, + "366": 32459, + "367": 27824, + "368": 27412, + "369": 30803, + "37": 2718, + "370": 20167, + "371": 38056, + "372": 36720, + "373": 34770, + "374": 31020, + "375": 22318, + "376": 32128, + "377": 26514, + "378": 30695, + "379": 29088, + "38": 2548, + "380": 23734, + "381": 36626, + "382": 36243, + "383": 34741, + "384": 22842, + "385": 27203, + "386": 21734, + "387": 32220, + "388": 30460, + "389": 29769, + "39": 2670, + "390": 25964, + "391": 37710, + "392": 32321, + "393": 26007, + "394": 34626, + "395": 31010, + "396": 34107, + "397": 33372, + "398": 31952, + "399": 28771, + "4": 19, + "40": 1821, + "400": 7029, + "4000": 27559, + "401": 21844, + "402": 32531, + "403": 31552, + "404": 26429, + "405": 26598, + "406": 29703, + "407": 30120, + "408": 26200, + "409": 29416, + "41": 3901, + "410": 33289, + "411": 42224, + "412": 39226, + "413": 44103, + "414": 37309, + "415": 35038, + "416": 35218, + "417": 38547, + "418": 39667, + "419": 45068, + "42": 3682, + "420": 27211, + "421": 46636, + "422": 44361, + "423": 43356, + "424": 40090, + "425": 32114, + "426": 42780, + "427": 42363, + "428": 40173, + "429": 11785, + "43": 3559, + "430": 31794, + "431": 50080, + "432": 45331, + "433": 42117, + "434": 47101, + "435": 40064, + "436": 43690, + "437": 43284, + "438": 43704, + "439": 47106, + "44": 2598, + "440": 25644, + "441": 39710, + "442": 39506, + "443": 34938, + "444": 30272, + "445": 43489, + "446": 27260, + "447": 34825, + "448": 31115, + "449": 31911, + "45": 2231, + "450": 17885, + "451": 36330, + "452": 37730, + "453": 36625, + "454": 34229, + "455": 30505, + "456": 29228, + "457": 33032, + "458": 29334, + "459": 33459, + "46": 3510, + "460": 34716, + "461": 40652, + "462": 39997, + "463": 38380, + "464": 44578, + "465": 42018, + "466": 42199, + "467": 24669, + "468": 38472, + "469": 42947, + "47": 2857, + "470": 27790, + "471": 38339, + "472": 37856, + "473": 37804, + "474": 38652, + "475": 32576, + "476": 35435, + "477": 32883, + "478": 29059, + "479": 31714, + "48": 2780, + "480": 22148, + "481": 40271, + "482": 40149, + "483": 38783, + "484": 34137, + "485": 32642, + "486": 34251, + "487": 35133, + "488": 33646, + "489": 35890, + "49": 2920, + "490": 31503, + "491": 41289, + "492": 40256, + "493": 43134, + "494": 39449, + "495": 33781, + "496": 37747, + "497": 38073, + "498": 36260, + "499": 28324, + "5": 20, + "50": 1120, + "500": 4059, + "5000": 27641, + "501": 33548, + "502": 35126, + "503": 31938, + "504": 33580, + "505": 31654, + "506": 35638, + "507": 35378, + "508": 33042, + "509": 29022, + "51": 4349, + "510": 33690, + "511": 41647, + "512": 25836, + "513": 48645, + "514": 47396, + "515": 45969, + "516": 47493, + "517": 48170, + "518": 44085, + "519": 47785, + "52": 4309, + "520": 31211, + "522": 49542, + "523": 49803, + "524": 48057, + "525": 39088, + "526": 48531, + "528": 49351, + "529": 49721, + "53": 4310, + "530": 38612, + "533": 44994, + "535": 44465, + "536": 44468, + "537": 46096, + "538": 49561, + "54": 4051, + "540": 35005, + "544": 47576, + "545": 45326, + "546": 49489, + "548": 49934, + "549": 44966, + "55": 2816, + "550": 22730, + "551": 43697, + "552": 40427, + "553": 48096, + "554": 44218, + "555": 31046, + "556": 37864, + "557": 41948, + "558": 40486, + "559": 38605, + "56": 3980, + "560": 34135, + "561": 47915, + "562": 43918, + "563": 46572, + "565": 47372, + "568": 49211, + "57": 3553, + "570": 39254, + "571": 42875, + "572": 48724, + "573": 48638, + "574": 46900, + "575": 36189, + "576": 37452, + "577": 49447, + "578": 38907, + "579": 41734, + "58": 3365, + "580": 39322, + "581": 48630, + "582": 46044, + "583": 46239, + "584": 46352, + "585": 38905, + "586": 29796, + "587": 44617, + "588": 39118, + "589": 44169, + "59": 3270, + "590": 36993, + "591": 48952, + "592": 45839, + "593": 49051, + "594": 46438, + "595": 35124, + "596": 45734, + "597": 43239, + "598": 41292, + "599": 43452, + "6": 21, + "60": 1899, + "600": 8054, + "6000": 43434, + "601": 41706, + "602": 31418, + "603": 35642, + "604": 31916, + "605": 32417, + "606": 33206, + "607": 31980, + "608": 28688, + "609": 31751, + "61": 5333, + "610": 39132, + "612": 43610, + "613": 47512, + "614": 46841, + "615": 47007, + "616": 44214, + "617": 47941, + "618": 47448, + "62": 5237, + "620": 38850, + "623": 46872, + "625": 26704, + "626": 45191, + "627": 49856, + "628": 48200, + "629": 48602, + "63": 5066, + "630": 30005, + "635": 48250, + "64": 2414, + "640": 31102, + "641": 42759, + "642": 41290, + "643": 41813, + "644": 29173, + "645": 49259, + "646": 27720, + "647": 33981, + "648": 34287, + "649": 33300, + "65": 2996, + "650": 17544, + "651": 40639, + "652": 43193, + "653": 46435, + "654": 39111, + "655": 35916, + "656": 37466, + "657": 37680, + "658": 38431, + "659": 36445, + "66": 2791, + "660": 39885, + "661": 47159, + "662": 39380, + "663": 45791, + "665": 36879, + "666": 27310, + "6666": 19060, + "66666666": 41977, + "667": 28933, + "668": 35809, + "669": 36657, + "67": 3134, + "670": 43798, + "671": 46250, + "672": 43864, + "673": 45758, + "674": 45385, + "675": 42444, + "676": 42548, + "677": 40179, + "678": 30924, + "679": 37601, + "68": 3104, + "680": 37397, + "681": 48564, + "682": 43950, + "683": 47521, + "684": 41580, + "685": 35978, + "686": 33808, + "687": 39925, + "688": 34427, + "689": 40523, + "69": 3388, + "690": 35844, + "691": 49541, + "692": 46589, + "693": 48528, + "694": 45214, + "695": 37381, + "696": 38205, + "697": 40035, + "698": 39357, + "699": 47325, + "7": 22, + "70": 2154, + "700": 9879, + "701": 41583, + "702": 36680, + "703": 36809, + "704": 32869, + "705": 34801, + "706": 35402, + "707": 24038, + "70710": 42877, + "708": 32583, + "709": 31495, + "71": 4869, + "710": 43147, + "712": 49517, + "713": 50055, + "714": 45722, + "718": 45720, + "72": 4761, + "720": 23906, + "725": 45151, + "727": 47760, + "728": 48524, + "729": 48555, + "73": 4790, + "730": 43916, + "733": 49995, + "736": 49150, + "74": 4524, + "740": 45598, + "745": 50150, + "747": 48882, + "748": 48246, + "75": 2425, + "750": 15426, + "751": 48365, + "752": 43665, + "753": 44550, + "754": 41874, + "755": 38172, + "756": 38219, + "757": 39251, + "758": 38569, + "759": 38314, + "76": 4304, + "760": 40761, + "7601": 42752, + "762": 48194, + "763": 49641, + "765": 29143, + "76561": 48527, + "767": 32059, + "768": 30610, + "77": 3324, + "770": 41820, + "771": 46761, + "772": 43571, + "773": 46871, + "774": 47582, + "775": 34483, + "776": 39509, + "777": 29331, + "778": 39761, + "779": 40393, + "78": 3695, + "780": 40873, + "781": 49703, + "782": 46519, + "783": 50165, + "784": 37688, + "785": 41172, + "786": 46302, + "787": 41019, + "789": 40401, + "79": 3720, + "790": 37750, + "792": 48156, + "793": 44750, + "794": 50242, + "795": 41544, + "796": 41060, + "797": 44673, + "798": 43240, + "799": 45455, + "8": 23, + "80": 1795, + "800": 7410, + "8000": 33942, + "801": 41531, + "802": 30863, + "803": 43564, + "804": 36088, + "805": 28256, + "806": 37988, + "807": 36928, + "808": 28362, + "809": 34583, + "81": 6659, + "810": 40215, + "815": 49503, + "82": 6469, + "820": 41739, + "825": 47338, + "83": 5999, + "830": 48341, + "833": 48634, + "84": 5705, + "840": 40675, + "85": 5332, + "850": 25764, + "855": 45432, + "86": 4521, + "860": 45039, + "864": 39570, + "866": 42240, + "87": 5774, + "870": 46951, + "875": 31360, + "877": 42802, + "88": 3459, + "880": 41655, + "882": 42980, + "883": 49287, + "884": 40353, + "885": 44230, + "886": 44980, + "887": 46660, + "888": 28011, + "889": 39121, + "89": 4531, + "893": 49682, + "896": 48712, + "899": 44093, + "9": 24, + "90": 3829, + "900": 12865, + "901": 46815, + "905": 44928, + "909": 44675, + "91": 6420, + "910": 43234, + "911": 35549, + "915": 40248, + "916": 48894, + "92": 5892, + "920": 37128, + "925": 46351, + "93": 6052, + "930": 45418, + "94": 5824, + "940": 46899, + "949": 48581, + "95": 3865, + "950": 31027, + "951": 50119, + "952": 49234, + "953": 49649, + "954": 48372, + "956": 50148, + "96": 4846, + "960": 39277, + "968": 38956, + "969": 38819, + "97": 5607, + "970": 43587, + "975": 42716, + "978": 32196, + "98": 4089, + "980": 40022, + "985": 42250, + "986": 49087, + "987": 44183, + "989": 42520, + "99": 2079, + "990": 34155, + "992": 41561, + "993": 44821, + "994": 42691, + "995": 33438, + "996": 38565, + "997": 39647, + "998": 34808, + "999": 17032, + "9999": 24214, + ":": 25, + ":\"": 11097, + ":#": 43922, + ":'": 32105, + ":(": 37498, + ":,": 45299, + ":-": 21912, + ":/": 14079, + "://": 1378, + "::": 3712, + "::::": 24022, + "::::::::": 43661, + ":[": 33250, + ":\\": 7479, + ":]": 47715, + ":{": 29164, + ";": 26, + ";\"": 26033, + ";;": 7665, + ";;;;": 14223, + ";;;;;;;;": 25887, + ";;;;;;;;;;;;": 46939, + ";}": 46956, + "<": 27, + "": 50256, + "=": 28, + "=\"": 2625, + "=\"\"": 33151, + "=\"#": 25698, + "=\"/": 35922, + "=#": 46249, + "=$": 43641, + "='": 11639, + "=(": 16193, + "=-": 10779, + "=-=-": 16822, + "=-=-=-=-": 27584, + "=-=-=-=-=-=-=-=-": 46402, + "=/": 33223, + "==": 855, + "===": 18604, + "====": 1421, + "======": 50155, + "========": 2559, + "============": 25609, + "================": 4770, + "================================": 10052, + "================================================================": 23926, + "=>": 14804, + "=[": 41888, + "=\\\"": 17553, + "=]": 48874, + "={": 34758, + "=~": 31820, + "=~=~": 33813, + ">": 29, + ">\"": 24618, + ">(": 33994, + ">)": 43734, + ">,": 22330, + ">.": 28401, + ">:": 31175, + "><": 6927, + ">>": 4211, + ">>>": 33409, + ">>>>": 16471, + ">>>>>>>>": 33717, + ">>\\": 34516, + ">[": 36937, + ">]": 37981, + "?": 30, + "?!": 12248, + "?!\"": 30823, + "?\"": 1701, + "?\",": 35379, + "?\".": 43634, + "?'": 8348, + "?'\"": 26989, + "?)": 10091, + "?),": 33924, + "?).": 29865, + "?,": 21747, + "?:": 27514, + "??": 3548, + "???": 28358, + "????": 9805, + "?????": 19622, + "?????-": 25658, + "?????-?????-": 31666, + "????????": 35709, + "?]": 26398, + "?ãĢį": 42943, + "@": 31, + "@#": 41573, + "@#&": 48193, + "@@": 12404, + "@@@@": 22675, + "@@@@@@@@": 37991, + "A": 32, + "AA": 3838, + "AAA": 29697, + "AAAA": 17922, + "AAAAAAAA": 43488, + "AAF": 38540, + "AB": 6242, + "ABC": 24694, + "ABLE": 17534, + "AC": 2246, + "ACA": 26576, + "ACC": 26861, + "ACE": 11598, + "ACH": 16219, + "ACK": 8120, + "ACP": 33056, + "ACT": 10659, + "ACTED": 38542, + "ACTION": 44710, + "ACY": 43300, + "AD": 2885, + "ADA": 26853, + "ADD": 29266, + "ADE": 19266, + "ADRA": 40517, + "ADS": 47149, + "ADVERTISEMENT": 19053, + "AE": 14242, + "AF": 8579, + "AFP": 17449, + "AFTA": 32106, + "AG": 4760, + "AGE": 11879, + "AGES": 25552, + "AH": 18429, + "AI": 20185, + "AIDS": 39338, + "AIN": 29833, + "AIR": 42149, + "AK": 10206, + "AKING": 43602, + "AL": 1847, + "ALD": 44071, + "ALE": 21358, + "ALK": 28082, + "ALL": 7036, + "ALLY": 19807, + "ALS": 23333, + "ALSE": 23719, + "ALT": 31429, + "ALTH": 40818, + "AM": 2390, + "AMA": 25087, + "AMD": 28075, + "AME": 10067, + "AMES": 29559, + "AMI": 43870, + "AMP": 23518, + "AMS": 40834, + "AMY": 29428, + "AN": 1565, + "ANA": 31574, + "ANC": 20940, + "ANCE": 19240, + "AND": 6981, + "ANE": 30525, + "ANG": 15567, + "ANGE": 27746, + "ANI": 43664, + "ANK": 15154, + "ANN": 22846, + "ANS": 15037, + "ANT": 8643, + "ANY": 31827, + "AP": 2969, + "APD": 35349, + "APE": 45721, + "APH": 31300, + "API": 17614, + "APP": 24805, + "APS": 44580, + "APTER": 29485, + "AR": 1503, + "ARA": 24401, + "ARB": 37304, + "ARC": 25793, + "ARCH": 31315, + "ARD": 9795, + "ARDIS": 49608, + "ARDS": 48294, + "ARE": 12203, + "ARGET": 46095, + "ARI": 33604, + "ARK": 14175, + "ARM": 33456, + "ARP": 36035, + "ARR": 26465, + "ARS": 27415, + "ART": 7227, + "ARY": 13153, + "AS": 1921, + "ASC": 42643, + "ASE": 11159, + "ASED": 42827, + "ASH": 11211, + "ASHINGTON": 19436, + "ASON": 36033, + "ASS": 10705, + "AST": 11262, + "ASY": 26483, + "AT": 1404, + "ATA": 13563, + "ATCH": 11417, + "ATE": 6158, + "ATED": 11617, + "ATER": 23261, + "ATES": 29462, + "ATH": 12599, + "ATHER": 45226, + "ATING": 33881, + "ATION": 6234, + "ATIONAL": 29912, + "ATIONS": 18421, + "ATIVE": 37045, + "ATOR": 25633, + "ATS": 33586, + "ATT": 17139, + "ATTLE": 35455, + "ATURE": 40086, + "ATURES": 47471, + "AU": 26830, + "AUD": 48877, + "AUT": 39371, + "AV": 10116, + "AW": 12298, + "AX": 25922, + "AY": 4792, + "AZ": 22778, + "Aaron": 34451, + "Ab": 4826, + "Ability": 22453, + "About": 8585, + "Above": 32397, + "Abs": 24849, + "Absolutely": 40501, + "Abstract": 23839, + "Abyss": 49073, + "Ac": 12832, + "Acc": 17320, + "Accept": 38855, + "Access": 15457, + "Accessory": 41629, + "According": 4821, + "Account": 30116, + "Acknowled": 39482, + "Across": 40553, + "Act": 6398, + "Action": 12502, + "ActionCode": 31573, + "Activ": 25526, + "Active": 13739, + "Activity": 16516, + "Actor": 40277, + "Actually": 26417, + "Ad": 2782, + "Adam": 23159, + "Adams": 47462, + "Adapt": 48003, + "Adapter": 47307, + "Add": 4550, + "Added": 13003, + "Adding": 32901, + "Additional": 17699, + "Additionally": 23216, + "Address": 20231, + "Adds": 46245, + "Adjust": 39668, + "Admin": 46787, + "Administ": 41862, + "Adult": 42995, + "Adv": 22856, + "Advanced": 28809, + "Adventure": 48289, + "Advertisement": 4723, + "Advertisements": 14592, + "Af": 17584, + "Afee": 44314, + "Aff": 35191, + "African": 43032, + "After": 3260, + "Ag": 10262, + "Again": 15316, + "Against": 39276, + "Age": 23396, + "Agent": 36772, + "Agg": 46384, + "Ah": 10910, + "Aid": 44245, + "Aim": 49945, + "Air": 16170, + "Ak": 33901, + "Al": 2348, + "Alabama": 49177, + "Alan": 36235, + "Albert": 42590, + "Ale": 37474, + "Alert": 36420, + "Alex": 15309, + "Alexander": 38708, + "Ali": 37893, + "Alias": 40489, + "Alice": 44484, + "Alien": 44501, + "All": 3237, + "Allah": 48620, + "Allen": 39989, + "Allow": 35265, + "Allows": 34934, + "Almost": 23379, + "Along": 24035, + "Alpha": 38077, + "Already": 37447, + "Alright": 31442, + "Also": 7583, + "Alt": 29161, + "Altern": 23081, + "Alternative": 49788, + "Alternatively": 44163, + "Although": 7003, + "Always": 30374, + "Am": 5840, + "Amazing": 42770, + "Amazon": 24888, + "Amb": 35649, + "Americ": 5477, + "America": 18165, + "American": 7437, + "Americans": 17636, + "Amid": 43541, + "Among": 14311, + "Amount": 31264, + "Amy": 40797, + "An": 2025, + "Analy": 37702, + "Analysis": 32750, + "Ancient": 44974, + "And": 1870, + "Anderson": 42991, + "Andre": 31258, + "Andrew": 20508, + "Android": 25934, + "Andy": 35314, + "Ang": 13450, + "Angel": 33246, + "Angelo": 45585, + "Anim": 35320, + "Animal": 40002, + "Animation": 39520, + "Ann": 18858, + "Anna": 31160, + "Anne": 43227, + "Anonymous": 20660, + "Another": 6610, + "Answer": 33706, + "Ant": 13217, + "Anth": 30327, + "Anthony": 32697, + "Anti": 28795, + "Any": 7149, + "Anyone": 21129, + "Anything": 40028, + "Anyway": 23795, + "Ap": 25189, + "Apart": 39182, + "App": 4677, + "AppData": 22322, + "Apparently": 30402, + "Appearance": 48231, + "Appearances": 47569, + "Apple": 16108, + "Applic": 33583, + "Application": 23416, + "Applications": 41995, + "Apply": 44836, + "Apps": 48433, + "Apr": 13680, + "April": 16784, + "Ar": 3163, + "Arab": 31602, + "Arc": 24021, + "Arcade": 43763, + "Arch": 19895, + "Are": 8491, + "Area": 30547, + "Aren": 43199, + "Arg": 28100, + "Args": 42035, + "Ari": 26529, + "Arizona": 40732, + "Ark": 42007, + "Arm": 26560, + "Armor": 31512, + "Army": 45272, + "Around": 24472, + "Array": 19182, + "Arsenal": 46230, + "Art": 8001, + "Arthur": 29874, + "Article": 14906, + "Artist": 43020, + "As": 1722, + "Ash": 26754, + "Asia": 38555, + "Asian": 43224, + "Aside": 32602, + "Ask": 25214, + "Asked": 18932, + "Ass": 8021, + "Assad": 23622, + "Assembly": 49670, + "Asset": 45869, + "Assistant": 48902, + "Associated": 29014, + "Assuming": 48142, + "Ast": 33751, + "Async": 42367, + "At": 2953, + "Atl": 25255, + "Atlanta": 43482, + "Atlantic": 41120, + "Att": 8086, + "Attach": 33296, + "Attack": 27732, + "Attempt": 37177, + "Attempts": 48452, + "Attorney": 46319, + "Attribute": 33682, + "Attributes": 29021, + "Aud": 16353, + "Audio": 21206, + "Aug": 12512, + "August": 17908, + "Aust": 15160, + "Austin": 40245, + "Austral": 19763, + "Australia": 27429, + "Australian": 38036, + "Aut": 16541, + "Auth": 30515, + "Authent": 47649, + "Author": 13838, + "Authorities": 28705, + "Auto": 27722, + "Autom": 38062, + "Av": 7355, + "Availability": 29841, + "Available": 10493, + "Average": 26287, + "Avg": 48997, + "Avoid": 38618, + "Aw": 23155, + "Awesome": 49061, + "Ax": 31554, + "Ay": 42012, + "Az": 26903, + "B": 33, + "BA": 4339, + "BACK": 31098, + "BALL": 45463, + "BAT": 47379, + "BB": 15199, + "BBC": 33833, + "BC": 2749, + "BD": 14529, + "BE": 12473, + "BER": 13246, + "BF": 29499, + "BG": 40469, + "BI": 3483, + "BIL": 19676, + "BILITIES": 49516, + "BILITY": 25382, + "BILL": 39888, + "BIP": 47772, + "BIT": 26094, + "BL": 9148, + "BLE": 19146, + "BLIC": 32936, + "BM": 12261, + "BN": 15766, + "BO": 8202, + "BOOK": 39453, + "BOX": 39758, + "BP": 20866, + "BR": 11473, + "BRE": 40438, + "BS": 4462, + "BSD": 21800, + "BT": 19313, + "BTC": 35964, + "BU": 19499, + "BUG": 12953, + "BUR": 38926, + "BUS": 45346, + "BUT": 47526, + "BW": 48802, + "BY": 17513, + "Ba": 34458, + "Baby": 36534, + "Back": 7282, + "Background": 21756, + "Bad": 22069, + "Bah": 47514, + "Bal": 24597, + "Balance": 45866, + "Ball": 23410, + "Balt": 41312, + "Baltimore": 46139, + "Ban": 30457, + "Band": 31407, + "Bang": 43984, + "Bank": 28650, + "Bar": 10374, + "Barn": 47359, + "Bas": 15522, + "Base": 14881, + "Based": 15001, + "Basic": 26416, + "Basically": 31524, + "Bat": 24541, + "Batman": 37039, + "Battery": 47006, + "Battle": 24064, + "Bay": 15262, + "Be": 3856, + "Bear": 36352, + "Beast": 41490, + "Beat": 34979, + "Beaut": 38413, + "Bec": 39649, + "Because": 8128, + "Beck": 43454, + "Bed": 45896, + "Bee": 49512, + "Beer": 49802, + "Before": 8421, + "Beg": 24586, + "Begin": 44140, + "Beginning": 45198, + "Beh": 25267, + "Behind": 34163, + "Being": 18357, + "Bel": 12193, + "Bell": 36488, + "Below": 21106, + "Ben": 11696, + "Bench": 44199, + "Benef": 42166, + "Benz": 42484, + "Ber": 24814, + "Bern": 23927, + "Bernie": 33433, + "Berry": 25215, + "Besides": 23937, + "Best": 13014, + "Bet": 13056, + "Beta": 43303, + "Better": 28971, + "Between": 25262, + "Bey": 21993, + "Beyond": 24102, + "Bi": 23286, + "Big": 12804, + "Bill": 17798, + "Billy": 49640, + "Bind": 36180, + "Bio": 42787, + "Bir": 50091, + "Bird": 42562, + "Birth": 38480, + "Bit": 13128, + "Bitcoin": 22614, + "Bl": 3629, + "Black": 9915, + "Blade": 47520, + "Blake": 37849, + "Ble": 43413, + "Block": 12235, + "Blocks": 45356, + "Blog": 42383, + "Blood": 21659, + "Bloom": 38941, + "Bloomberg": 47696, + "Blu": 38676, + "Blue": 14573, + "Bo": 16635, + "Board": 29828, + "Bob": 18861, + "Body": 25842, + "Bomb": 48478, + "Bon": 20682, + "Bone": 49580, + "Bonus": 29435, + "Boo": 46120, + "Book": 10482, + "Books": 30650, + "Boost": 45686, + "Boot": 36476, + "Border": 34189, + "Born": 28524, + "Boss": 37310, + "Boston": 31710, + "Bot": 20630, + "Both": 10265, + "Bott": 28653, + "Bottom": 34104, + "Bound": 49646, + "Bow": 39961, + "Box": 14253, + "Boy": 26554, + "Br": 9414, + "Bra": 42333, + "Brad": 30805, + "Brain": 44687, + "Brand": 38416, + "Brandon": 45467, + "Brave": 39787, + "Brazil": 39190, + "Bre": 12679, + "Break": 31737, + "Breaking": 29449, + "Brend": 48015, + "Brew": 44029, + "Brexit": 40730, + "Brian": 24761, + "Bride": 47148, + "Bridge": 37385, + "Brien": 20118, + "Bright": 41267, + "Bring": 31416, + "Brit": 17959, + "Britain": 37114, + "British": 25631, + "Bro": 15783, + "Broad": 30507, + "Bron": 18760, + "Brook": 45534, + "Brother": 39461, + "Brow": 32635, + "Brown": 20644, + "Browser": 46532, + "Bruce": 38509, + "Bs": 37000, + "Bu": 38374, + "Buff": 36474, + "Buffer": 28632, + "Bug": 25624, + "Build": 15580, + "Builder": 32875, + "Building": 25954, + "Built": 39582, + "Bul": 33481, + "Bull": 39549, + "Bur": 22991, + "Burn": 29053, + "Bus": 16286, + "Bush": 36113, + "Business": 24749, + "But": 1537, + "Button": 21864, + "Buy": 14518, + "Buyable": 39693, + "BuyableInstoreAndOnline": 40242, + "Buzz": 48230, + "By": 3886, + "ById": 48364, + "Byte": 40778, + "Bytes": 45992, + "C": 34, + "CA": 8141, + "CAN": 44565, + "CAP": 33177, + "CAR": 20034, + "CAST": 44647, + "CB": 23199, + "CBC": 29208, + "CBS": 22923, + "CC": 4093, + "CCC": 46361, + "CD": 8610, + "CDC": 47667, + "CE": 5222, + "CENT": 43960, + "CEO": 46691, + "CEPT": 42006, + "CF": 22495, + "CG": 39816, + "CH": 3398, + "CHA": 49285, + "CHAPTER": 41481, + "CHAR": 38019, + "CHAT": 31542, + "CHECK": 50084, + "CHO": 44899, + "CHQ": 47831, + "CHR": 37846, + "CI": 25690, + "CIA": 49732, + "CL": 5097, + "CLA": 16827, + "CLAIM": 48778, + "CLASS": 31631, + "CLASSIFIED": 45449, + "CLE": 29931, + "CLOSE": 32737, + "CLUD": 39149, + "CLUS": 28332, + "CM": 24187, + "CN": 44175, + "CNN": 18474, + "CO": 8220, + "COL": 25154, + "COLOR": 46786, + "COM": 9858, + "COMPLE": 41335, + "CON": 10943, + "CONCLUS": 47542, + "CONT": 37815, + "COR": 44879, + "CP": 8697, + "CPU": 36037, + "CR": 9419, + "CRE": 43387, + "CRIP": 36584, + "CRIPTION": 40165, + "CS": 7902, + "CSS": 49155, + "CT": 4177, + "CTV": 30428, + "CU": 43633, + "CV": 33538, + "CVE": 31436, + "CW": 43538, + "Ca": 24334, + "Cache": 30562, + "Cal": 9771, + "Calif": 19619, + "California": 25284, + "Call": 14134, + "Callback": 47258, + "Calling": 48593, + "Cam": 21701, + "Camera": 35632, + "Camp": 21111, + "Campaign": 46102, + "Can": 6090, + "Canada": 17940, + "Canadian": 28203, + "Cand": 41572, + "Cap": 15610, + "Capital": 39315, + "Capt": 19209, + "Captain": 27898, + "Capture": 49630, + "Car": 9914, + "Card": 16962, + "Care": 17784, + "Carl": 26886, + "Cart": 43476, + "Carter": 49958, + "Cas": 35155, + "Case": 20448, + "Cash": 35361, + "Cass": 43529, + "Cast": 19248, + "Cat": 21979, + "Catal": 39075, + "Catalog": 49015, + "Category": 27313, + "Cath": 39581, + "Catholic": 48919, + "Cause": 42323, + "Cele": 42741, + "Cell": 28780, + "Cent": 19085, + "Center": 23656, + "Central": 30645, + "Cert": 37608, + "Certain": 26469, + "Certainly": 36001, + "Ch": 1925, + "Chain": 35491, + "Chair": 43189, + "Chall": 41812, + "Champ": 48507, + "Chan": 48407, + "Chance": 43606, + "Change": 19400, + "Changed": 31813, + "Changes": 29238, + "Changing": 48333, + "Channel": 29239, + "Chapter": 14126, + "Char": 12441, + "Character": 27275, + "Characters": 48393, + "Charg": 28316, + "Charge": 50044, + "Charges": 36970, + "Charl": 24453, + "Charles": 28711, + "Charlie": 37136, + "Chart": 45488, + "Chat": 30820, + "Che": 7376, + "Check": 9787, + "Chel": 38292, + "Chelsea": 41053, + "Chem": 41829, + "Chest": 45170, + "Chicago": 25705, + "Chicken": 45565, + "Chief": 23675, + "Child": 16424, + "Children": 26829, + "China": 14581, + "Chinese": 23604, + "Chip": 49985, + "Cho": 22164, + "Choice": 46770, + "Choose": 31851, + "Chris": 15645, + "Christ": 10684, + "Christian": 20298, + "Christmas": 44614, + "Christopher": 38025, + "Chuck": 44324, + "Church": 46686, + "Circ": 31560, + "City": 14941, + "Civil": 32610, + "Cl": 2601, + "Cla": 47404, + "Claim": 44819, + "Clar": 48035, + "Clark": 43250, + "Class": 9487, + "Classic": 39914, + "Cle": 34349, + "Clean": 32657, + "Clear": 19856, + "Clearly": 30638, + "Click": 8164, + "Client": 11792, + "Climate": 37649, + "Clinton": 16549, + "Clock": 44758, + "Close": 26125, + "Closure": 45398, + "Cloud": 18839, + "Club": 42350, + "Cmd": 40109, + "Co": 7222, + "Coach": 40677, + "Cod": 43806, + "Code": 10669, + "Coin": 24387, + "Col": 5216, + "Cola": 28635, + "Cold": 34312, + "Cole": 46509, + "Coll": 22667, + "Collect": 31337, + "Collection": 36307, + "College": 38951, + "Collins": 49645, + "Color": 10258, + "Colorado": 41330, + "Columb": 36063, + "Column": 39470, + "Com": 5377, + "Comb": 20575, + "Combat": 38667, + "Come": 16773, + "Coming": 30804, + "Comm": 6935, + "Command": 21575, + "Comment": 21357, + "Comments": 23903, + "Commerce": 47662, + "Commercial": 48401, + "Commission": 50246, + "Common": 17227, + "Commun": 30813, + "Community": 20012, + "Comp": 7293, + "Compan": 41309, + "Companies": 49111, + "Company": 39154, + "Compar": 50249, + "Compare": 41488, + "Compared": 44669, + "Compat": 40073, + "Compl": 38143, + "Complete": 20988, + "Completed": 43768, + "Component": 21950, + "Computer": 34556, + "Con": 3103, + "Conclusion": 21481, + "Cond": 25559, + "Condition": 48362, + "Conf": 18546, + "Config": 16934, + "Configuration": 38149, + "Cong": 18649, + "Congratulations": 45048, + "Congress": 25916, + "Conn": 37321, + "Connect": 13313, + "Connection": 32048, + "Connector": 34525, + "Connell": 15559, + "Connor": 27136, + "Cons": 9444, + "Conservative": 42039, + "Consider": 19626, + "Considering": 40475, + "Console": 47581, + "Const": 34184, + "Construct": 42316, + "Constructed": 25207, + "Construction": 36687, + "Consumer": 49106, + "Cont": 4264, + "Contact": 17829, + "Container": 29869, + "Content": 19746, + "Contents": 15842, + "Context": 21947, + "Contin": 17875, + "Continue": 29453, + "Contract": 45845, + "Contribut": 37146, + "Control": 15988, + "Controller": 22130, + "Cook": 28937, + "Cool": 34530, + "Cooldown": 45953, + "Cop": 13379, + "Copy": 29881, + "Copyright": 15269, + "Cor": 10606, + "Core": 14055, + "Corn": 41389, + "Corp": 45680, + "Correct": 42779, + "Correction": 43267, + "Cos": 36734, + "Cost": 13729, + "Could": 23722, + "Coun": 31053, + "Council": 40940, + "Count": 12332, + "Counter": 31694, + "Country": 33921, + "Cour": 25877, + "Course": 49046, + "Court": 36699, + "Courtesy": 31825, + "Cover": 27245, + "Cow": 40147, + "Cr": 13916, + "Cra": 33800, + "Craft": 14467, + "Craig": 40441, + "Crash": 47598, + "Cre": 12443, + "Creat": 16719, + "Create": 16447, + "Created": 41972, + "Creating": 32071, + "Credit": 23690, + "Credits": 42855, + "Crew": 46724, + "Crime": 45580, + "Crit": 18559, + "Critical": 41000, + "Critics": 36623, + "Cro": 35403, + "Cross": 21544, + "Cru": 27535, + "Crunch": 49384, + "Cruz": 41811, + "Cry": 26677, + "Crypt": 23919, + "Crystal": 43752, + "Cs": 32274, + "Ct": 33707, + "Ctrl": 40069, + "Cu": 46141, + "Cub": 43632, + "Cube": 29071, + "Cur": 26628, + "Current": 11297, + "Currently": 21327, + "Custom": 15022, + "Customer": 44939, + "Cut": 26254, + "Cy": 20418, + "D": 35, + "DA": 5631, + "DAQ": 46640, + "DATA": 26947, + "DAY": 26442, + "DB": 11012, + "DC": 9697, + "DCS": 49513, + "DD": 16458, + "DE": 7206, + "DEBUG": 30531, + "DEC": 41374, + "DEF": 32988, + "DEM": 39429, + "DEN": 41819, + "DEP": 46162, + "DER": 14418, + "DERR": 49643, + "DES": 30910, + "DEV": 39345, + "DF": 8068, + "DH": 41473, + "DI": 17931, + "DIR": 34720, + "DIS": 26288, + "DIT": 49828, + "DIV": 33569, + "DJ": 35028, + "DK": 48510, + "DL": 19260, + "DM": 23127, + "DN": 35504, + "DNA": 28886, + "DO": 18227, + "DOC": 38715, + "DOM": 39170, + "DON": 41173, + "DOS": 35178, + "DOWN": 41925, + "DP": 6322, + "DR": 7707, + "DS": 5258, + "DT": 24544, + "DVD": 39218, + "DW": 42955, + "DX": 36227, + "Da": 26531, + "Dad": 46270, + "Daddy": 48280, + "Daily": 28545, + "Dallas": 40540, + "Dam": 14550, + "Damage": 22022, + "Damn": 43343, + "Dan": 21174, + "Daniel": 19962, + "Danny": 45478, + "Dar": 32708, + "Dark": 17367, + "Dash": 43041, + "Dat": 27354, + "Data": 6601, + "Database": 38105, + "Date": 10430, + "Dave": 27984, + "David": 11006, + "Davis": 36462, + "Day": 12393, + "Days": 38770, + "Db": 43832, + "De": 5005, + "Dead": 20489, + "Deal": 45776, + "Dean": 36372, + "Dear": 20266, + "Death": 20148, + "Deb": 16587, + "Debug": 27509, + "Dec": 10707, + "December": 20588, + "Decl": 37835, + "Decre": 43198, + "Deep": 29744, + "Def": 7469, + "Default": 19463, + "Defense": 27300, + "Definition": 36621, + "Del": 13856, + "Delete": 38727, + "Delivery": 33129, + "DeliveryDate": 39749, + "Delta": 42430, + "Dem": 11522, + "Demand": 42782, + "Democratic": 33939, + "Democrats": 29969, + "Demon": 35477, + "Den": 21306, + "Denver": 49818, + "Dep": 12156, + "Department": 36261, + "Depending": 41156, + "Deploy": 49322, + "Depth": 48791, + "Depths": 42382, + "Der": 28532, + "Des": 5960, + "Desc": 24564, + "Description": 11828, + "Design": 23067, + "Desk": 42523, + "Desktop": 36881, + "Despite": 8332, + "Dest": 24159, + "Destroy": 49174, + "Det": 11242, + "Detailed": 32080, + "Details": 24259, + "Detect": 47504, + "Detroit": 40404, + "Dev": 13603, + "Develop": 19246, + "Developer": 45351, + "Development": 41206, + "Device": 24728, + "Dex": 48875, + "Di": 18683, + "Dial": 24400, + "Dialog": 44204, + "Dialogue": 41099, + "Diamond": 47710, + "Dick": 38743, + "Did": 11633, + "Die": 32423, + "Diff": 28813, + "Different": 40341, + "Dig": 19511, + "Digital": 27640, + "Dim": 29271, + "Dir": 35277, + "Direct": 13470, + "Director": 28702, + "Directory": 43055, + "Dis": 7279, + "Disable": 48893, + "Disc": 15642, + "Disclaimer": 19618, + "Discover": 44596, + "Discuss": 48873, + "Discussion": 34255, + "Disk": 40961, + "Disney": 37338, + "Dispatch": 49354, + "Display": 23114, + "Dist": 20344, + "Distance": 45767, + "District": 44857, + "Div": 24095, + "Do": 5211, + "DoS": 46498, + "Doc": 23579, + "Doctor": 37564, + "Doctors": 47087, + "Document": 24941, + "Documents": 38354, + "Does": 13921, + "Dog": 32942, + "Dom": 24510, + "Domain": 43961, + "Domin": 43417, + "Don": 3987, + "Donald": 7371, + "DonaldTrump": 27674, + "Done": 45677, + "Donnell": 24853, + "Dou": 40287, + "Double": 25628, + "Doug": 42297, + "Down": 8048, + "Download": 10002, + "Downloadha": 41551, + "Dr": 6187, + "Draft": 37741, + "Drag": 46022, + "Dragon": 17808, + "DragonMagazine": 42424, + "Draw": 25302, + "Dream": 30571, + "Dri": 20564, + "Drive": 24825, + "Driver": 32103, + "Dro": 35442, + "Drop": 26932, + "Drug": 37943, + "Ds": 30832, + "Du": 35660, + "Dual": 36248, + "Dub": 37590, + "Due": 22229, + "Dun": 30128, + "Dur": 36927, + "Duration": 26054, + "During": 7191, + "Dust": 43767, + "Dutch": 49717, + "Dynamic": 44090, + "E": 36, + "EA": 16412, + "EAR": 17133, + "EB": 30195, + "EC": 2943, + "ECA": 36600, + "ECD": 27295, + "ECH": 25994, + "ECK": 25171, + "ECT": 9782, + "ECTION": 24565, + "ED": 1961, + "EDIT": 24706, + "EE": 6500, + "EED": 41841, + "EEE": 31909, + "EEEE": 35039, + "EEK": 33823, + "EEP": 35238, + "EF": 25425, + "EFF": 37267, + "EG": 7156, + "EGA": 33146, + "EGIN": 43312, + "EH": 42413, + "EL": 3698, + "ELD": 24639, + "ELF": 37738, + "ELL": 23304, + "ELS": 37142, + "ELY": 30943, + "EM": 3620, + "EMA": 27630, + "EMBER": 28952, + "EMENT": 12529, + "EMOTE": 36862, + "EMP": 39494, + "EMS": 39201, + "EN": 1677, + "ENA": 45510, + "ENC": 24181, + "ENCE": 18310, + "ENCY": 45155, + "END": 10619, + "ENDED": 49361, + "ENE": 39267, + "ENG": 26808, + "ENGTH": 49494, + "ENN": 34571, + "ENS": 16938, + "ENSE": 24290, + "ENT": 3525, + "ENTION": 45589, + "ENTS": 15365, + "EO": 4720, + "EP": 8905, + "EPA": 40906, + "ER": 1137, + "ERA": 46461, + "ERAL": 27130, + "ERC": 47691, + "ERE": 9338, + "ERG": 49837, + "ERN": 28778, + "ERO": 34812, + "ERROR": 24908, + "ERS": 4877, + "ERSON": 29086, + "ERT": 17395, + "ERY": 19664, + "ES": 1546, + "ESA": 43279, + "ESCO": 43311, + "ESE": 33635, + "ESH": 44011, + "ESPN": 31730, + "ESS": 7597, + "ESSION": 47621, + "EST": 6465, + "EStream": 39906, + "EStreamFrame": 43177, + "ET": 2767, + "ETA": 20892, + "ETF": 22274, + "ETH": 20702, + "ETHOD": 36252, + "ETS": 32716, + "EU": 19684, + "EV": 20114, + "EVA": 27881, + "EW": 6217, + "EX": 6369, + "EXP": 49864, + "EXT": 13918, + "EY": 22348, + "Each": 10871, + "Ear": 8419, + "Earlier": 13689, + "Early": 20457, + "Earn": 49725, + "Earth": 22840, + "East": 25234, + "Eastern": 46109, + "Easy": 28406, + "Eat": 47659, + "Ec": 49136, + "Econom": 28489, + "Economic": 48307, + "Ed": 7407, + "Edge": 37021, + "Edit": 18378, + "Edited": 45882, + "Editor": 17171, + "Educ": 33380, + "Education": 41183, + "Edward": 43982, + "Effect": 18610, + "Effective": 44831, + "Effects": 47738, + "Egypt": 39299, + "Eh": 43894, + "Eight": 29571, + "Either": 32478, + "El": 9527, + "Ele": 28827, + "Elect": 19453, + "Electric": 44132, + "Element": 20180, + "Elf": 46995, + "Elizabeth": 43568, + "Ell": 30639, + "Els": 45507, + "Elsa": 49050, + "Else": 40674, + "Elsewhere": 49374, + "Em": 10161, + "Email": 15333, + "Emb": 31567, + "Emer": 32779, + "Emergency": 48979, + "Emily": 48640, + "Employ": 29733, + "Empty": 40613, + "En": 4834, + "Enable": 36695, + "Enabled": 20491, + "Enc": 27195, + "End": 12915, + "Energy": 28925, + "Eng": 7936, + "Engine": 13798, + "EngineDebug": 49781, + "Engineers": 28620, + "England": 39163, + "English": 15823, + "Enh": 35476, + "Enhanced": 49026, + "Enjoy": 27467, + "Enlarge": 30952, + "Enough": 47323, + "Ent": 14539, + "Enter": 17469, + "Entity": 32398, + "Entry": 30150, + "Environment": 31441, + "Environmental": 47213, + "Ep": 13807, + "Episode": 23758, + "Equ": 23588, + "Er": 9139, + "Eric": 25004, + "Error": 12331, + "Es": 23041, + "Esc": 47051, + "Especially": 48464, + "Ess": 29508, + "Est": 22362, + "Eth": 40226, + "Euro": 14398, + "Europe": 16112, + "European": 22030, + "Ev": 15200, + "Eva": 44239, + "Even": 6104, + "Event": 9237, + "Events": 37103, + "Eventually": 28724, + "Ever": 23921, + "Every": 6109, + "Everybody": 28172, + "Everyone": 16190, + "Everything": 19693, + "Evidence": 46785, + "Evil": 48477, + "Ex": 3109, + "Exactly": 47173, + "Example": 16281, + "Examples": 27730, + "Exc": 40127, + "Excellent": 45675, + "Except": 30313, + "Exception": 16922, + "Exec": 23002, + "Executive": 43885, + "Exit": 30337, + "Exp": 16870, + "Exper": 20468, + "Experience": 44901, + "Experts": 38897, + "Expl": 18438, + "Explore": 35433, + "Export": 43834, + "Express": 38839, + "Ext": 11627, + "External": 41506, + "Extra": 27726, + "Extreme": 36716, + "Ey": 36287, + "Eye": 24876, + "F": 37, + "FA": 7708, + "FACE": 49836, + "FAQ": 42680, + "FAULT": 38865, + "FB": 26001, + "FBI": 39379, + "FC": 4851, + "FD": 26009, + "FE": 15112, + "FER": 24302, + "FF": 5777, + "FFER": 45746, + "FFFF": 29312, + "FG": 30386, + "FH": 44602, + "FI": 11674, + "FIELD": 44603, + "FIG": 16254, + "FIL": 46700, + "FILE": 25664, + "FIN": 20032, + "FINE": 29940, + "FINEST": 40236, + "FIR": 39776, + "FIX": 47084, + "FK": 26236, + "FL": 3697, + "FLAG": 38948, + "FM": 23264, + "FML": 34708, + "FN": 43221, + "FO": 6080, + "FOR": 13775, + "FORE": 30818, + "FORM": 21389, + "FORMATION": 35036, + "FOX": 47853, + "FP": 5837, + "FR": 10913, + "FREE": 39274, + "FS": 10652, + "FT": 9792, + "FTWARE": 37485, + "FU": 38989, + "FUL": 46476, + "FUN": 42296, + "FW": 24160, + "FX": 17213, + "FY": 43833, + "Fa": 50110, + "Fab": 43957, + "Fac": 47522, + "Face": 32388, + "Facebook": 12025, + "Fact": 29054, + "Factor": 41384, + "Factory": 22810, + "FactoryReloaded": 37631, + "Fail": 39044, + "Failure": 50015, + "Fair": 30099, + "Faith": 45536, + "Fake": 49233, + "Fal": 41129, + "Fall": 24750, + "False": 25101, + "Family": 24094, + "Fan": 22480, + "Fans": 36570, + "Far": 21428, + "Farm": 48412, + "Fast": 22968, + "Fat": 33804, + "Father": 34823, + "Favorite": 49434, + "Fax": 46512, + "Fe": 14304, + "Fear": 37798, + "Feature": 38816, + "Featured": 37948, + "Features": 23595, + "Feb": 15146, + "February": 21816, + "Fed": 42268, + "Federal": 24099, + "Feed": 18332, + "Feel": 35114, + "Fel": 42493, + "Female": 27273, + "Fer": 43362, + "Fest": 45139, + "Few": 32351, + "Fi": 10547, + "Field": 15878, + "Fif": 44403, + "Fig": 14989, + "Fight": 27365, + "Fighting": 46375, + "Figure": 11337, + "Fil": 11928, + "File": 8979, + "Filename": 35063, + "Files": 25876, + "Fill": 33762, + "Film": 39750, + "Filter": 22417, + "Fin": 18467, + "Final": 19006, + "Finally": 11158, + "Financial": 43621, + "Find": 16742, + "Finding": 36276, + "Fine": 34389, + "Finish": 48658, + "Fire": 13543, + "First": 5962, + "Firstly": 49709, + "Fish": 39428, + "Fit": 31805, + "Five": 20029, + "Fix": 22743, + "Fixed": 13715, + "Fl": 7414, + "Fla": 47487, + "Flag": 34227, + "Flags": 40053, + "Flash": 30670, + "Fle": 47669, + "Flickr": 47250, + "Flight": 43069, + "Flo": 33574, + "Float": 43879, + "Flor": 26953, + "Florida": 31135, + "Flow": 37535, + "Fly": 33771, + "Flying": 49095, + "Focus": 34888, + "Folder": 41092, + "Follow": 7155, + "Following": 14291, + "Font": 23252, + "FontSize": 38160, + "Food": 24602, + "Foot": 17574, + "Football": 37316, + "Footnote": 33795, + "For": 1890, + "Force": 10292, + "Ford": 37308, + "Fore": 16351, + "Foreign": 33616, + "Forest": 34605, + "Forge": 19857, + "ForgeModLoader": 24934, + "Form": 8479, + "Format": 26227, + "Former": 14282, + "Fort": 21926, + "Fortunately": 31276, + "Forward": 39746, + "Found": 21077, + "Four": 15137, + "Fourth": 45530, + "Fox": 19399, + "Fr": 6732, + "Fra": 49562, + "Frag": 42974, + "Fram": 21055, + "Frame": 19778, + "Frames": 35439, + "Frameworks": 42026, + "Fran": 38848, + "Franc": 42885, + "France": 28572, + "Frank": 17439, + "Fre": 20366, + "Fred": 30847, + "Free": 11146, + "Freedom": 38885, + "French": 24111, + "Fresh": 35857, + "Fri": 30214, + "Friday": 20610, + "Friend": 23331, + "Friends": 36705, + "From": 4863, + "Front": 25886, + "Fs": 42388, + "Fu": 41133, + "Fuck": 34094, + "Fuel": 42663, + "Full": 13295, + "Fun": 24629, + "Function": 22203, + "Fund": 24553, + "Further": 13518, + "Furthermore": 24951, + "Future": 29783, + "G": 38, + "GA": 9273, + "GAME": 47109, + "GAN": 45028, + "GB": 4579, + "GBT": 9146, + "GC": 15916, + "GD": 45113, + "GE": 8264, + "GEN": 35353, + "GER": 30373, + "GES": 48075, + "GET": 18851, + "GF": 21713, + "GG": 11190, + "GGGG": 25611, + "GGGGGGGG": 40415, + "GH": 17511, + "GHz": 23741, + "GI": 18878, + "GL": 8763, + "GM": 15548, + "GMT": 49424, + "GN": 16630, + "GO": 11230, + "GOP": 44962, + "GP": 16960, + "GPU": 33346, + "GR": 10761, + "GRE": 28934, + "GREEN": 43016, + "GROUND": 46025, + "GROUP": 46846, + "GS": 14313, + "GT": 19555, + "GU": 38022, + "GUI": 40156, + "GV": 37094, + "GW": 33191, + "GY": 31212, + "Ga": 35389, + "Gab": 46079, + "Gal": 26552, + "Gall": 37122, + "Gallery": 29352, + "Gam": 34777, + "Game": 8777, + "Gameplay": 43241, + "Gamer": 33648, + "Games": 24474, + "Gaming": 45509, + "Gar": 27676, + "Gary": 33820, + "Gas": 39699, + "Gate": 22628, + "Gay": 41787, + "Gaza": 48790, + "Gb": 49017, + "Ge": 10082, + "Gear": 38141, + "Gen": 13746, + "Gender": 41394, + "Gene": 39358, + "Gener": 8645, + "General": 12218, + "Generally": 37058, + "Generic": 46189, + "Georg": 33428, + "George": 20191, + "Georgia": 41072, + "Ger": 38069, + "German": 16010, + "Germany": 27079, + "Get": 3855, + "Getting": 20570, + "Getty": 6633, + "Gh": 41126, + "Ghost": 32001, + "Gi": 33704, + "Gil": 40747, + "Girl": 24151, + "Girls": 41044, + "Give": 23318, + "Given": 15056, + "Giving": 49701, + "Gl": 9861, + "Glass": 47698, + "Global": 22289, + "Go": 5247, + "Goal": 49045, + "God": 13482, + "Going": 27404, + "Gold": 13306, + "GoldMagikarp": 42202, + "Golden": 32378, + "Good": 10248, + "Google": 11708, + "Gordon": 47073, + "Got": 30074, + "Gov": 23774, + "Govern": 29168, + "Government": 28848, + "Gr": 8642, + "Gra": 46971, + "Grab": 48400, + "Grad": 42731, + "Grade": 42233, + "Graham": 45821, + "Grand": 23581, + "Grant": 45431, + "Graph": 37065, + "Graphics": 18172, + "Gray": 46130, + "Gre": 43887, + "Great": 13681, + "Greek": 44059, + "Green": 13719, + "Greg": 25025, + "Grey": 49141, + "Grid": 41339, + "Gro": 42921, + "Ground": 35539, + "Group": 13247, + "Growing": 43964, + "Gs": 33884, + "Gu": 8205, + "Guard": 24502, + "Guest": 42481, + "Guide": 47889, + "Gun": 22993, + "Guy": 31080, + "Gy": 44802, + "H": 39, + "HA": 7801, + "HAEL": 47452, + "HAHA": 21271, + "HAHAHAHA": 39021, + "HAM": 33363, + "HB": 32886, + "HC": 16045, + "HCR": 43230, + "HD": 10227, + "HE": 13909, + "HEAD": 37682, + "HER": 16879, + "HF": 29567, + "HH": 16768, + "HHHH": 41100, + "HI": 25374, + "HK": 38730, + "HL": 6581, + "HM": 36905, + "HO": 32298, + "HOME": 39069, + "HOU": 46685, + "HOW": 37181, + "HP": 14082, + "HQ": 41275, + "HR": 17184, + "HS": 7998, + "HT": 6535, + "HTML": 28656, + "HTTP": 40717, + "HUD": 28410, + "HY": 42598, + "Ha": 23303, + "Hack": 32833, + "Had": 25383, + "Hal": 40202, + "Half": 31305, + "Hall": 34194, + "Ham": 21281, + "Hamilton": 45405, + "Han": 29919, + "Hand": 12885, + "Handle": 37508, + "Handler": 25060, + "Happy": 25082, + "Har": 13587, + "Hard": 17309, + "Hardware": 49865, + "Harris": 41589, + "Harry": 18308, + "Hart": 44719, + "Has": 19242, + "Hash": 26257, + "Hat": 40483, + "Haunted": 46979, + "Have": 11980, + "Having": 14698, + "Haw": 33055, + "Hay": 31306, + "He": 1544, + "Head": 13847, + "Header": 39681, + "Health": 18081, + "Heart": 28541, + "Heat": 39596, + "Heavy": 33210, + "Height": 23106, + "Hel": 12621, + "Hell": 28254, + "Hello": 15496, + "Help": 22087, + "Helper": 47429, + "Hen": 26055, + "Henry": 32476, + "Her": 9360, + "Here": 4342, + "Herm": 48523, + "Hero": 30411, + "Hey": 10814, + "Hi": 17250, + "Hidden": 41691, + "Hide": 38518, + "Hig": 36124, + "High": 11922, + "Higher": 48708, + "Hill": 36369, + "Hillary": 20397, + "His": 6653, + "Hispanic": 43830, + "Hist": 13749, + "History": 18122, + "Hit": 17889, + "Hmm": 44217, + "Ho": 28900, + "Hol": 28115, + "Hold": 26807, + "Holy": 33336, + "Hom": 28718, + "Home": 16060, + "Hon": 29478, + "Honest": 37411, + "Honestly": 40817, + "Hong": 48559, + "Hop": 23483, + "Hope": 34456, + "Hopefully": 32365, + "Hor": 27991, + "Host": 17932, + "Hot": 21352, + "Hour": 43223, + "Hours": 39792, + "House": 18102, + "Houston": 33387, + "How": 2437, + "Howard": 32434, + "However": 4864, + "Http": 43481, + "Hu": 38202, + "Hub": 16066, + "Hug": 48098, + "Huh": 46010, + "Hum": 32661, + "Human": 20490, + "Hun": 25117, + "Hundreds": 38150, + "Hung": 39505, + "Hunt": 47663, + "Hunter": 38803, + "Hur": 42633, + "Hy": 21217, + "Hyd": 40436, + "Hyp": 49926, + "Hyper": 38197, + "Hz": 7399, + "I": 40, + "IA": 3539, + "IAL": 12576, + "IAN": 16868, + "IAS": 43429, + "IB": 9865, + "IBLE": 34563, + "IC": 2149, + "ICA": 25241, + "ICAL": 20151, + "ICAN": 42710, + "ICE": 8476, + "ICES": 34444, + "ICH": 20739, + "ICK": 11860, + "ICLE": 31419, + "ICO": 22707, + "ICS": 19505, + "ICT": 18379, + "ID": 2389, + "IDA": 41957, + "IDE": 14114, + "IDENT": 25256, + "IDER": 41237, + "IDES": 42538, + "IDS": 14255, + "IDs": 47954, + "IE": 10008, + "IED": 19767, + "IELD": 49979, + "IENCE": 42589, + "IENT": 28495, + "IER": 38311, + "IES": 11015, + "IF": 5064, + "IFA": 19071, + "IFE": 29150, + "IFF": 29267, + "IFIC": 30643, + "IFIED": 28343, + "IFT": 32297, + "IG": 3528, + "IGH": 18060, + "IGHT": 9947, + "IGHTS": 34874, + "IGN": 16284, + "II": 3978, + "III": 10855, + "IJ": 23852, + "IK": 18694, + "IL": 4146, + "ILA": 47164, + "ILD": 26761, + "ILE": 41119, + "ILL": 8267, + "ILLE": 33844, + "ILS": 45484, + "ILY": 33340, + "IM": 3955, + "IME": 12789, + "IN": 1268, + "INA": 28893, + "INAL": 17961, + "INC": 30158, + "IND": 12115, + "INE": 8881, + "INESS": 44180, + "INFO": 10778, + "ING": 2751, + "INGS": 20754, + "INGTON": 17480, + "INK": 17248, + "INO": 46016, + "INS": 20913, + "INST": 38604, + "INT": 12394, + "INTER": 41358, + "INTON": 46812, + "IO": 9399, + "ION": 2849, + "IONS": 11053, + "IOR": 41254, + "IP": 4061, + "IPP": 31444, + "IPS": 47643, + "IQ": 33866, + "IR": 4663, + "IRC": 49060, + "IRD": 46833, + "IRE": 41736, + "IRED": 37819, + "IRO": 43708, + "IRT": 48771, + "IS": 1797, + "ISA": 22312, + "ISC": 37719, + "ISE": 24352, + "ISH": 18422, + "ISION": 42446, + "ISIS": 29322, + "ISM": 31125, + "ISO": 40734, + "ISON": 39960, + "ISS": 16744, + "ISSION": 40373, + "IST": 8808, + "ISTER": 41517, + "ISTORY": 42480, + "IT": 2043, + "ITAL": 40579, + "ITCH": 31949, + "ITE": 12709, + "ITED": 22061, + "ITH": 10554, + "ITIES": 30383, + "ITION": 17941, + "ITNESS": 46144, + "ITS": 29722, + "ITT": 22470, + "ITY": 9050, + "IU": 44958, + "IUM": 41796, + "IV": 3824, + "IVE": 9306, + "IVER": 38757, + "IVERS": 30194, + "IVES": 42472, + "IX": 10426, + "IZ": 14887, + "IZE": 35400, + "Ian": 37776, + "Ice": 23709, + "Icon": 19578, + "Id": 7390, + "Ide": 41452, + "Ident": 33234, + "If": 1532, + "Ign": 32916, + "Il": 33666, + "Ill": 21478, + "Im": 3546, + "Image": 5159, + "Images": 29398, + "Imagine": 25153, + "Imm": 24675, + "Imp": 26950, + "Impl": 29710, + "Import": 20939, + "Important": 33796, + "Impro": 23028, + "Improve": 47531, + "Improved": 35453, + "In": 818, + "Inc": 25517, + "Includes": 42986, + "Incre": 15562, + "Increase": 46890, + "Increased": 40281, + "Increases": 28544, + "Ind": 5497, + "Indeed": 17854, + "Independent": 40566, + "Index": 15732, + "India": 21569, + "Indian": 30821, + "Indiana": 49153, + "Individual": 35392, + "Indust": 35848, + "Inf": 18943, + "Info": 12360, + "Information": 21918, + "Ing": 27682, + "Ingredients": 41222, + "Init": 31768, + "Initial": 24243, + "Initialized": 28500, + "Initially": 40443, + "Input": 20560, + "Ins": 20376, + "Insert": 44402, + "Inside": 24441, + "Insp": 41502, + "Inst": 6310, + "Install": 15798, + "Installation": 30838, + "Instance": 33384, + "Instant": 49933, + "Instead": 13193, + "InstoreAndOnline": 40241, + "Instruct": 43993, + "Int": 5317, + "Integ": 34500, + "Integer": 46541, + "Intel": 24123, + "Inter": 9492, + "Interest": 19302, + "Interested": 48860, + "Interestingly": 33092, + "Interface": 39317, + "Intern": 15865, + "Internal": 37693, + "International": 24274, + "Internet": 28566, + "Interstitial": 29447, + "Interview": 39945, + "Introdu": 15005, + "Introduced": 37143, + "Introduction": 21906, + "Inv": 19904, + "Invalid": 44651, + "Invest": 19070, + "Investigators": 33528, + "Iowa": 45186, + "Ir": 23820, + "Iran": 23798, + "Iraq": 31206, + "Ire": 48505, + "Ireland": 49752, + "Irish": 43293, + "Iron": 22797, + "Ironically": 44850, + "Is": 3792, + "Isa": 39443, + "Islam": 16991, + "Islamic": 26723, + "Isn": 41451, + "Israel": 14040, + "Israeli": 29818, + "Iss": 27738, + "Issue": 45147, + "It": 1026, + "Italian": 45696, + "Italy": 45001, + "Item": 7449, + "ItemImage": 25502, + "ItemThumbnailImage": 39177, + "ItemTracker": 47198, + "Items": 23022, + "Iter": 29993, + "Iterator": 37787, + "Its": 20459, + "Iv": 45766, + "J": 41, + "JA": 37048, + "JB": 47858, + "JC": 34382, + "JD": 37882, + "JECT": 23680, + "JJ": 32178, + "JM": 50229, + "JO": 45006, + "JOHN": 47118, + "JP": 12889, + "JR": 44817, + "JS": 20120, + "JSON": 40386, + "JUST": 25008, + "JV": 41697, + "Ja": 33186, + "Jac": 28821, + "Jack": 14295, + "Jackson": 31270, + "Jacob": 46751, + "Jake": 43930, + "Jam": 30380, + "James": 14731, + "Jamie": 48337, + "Jan": 12128, + "Jane": 41083, + "January": 21339, + "Japan": 16504, + "Japanese": 25324, + "Jar": 47511, + "Jason": 26497, + "Java": 29584, + "Jay": 30568, + "Je": 40932, + "Jean": 38248, + "Jeff": 19139, + "Jen": 44875, + "Jenn": 35994, + "Jennifer": 43187, + "Jer": 36134, + "Jere": 31579, + "Jeremy": 35623, + "Jerry": 43462, + "Jes": 22290, + "Jess": 34648, + "Jessica": 45572, + "Jesus": 28219, + "Jet": 42273, + "Jew": 23119, + "Jewish": 28240, + "Jews": 47415, + "Jim": 18050, + "Jimmy": 40335, + "Jo": 9908, + "Job": 33308, + "Joe": 19585, + "John": 7554, + "Johnny": 44960, + "Johnson": 25378, + "Join": 18234, + "Joined": 24363, + "Jon": 18219, + "Jonathan": 30365, + "Jones": 25784, + "Jordan": 34522, + "Jose": 23409, + "Joseph": 29458, + "Josh": 23808, + "Joshua": 47740, + "Journal": 25296, + "Joy": 41338, + "Jr": 50123, + "Js": 49044, + "Ju": 33018, + "Jud": 26141, + "Judge": 29511, + "Jul": 16980, + "July": 16157, + "Jump": 36046, + "Jun": 22396, + "June": 15749, + "Just": 5703, + "Justice": 28447, + "Justin": 33229, + "K": 42, + "KA": 25123, + "KB": 22764, + "KC": 36222, + "KE": 7336, + "KEN": 43959, + "KER": 42839, + "KEY": 20373, + "KI": 37845, + "KING": 37286, + "KK": 16601, + "KN": 29132, + "KNOWN": 44706, + "KO": 22328, + "KR": 30758, + "KS": 27015, + "KT": 42176, + "KY": 31159, + "Ka": 37281, + "Kal": 41428, + "Kansas": 43451, + "Kar": 37753, + "Karl": 46063, + "Kat": 25881, + "Kate": 45087, + "Kay": 37247, + "Ke": 8896, + "Keefe": 48122, + "Keep": 15597, + "Keeping": 44815, + "Keith": 46868, + "Kelly": 34831, + "Ken": 27827, + "Kenn": 39324, + "Kent": 42265, + "Kevin": 23865, + "Key": 9218, + "Keys": 40729, + "Kh": 33155, + "Kick": 45390, + "Kid": 48374, + "Kids": 40229, + "Kill": 27100, + "Kim": 26374, + "Kin": 49681, + "Kind": 35854, + "King": 15708, + "Kings": 42912, + "Kit": 20827, + "Kn": 25095, + "Knight": 44242, + "Know": 23812, + "Knowing": 45648, + "Known": 29870, + "Ko": 48735, + "Krist": 40756, + "Ku": 41733, + "Ky": 30630, + "Kyle": 42516, + "L": 43, + "LA": 13534, + "LAB": 48780, + "LAN": 25697, + "LAND": 28182, + "LB": 30501, + "LC": 5639, + "LCS": 29814, + "LD": 11163, + "LE": 2538, + "LEASE": 22781, + "LECT": 16779, + "LED": 30465, + "LER": 39878, + "LES": 28378, + "LESS": 48481, + "LET": 28882, + "LEY": 25173, + "LG": 41257, + "LGBT": 37701, + "LI": 31271, + "LIB": 40347, + "LIN": 34509, + "LINE": 24027, + "LIST": 45849, + "LL": 3069, + "LLOW": 44765, + "LM": 31288, + "LO": 21982, + "LOAD": 35613, + "LOC": 29701, + "LOCK": 36840, + "LOD": 38543, + "LOG": 25294, + "LOS": 45376, + "LP": 19930, + "LR": 35972, + "LS": 6561, + "LT": 27734, + "LU": 41596, + "LV": 30976, + "LY": 11319, + "La": 14772, + "Lab": 17822, + "Label": 33986, + "Labor": 42230, + "Labour": 32475, + "Lady": 38887, + "Lago": 48694, + "Lair": 40041, + "Lake": 43035, + "Land": 22342, + "Language": 32065, + "Large": 21968, + "Larry": 42918, + "Las": 46898, + "Last": 5956, + "Lastly": 37511, + "Lat": 24220, + "Late": 26302, + "Later": 18602, + "Latest": 39478, + "Latin": 49022, + "Laughs": 34610, + "Laun": 46182, + "Launch": 38296, + "Laura": 43687, + "Law": 16966, + "Lay": 23763, + "Layer": 49925, + "Layout": 32517, + "Le": 3123, + "Lead": 20451, + "Leader": 45009, + "League": 24623, + "Leaks": 17874, + "Lean": 35806, + "Lear": 14961, + "Learn": 20238, + "Learning": 41730, + "Leary": 48487, + "Leave": 35087, + "Led": 42416, + "Lee": 24338, + "Left": 18819, + "Leg": 11484, + "Legal": 38263, + "Legend": 21351, + "Legendary": 24524, + "Len": 30659, + "Length": 24539, + "Lenin": 49036, + "Lens": 49479, + "Leod": 44559, + "Leon": 36185, + "Les": 35882, + "Less": 22058, + "Let": 5756, + "Letter": 45708, + "Lev": 32163, + "Level": 4971, + "Lew": 33450, + "Lewis": 40330, + "Lex": 45117, + "Li": 32304, + "Lib": 25835, + "Liber": 31199, + "Liberal": 46650, + "Library": 23377, + "Lic": 26656, + "License": 34156, + "Lie": 47918, + "Life": 14662, + "Light": 15047, + "Like": 7594, + "Likewise": 45872, + "Lim": 19352, + "Limit": 39184, + "Limited": 37214, + "Lin": 14993, + "Lind": 43410, + "Line": 13949, + "Link": 11280, + "LinkedIn": 40574, + "Links": 31815, + "Linux": 19314, + "Liquid": 41966, + "Lisa": 44203, + "List": 8053, + "Listen": 23061, + "Listener": 33252, + "Liter": 43460, + "Little": 22253, + "Live": 18947, + "Liverpool": 44232, + "Living": 36376, + "Lo": 27654, + "Load": 8912, + "Loader": 17401, + "Loading": 19031, + "Loc": 33711, + "Local": 14565, + "Located": 43525, + "Location": 14749, + "Lock": 25392, + "Log": 11187, + "Login": 47790, + "London": 23421, + "Long": 14617, + "Look": 8567, + "Looking": 15784, + "Looks": 41102, + "Loop": 39516, + "Lord": 22438, + "Los": 28903, + "Lost": 31042, + "Lot": 48601, + "Lots": 43643, + "Lou": 24016, + "Louis": 32117, + "Love": 18565, + "Low": 20535, + "Lower": 31426, + "Lt": 49578, + "Lu": 25596, + "Lua": 36127, + "Luc": 22946, + "Luck": 35498, + "Luckily": 42332, + "Luke": 30730, + "Lv": 29507, + "Ly": 31633, + "Lyn": 37207, + "M": 44, + "MA": 5673, + "MAC": 44721, + "MAG": 45820, + "MAL": 42126, + "MAN": 10725, + "MAP": 33767, + "MAR": 40569, + "MAS": 31180, + "MAT": 41636, + "MAX": 22921, + "MB": 10744, + "MC": 9655, + "MD": 12740, + "ME": 11682, + "MED": 30733, + "MEN": 49275, + "MENT": 10979, + "MENTS": 28957, + "MER": 29296, + "MET": 47123, + "METHOD": 49273, + "MF": 49800, + "MG": 20474, + "MH": 36208, + "MHz": 25983, + "MI": 8895, + "MIC": 49884, + "MIN": 23678, + "MIT": 36393, + "MJ": 43421, + "MK": 33907, + "ML": 5805, + "MM": 12038, + "MN": 39764, + "MO": 11770, + "MOD": 33365, + "MODE": 49058, + "MON": 27857, + "MORE": 23346, + "MP": 7378, + "MQ": 49215, + "MR": 13599, + "MRI": 40952, + "MS": 5653, + "MSN": 30295, + "MT": 13752, + "MU": 42422, + "MW": 14326, + "MX": 43243, + "MY": 26708, + "Ma": 21467, + "Mac": 14155, + "Mach": 49999, + "Machine": 37573, + "Mad": 18454, + "Made": 24616, + "Madison": 46845, + "Mag": 13436, + "Magazine": 36028, + "Magic": 22975, + "Magikarp": 41538, + "Magn": 48017, + "Mah": 40936, + "Mail": 25804, + "Main": 13383, + "Major": 24206, + "Make": 12050, + "Maker": 48890, + "Making": 23874, + "Mal": 15029, + "Male": 25486, + "Malley": 33776, + "Man": 5124, + "Management": 48032, + "Manager": 13511, + "Manchester": 40744, + "Mand": 49846, + "Mania": 45844, + "Manufact": 44445, + "Many": 7085, + "Map": 13912, + "Maps": 47010, + "Mar": 7676, + "Marc": 22697, + "March": 16192, + "Marco": 37179, + "Marcus": 35110, + "Marg": 24428, + "Marginal": 36003, + "Maria": 46827, + "Marie": 44507, + "Mario": 42315, + "Mark": 9704, + "Market": 27470, + "Mars": 43725, + "Marsh": 41984, + "Mart": 13143, + "Martin": 24778, + "Marvel": 38864, + "Marx": 45258, + "Mary": 24119, + "Mas": 38224, + "Mask": 45195, + "Mass": 20273, + "Master": 18254, + "Mat": 19044, + "Match": 23850, + "Material": 17518, + "Materials": 41657, + "Math": 37372, + "Matrix": 46912, + "Matt": 13448, + "Matthew": 25372, + "Max": 11518, + "Maximum": 40541, + "May": 6747, + "Maybe": 13300, + "Mayor": 37396, + "Mbps": 47842, + "Mc": 9742, + "McC": 30464, + "Me": 5308, + "Meanwhile": 10294, + "Measure": 47384, + "Meat": 35620, + "Mech": 28452, + "Med": 9921, + "Media": 13152, + "Medic": 39112, + "Medical": 37158, + "Medium": 31205, + "Meet": 29318, + "Meg": 42672, + "Mega": 43471, + "Mel": 21102, + "Mem": 13579, + "Member": 27608, + "Members": 25341, + "Memory": 30871, + "Men": 10418, + "Menu": 23381, + "Mer": 13102, + "Merc": 42981, + "Merit": 21583, + "Mesh": 37031, + "Mess": 36479, + "Message": 12837, + "Met": 9171, + "Meta": 48526, + "Metal": 36790, + "Method": 17410, + "Methods": 46202, + "Metro": 45141, + "Mex": 24670, + "Mexico": 33006, + "Mi": 41541, + "Miami": 41191, + "Mic": 25437, + "Mich": 11180, + "Michael": 13256, + "Michelle": 48736, + "Michigan": 40610, + "Micro": 13031, + "Microsoft": 15905, + "Mid": 22622, + "Middle": 34621, + "Mike": 16073, + "Mil": 24857, + "Military": 37837, + "Mill": 22603, + "Miller": 33253, + "Min": 9452, + "Mind": 28478, + "Mine": 24461, + "Minecraft": 39194, + "Mini": 39234, + "Minimum": 44046, + "Minnesota": 45670, + "Minor": 39825, + "Mir": 27453, + "Mis": 31281, + "Miss": 17140, + "Missing": 43730, + "Mission": 37057, + "Mist": 49370, + "Mit": 43339, + "Mix": 35608, + "Mo": 16632, + "Mob": 44702, + "Mobil": 47100, + "Mobile": 17066, + "Mod": 5841, + "ModLoader": 24847, + "Mode": 19076, + "Model": 17633, + "Modern": 31439, + "Mods": 24239, + "Module": 26796, + "Moh": 38443, + "Mom": 29252, + "Mon": 9069, + "Monday": 23810, + "Money": 26788, + "Monitor": 35479, + "Monster": 40872, + "Mont": 26031, + "Month": 31948, + "Moon": 31640, + "Moore": 40049, + "Mor": 20044, + "More": 5167, + "Moreover": 24606, + "Morgan": 47184, + "Morning": 42997, + "Mos": 32668, + "Moscow": 49757, + "Most": 6943, + "Mot": 47733, + "Mother": 31398, + "Motion": 45740, + "Motor": 34919, + "Mount": 35452, + "Mouse": 39643, + "Move": 21774, + "Movie": 25097, + "Moving": 33622, + "Mp": 28861, + "MpServer": 31765, + "Mr": 5246, + "Mrs": 27034, + "Ms": 10128, + "Msg": 50108, + "Mu": 33239, + "Much": 20045, + "Mult": 15205, + "Multi": 29800, + "Multiple": 31217, + "Mur": 23830, + "Murray": 49998, + "Mus": 10694, + "Music": 22648, + "Muslim": 17067, + "Muslims": 36452, + "Must": 34320, + "Mut": 41603, + "My": 3666, + "Myth": 41444, + "N": 45, + "NA": 4535, + "NAME": 20608, + "NAS": 18293, + "NASA": 29998, + "NAT": 34259, + "NB": 32819, + "NBA": 32470, + "NBC": 13175, + "NC": 7792, + "ND": 8575, + "NE": 12161, + "NECT": 48842, + "NER": 21479, + "NES": 37379, + "NESS": 31097, + "NET": 12884, + "NEW": 13965, + "NEWS": 49597, + "NEY": 36231, + "NF": 21870, + "NFL": 32078, + "NG": 10503, + "NH": 33863, + "NI": 22125, + "NING": 15871, + "NJ": 41074, + "NK": 46888, + "NL": 32572, + "NM": 32755, + "NN": 6144, + "NO": 15285, + "NOR": 35510, + "NOT": 11929, + "NOTE": 16580, + "NOW": 45669, + "NP": 22182, + "NPR": 38588, + "NR": 24723, + "NRS": 41256, + "NS": 8035, + "NSA": 47549, + "NT": 11251, + "NULL": 33991, + "NUM": 41359, + "NV": 27159, + "NVIDIA": 38021, + "NW": 27605, + "NY": 12805, + "NYSE": 49430, + "NZ": 37371, + "Na": 26705, + "Name": 5376, + "Names": 36690, + "Nap": 49799, + "Nar": 40059, + "Narr": 45750, + "Nat": 47849, + "Nation": 46108, + "National": 16186, + "Native": 31272, + "Natural": 35364, + "Naturally": 44213, + "Nature": 46934, + "Nav": 30575, + "Naz": 37235, + "Nazi": 31343, + "Nazis": 44527, + "Ne": 8199, + "Neal": 40581, + "Near": 40640, + "Nearly": 27927, + "Need": 23037, + "Neg": 32863, + "Neigh": 46445, + "Neil": 29354, + "Neill": 26538, + "Neither": 27270, + "Net": 7934, + "NetMessage": 25193, + "Netflix": 42826, + "Network": 26245, + "Nev": 43555, + "Never": 12295, + "Nevertheless": 29011, + "New": 3791, + "News": 9980, + "Newsletter": 33031, + "Next": 10019, + "Ni": 34153, + "Nic": 30403, + "Nice": 35284, + "Nich": 46489, + "Nick": 23609, + "Night": 24732, + "Nik": 40979, + "Nin": 36091, + "Nine": 37603, + "Nintendo": 32348, + "Nit": 33772, + "Nitrome": 42066, + "No": 2949, + "Nob": 21191, + "Nobody": 24795, + "Node": 19667, + "Non": 15419, + "None": 14202, + "Nonetheless": 43258, + "Nor": 21991, + "Norm": 35393, + "Normal": 26447, + "Normally": 43625, + "North": 14157, + "Northern": 40495, + "Not": 3673, + "Notable": 45533, + "Note": 6425, + "Notes": 16130, + "Nothing": 18465, + "Notice": 26396, + "Nov": 20795, + "November": 21159, + "Now": 3844, + "Ns": 47503, + "Null": 35067, + "Num": 33111, + "Number": 15057, + "Numbers": 49601, + "Nusra": 39294, + "Nut": 49004, + "O": 46, + "OA": 23621, + "OAD": 41048, + "OB": 9864, + "OC": 4503, + "OCK": 11290, + "OD": 3727, + "ODE": 16820, + "ODUCT": 28644, + "ODY": 33076, + "OE": 27799, + "OF": 19238, + "OFF": 27977, + "OG": 7730, + "OGR": 49656, + "OH": 12096, + "OHN": 27600, + "OIL": 49713, + "OK": 11380, + "OL": 3535, + "OLD": 15173, + "OLOG": 33462, + "OLOGY": 43781, + "OM": 2662, + "OME": 13649, + "ON": 1340, + "OND": 18672, + "ONDON": 47383, + "ONE": 11651, + "ONES": 39677, + "ONEY": 48399, + "ONG": 18494, + "ONS": 19213, + "ONSORED": 36406, + "ONT": 35830, + "ONY": 40508, + "OO": 6684, + "OOD": 22808, + "OOK": 15308, + "OOL": 31559, + "OOOO": 23803, + "OOOOOOOO": 47732, + "OP": 3185, + "OPA": 43345, + "OPE": 32135, + "OPER": 31054, + "OPLE": 34354, + "OPS": 30737, + "OR": 1581, + "ORD": 12532, + "ORE": 6965, + "ORED": 32023, + "ORGE": 49697, + "ORK": 14670, + "ORN": 30649, + "ORPG": 49665, + "ORS": 20673, + "ORT": 9863, + "ORTS": 33002, + "ORY": 15513, + "OS": 2640, + "OSE": 14058, + "OSED": 48751, + "OSH": 45704, + "OSP": 47053, + "OSS": 18420, + "OST": 10892, + "OT": 2394, + "OTA": 29009, + "OTAL": 27510, + "OTE": 23051, + "OTH": 26946, + "OTHER": 31858, + "OTO": 26631, + "OTOS": 33291, + "OTS": 33472, + "OTT": 29089, + "OTUS": 39205, + "OU": 2606, + "OUGH": 32632, + "OULD": 24010, + "OUN": 19385, + "OUND": 15919, + "OUNT": 28270, + "OUP": 27755, + "OUR": 11698, + "OURCE": 31033, + "OUS": 20958, + "OUT": 12425, + "OV": 8874, + "OVA": 41576, + "OVER": 41983, + "OW": 3913, + "OWER": 36048, + "OWN": 14165, + "OWS": 22845, + "OX": 48632, + "OY": 21414, + "Oak": 42426, + "Ob": 5944, + "Obama": 15948, + "Obj": 49201, + "Object": 10267, + "Obs": 31310, + "Obviously": 20670, + "Occ": 29223, + "Occup": 47658, + "Ocean": 46607, + "Oct": 12349, + "October": 18517, + "Of": 5189, + "Off": 9362, + "Offic": 12710, + "Office": 27743, + "Officers": 34059, + "Official": 28529, + "Officials": 25883, + "Offline": 28657, + "Offset": 34519, + "Often": 37288, + "Oh": 5812, + "Ohio": 31274, + "Oil": 44142, + "Ok": 18690, + "Okay": 16454, + "Ol": 30098, + "Old": 19620, + "On": 2202, + "Once": 7454, + "One": 3198, + "Online": 14439, + "Only": 10049, + "Ont": 45984, + "Op": 18257, + "Open": 11505, + "Opening": 43093, + "Oper": 18843, + "Operation": 32180, + "Opp": 27524, + "Ops": 41472, + "Opt": 27871, + "Option": 19722, + "Optional": 30719, + "Options": 29046, + "Or": 5574, + "Oracle": 48625, + "Orange": 40141, + "Ord": 35422, + "Order": 18743, + "Orderable": 39655, + "Ore": 41543, + "Oregon": 41243, + "Org": 46808, + "Organ": 26121, + "Orig": 11610, + "Origin": 39688, + "Original": 20556, + "Originally": 22731, + "Os": 16748, + "Other": 6395, + "Others": 25599, + "Otherwise": 48059, + "Ott": 49092, + "Our": 5122, + "Out": 7975, + "Output": 26410, + "Outside": 30815, + "Over": 5886, + "Overall": 16350, + "Override": 37961, + "Overview": 29064, + "Own": 23858, + "Owner": 42419, + "Ox": 38208, + "P": 47, + "PA": 4537, + "PAC": 44938, + "PAR": 27082, + "PART": 30709, + "PASS": 47924, + "PATH": 34219, + "PB": 49079, + "PC": 5662, + "PD": 5760, + "PDATE": 14341, + "PDATED": 49316, + "PDF": 20456, + "PE": 11401, + "PER": 18973, + "PET": 47731, + "PF": 42668, + "PG": 6968, + "PH": 11909, + "PHOTOS": 42709, + "PI": 11901, + "PIN": 44032, + "PK": 40492, + "PL": 6489, + "PLA": 45710, + "PLAY": 31519, + "PLE": 16437, + "PLIC": 31484, + "PLIED": 49094, + "PM": 5868, + "PN": 13137, + "PO": 16402, + "POL": 45472, + "POR": 44680, + "PORT": 15490, + "POS": 37997, + "POSE": 48933, + "POST": 32782, + "PP": 10246, + "PR": 4805, + "PRE": 46437, + "PRES": 48296, + "PRESS": 32761, + "PRO": 31190, + "PROV": 41283, + "PS": 3705, + "PT": 11571, + "PU": 5105, + "PUT": 30076, + "Pa": 28875, + "Pac": 18844, + "Pacific": 22933, + "Pack": 11869, + "Package": 27813, + "Pad": 26114, + "Page": 9876, + "Pages": 47798, + "Pain": 38490, + "Pak": 29675, + "Pakistan": 38485, + "Pal": 11531, + "Palest": 32570, + "Palestinian": 35969, + "Pan": 15730, + "Pand": 47206, + "Panel": 26639, + "Paper": 42950, + "Par": 10044, + "Param": 22973, + "Parameter": 36301, + "Parameters": 48944, + "Parent": 24546, + "Parents": 42969, + "Paris": 40313, + "Park": 25478, + "Parser": 46677, + "Part": 7841, + "Particip": 34363, + "Parts": 42670, + "Party": 33553, + "Pass": 14478, + "Password": 35215, + "Past": 34533, + "Pat": 12130, + "Patch": 33952, + "Path": 15235, + "Patrick": 32718, + "Pattern": 47546, + "Paul": 12041, + "Pause": 49991, + "Pay": 19197, + "Pe": 6435, + "Peace": 43445, + "Pear": 46262, + "Ped": 43468, + "Pen": 25553, + "Penn": 39899, + "People": 8061, + "Per": 5990, + "Percent": 31905, + "Perfect": 36635, + "Performance": 32273, + "Perhaps": 13710, + "Pers": 30946, + "Person": 15439, + "Personal": 30228, + "Personally": 42322, + "Pet": 25803, + "Peter": 19727, + "Pg": 31743, + "Ph": 2725, + "Phase": 35645, + "Phil": 18673, + "Philadelphia": 42349, + "Philipp": 49680, + "Phill": 41970, + "Phoenix": 36422, + "Phone": 6132, + "Phones": 32212, + "Phot": 27248, + "Photo": 6191, + "Photos": 21197, + "Phys": 43215, + "Physical": 31611, + "Pi": 38729, + "Pic": 39507, + "Pick": 31686, + "Pict": 21300, + "Picture": 28070, + "Pie": 48223, + "Pierre": 36910, + "Pin": 28348, + "Ping": 49806, + "Pink": 41912, + "Pinterest": 35767, + "Pir": 46772, + "Pitt": 47627, + "Pixel": 40809, + "Pl": 3646, + "Place": 27271, + "Plan": 20854, + "Planet": 41801, + "Platform": 37148, + "Play": 11002, + "Player": 14140, + "Players": 24860, + "Playing": 36530, + "Please": 5492, + "Plex": 46383, + "Plot": 43328, + "Plug": 23257, + "Plugin": 37233, + "Plus": 17860, + "Po": 18833, + "Pocket": 45454, + "Pod": 41565, + "Point": 12727, + "Points": 40710, + "Pokemon": 48034, + "Poké": 41386, + "Pokémon": 46602, + "Pol": 8017, + "Police": 9039, + "Policy": 36727, + "Polit": 39866, + "Political": 35443, + "Politics": 43921, + "Poll": 39176, + "Poly": 34220, + "Pont": 48039, + "Pool": 27201, + "Poor": 43920, + "Pop": 16979, + "Pope": 46172, + "Population": 45251, + "Port": 13924, + "Portland": 45330, + "Pos": 21604, + "Position": 26545, + "Post": 6307, + "Posted": 14231, + "Posts": 21496, + "Pot": 25396, + "Power": 13434, + "Pr": 6836, + "Pract": 49515, + "Pre": 6719, + "Pred": 39156, + "Pref": 36698, + "Prem": 24914, + "Premium": 36787, + "Prep": 37534, + "Pres": 25460, + "Present": 34695, + "President": 10364, + "Press": 13800, + "Pretty": 35700, + "Prev": 36854, + "Preview": 48835, + "Previous": 21448, + "Previously": 36837, + "Pri": 34487, + "Price": 18124, + "Prim": 23828, + "Primary": 35170, + "Prime": 26405, + "Prin": 47231, + "Princ": 42904, + "Prince": 35784, + "Print": 18557, + "Prior": 22442, + "Priv": 20184, + "Privacy": 48948, + "Private": 29067, + "Pro": 2964, + "Probably": 34784, + "Problem": 40781, + "Process": 18709, + "Produ": 11547, + "Product": 15667, + "Production": 35027, + "Products": 48650, + "Prof": 15404, + "Professional": 49138, + "Professor": 25031, + "Profile": 37046, + "Program": 15167, + "Progress": 32577, + "Project": 16775, + "Prom": 24129, + "Proof": 44683, + "Prop": 24331, + "Property": 21746, + "Pros": 35726, + "Prosecut": 34301, + "Prosecutors": 39401, + "Prot": 19703, + "Protect": 41426, + "Prov": 15946, + "Provider": 29495, + "Proxy": 44148, + "Ps": 12016, + "Psy": 25918, + "PsyNetMessage": 28666, + "Psych": 31923, + "Ptr": 46745, + "Pub": 14876, + "Public": 15202, + "Published": 24492, + "Publisher": 46471, + "Pull": 42940, + "Pur": 30026, + "Purchase": 47651, + "Pure": 49548, + "Push": 49222, + "Put": 11588, + "Putin": 17060, + "Putting": 46399, + "Py": 20519, + "Python": 37906, + "Q": 48, + "QB": 40291, + "QL": 9711, + "QU": 10917, + "QUEST": 35780, + "QUI": 43702, + "QUIRE": 49128, + "Qaeda": 19058, + "Qaida": 41225, + "Qu": 4507, + "Qual": 46181, + "Quality": 35013, + "Quant": 24915, + "Quantity": 31208, + "Que": 15681, + "Queen": 32466, + "Query": 20746, + "Quest": 12166, + "Question": 24361, + "Questions": 35741, + "Queue": 34991, + "Quick": 21063, + "Quite": 44959, + "Quote": 25178, + "Quotes": 23138, + "R": 49, + "RA": 3861, + "RAFT": 44700, + "RAG": 33202, + "RAL": 35296, + "RAM": 24115, + "RANT": 32506, + "RAW": 20530, + "RAY": 30631, + "RB": 27912, + "RC": 7397, + "RD": 35257, + "RE": 2200, + "READ": 15675, + "REAM": 32235, + "REC": 38827, + "RECT": 23988, + "RED": 22083, + "REDACTED": 45999, + "REE": 11587, + "REF": 31688, + "REG": 31553, + "REL": 16448, + "RELATED": 20112, + "REM": 40726, + "REP": 35316, + "RES": 19535, + "RESULTS": 46274, + "RET": 26087, + "RF": 32754, + "RFC": 41150, + "RG": 48192, + "RGB": 36982, + "RH": 48587, + "RI": 7112, + "RIC": 41132, + "RIP": 32618, + "RIPT": 46023, + "RL": 7836, + "RM": 29138, + "RN": 42336, + "RNA": 27204, + "RO": 13252, + "ROM": 33676, + "RON": 45806, + "ROR": 16411, + "RP": 20031, + "RPG": 46954, + "RR": 21095, + "RS": 6998, + "RT": 14181, + "RW": 46747, + "RY": 18276, + "Ra": 21762, + "Race": 35157, + "Rachel": 44045, + "Rad": 15546, + "Radio": 26093, + "Rah": 47135, + "Raid": 49043, + "Rail": 44631, + "Rain": 31443, + "Ram": 33754, + "Rand": 38918, + "Random": 29531, + "Range": 17257, + "Rank": 27520, + "Ranked": 36713, + "Rap": 35230, + "Rare": 26737, + "Rat": 29665, + "Rate": 32184, + "Rated": 15322, + "Rather": 27202, + "Rating": 29321, + "Raven": 49098, + "Raw": 27369, + "Ray": 19591, + "Re": 3041, + "Read": 5569, + "Reader": 33634, + "Reading": 36120, + "Ready": 35474, + "Real": 15633, + "Really": 26392, + "Reason": 45008, + "Reb": 28951, + "Rec": 6690, + "Recent": 26446, + "Recently": 24661, + "Recipe": 37523, + "Recomm": 24898, + "Recommend": 41248, + "Recommended": 36171, + "Record": 23739, + "Rect": 45474, + "Red": 7738, + "Redd": 32259, + "Reddit": 22367, + "Redditor": 34832, + "Ref": 8134, + "Refer": 46238, + "Reference": 26687, + "References": 19927, + "Reg": 8081, + "Regarding": 39424, + "Regardless": 27894, + "Region": 47371, + "Register": 38804, + "Registered": 47473, + "Registration": 47133, + "Regular": 40164, + "Reilly": 25819, + "Rel": 6892, + "Related": 9819, + "Relations": 47117, + "Release": 26362, + "Released": 45037, + "Reloaded": 36726, + "Rem": 8413, + "Remember": 16676, + "Remote": 36510, + "Remove": 27914, + "Removed": 45975, + "Ren": 26764, + "Render": 45819, + "Rep": 6207, + "Repe": 47541, + "Repeat": 40322, + "Repl": 39232, + "Reply": 36875, + "Report": 19100, + "Reporting": 42159, + "Reports": 37844, + "Represent": 40171, + "Republic": 15431, + "Republican": 25777, + "Republicans": 28455, + "Requ": 16844, + "Request": 18453, + "Required": 37374, + "Requirements": 42249, + "Requires": 39618, + "Res": 4965, + "Research": 25104, + "Researchers": 25606, + "Residents": 42347, + "Resource": 26198, + "Resources": 33236, + "Resp": 19309, + "Response": 31077, + "Rest": 19452, + "Result": 23004, + "Results": 25468, + "Ret": 9781, + "Return": 13615, + "Returns": 35561, + "Reuters": 12637, + "Rev": 18009, + "Review": 14832, + "Reviewed": 40266, + "Reviewer": 35407, + "Revolution": 50237, + "Rew": 30003, + "Reward": 48123, + "Rex": 47389, + "Rh": 38576, + "Rich": 14868, + "Richard": 22245, + "Rick": 33048, + "Right": 11028, + "Ring": 39687, + "River": 42204, + "Ro": 15450, + "Road": 29197, + "Roaming": 27352, + "Rob": 14350, + "Rober": 15924, + "Robert": 19156, + "Roberts": 45487, + "Robin": 40656, + "Rock": 19665, + "Rocket": 50218, + "Rod": 27917, + "Rog": 30417, + "Roger": 43719, + "Rogue": 48163, + "Role": 47445, + "Roll": 26869, + "Rom": 22834, + "Roman": 32454, + "Romney": 42184, + "Ron": 23672, + "Room": 41178, + "Root": 30016, + "Ros": 35740, + "Rose": 31087, + "Ross": 38328, + "Rot": 24864, + "Round": 22685, + "Route": 43401, + "Row": 25166, + "Roy": 32027, + "Royal": 41861, + "Rs": 31273, + "Ru": 40464, + "Rub": 21312, + "Ruby": 32101, + "Rule": 31929, + "Rules": 37766, + "Rum": 47127, + "Run": 10987, + "Runner": 49493, + "Running": 28768, + "Runtime": 41006, + "Rus": 35313, + "Rush": 49942, + "Russ": 10020, + "Russell": 46325, + "Russia": 16347, + "Russian": 16220, + "Rust": 49444, + "Ry": 46987, + "Ryan": 21868, + "S": 50, + "SA": 4090, + "SAM": 49302, + "SAN": 36753, + "SAY": 27358, + "SB": 16811, + "SC": 6173, + "SCP": 48956, + "SD": 10305, + "SE": 5188, + "SEA": 46887, + "SEC": 23683, + "SEE": 36078, + "SELECT": 46506, + "SER": 35009, + "SET": 28480, + "SF": 20802, + "SG": 38475, + "SH": 9693, + "SHA": 37596, + "SHARE": 42597, + "SHIP": 49423, + "SI": 11584, + "SIGN": 46224, + "SIM": 48913, + "SIZE": 33489, + "SK": 18831, + "SL": 8634, + "SM": 12310, + "SN": 15571, + "SO": 15821, + "SON": 11782, + "SOURCE": 47690, + "SP": 4303, + "SPA": 50087, + "SPEC": 48451, + "SPONSORED": 37190, + "SQL": 17861, + "SR": 12562, + "SS": 5432, + "SSL": 31127, + "ST": 2257, + "STAR": 46678, + "STAT": 35744, + "STATE": 44724, + "STD": 32147, + "STDOUT": 36886, + "STE": 30516, + "STEM": 25361, + "STEP": 42135, + "STER": 41809, + "STON": 41924, + "STR": 18601, + "STRUCT": 46126, + "SU": 12564, + "SUP": 40331, + "SW": 17887, + "SY": 23060, + "Sa": 33890, + "Sab": 39646, + "Sac": 38318, + "Sad": 26699, + "Sadly": 36725, + "Safe": 31511, + "Safety": 45372, + "Sah": 32194, + "Saharan": 40461, + "Said": 47638, + "Saint": 48615, + "Sal": 19221, + "Sales": 44490, + "Salt": 43061, + "Sam": 16305, + "Same": 30556, + "Sample": 36674, + "Samsung": 32334, + "San": 15017, + "Sand": 18471, + "Sanders": 26747, + "Santa": 42694, + "Sarah": 29284, + "Sat": 20245, + "Saturday": 19844, + "Saudi": 36939, + "Sav": 47362, + "Save": 16928, + "Sax": 41152, + "Say": 25515, + "Sc": 3351, + "Scale": 29990, + "Scan": 33351, + "Scar": 44433, + "Scene": 36542, + "Sch": 14874, + "Sche": 27054, + "School": 26130, + "Science": 26959, + "Scient": 23010, + "Scientists": 29193, + "Scope": 43642, + "Score": 26595, + "Scot": 37559, + "Scotland": 47230, + "Scott": 19040, + "Screen": 23901, + "Screenshot": 34204, + "Script": 7391, + "Scroll": 29261, + "Se": 4653, + "Sea": 37567, + "Sean": 26408, + "Search": 18243, + "Season": 18960, + "Seattle": 34007, + "Sec": 6558, + "Second": 12211, + "Secondly": 44276, + "Secret": 23725, + "Secretary": 38541, + "Section": 16375, + "Secure": 49793, + "Security": 24074, + "See": 6214, + "Seeing": 36314, + "Seg": 41030, + "Sel": 48767, + "Select": 17563, + "Self": 24704, + "Sem": 13900, + "Semitic": 28753, + "Semitism": 25406, + "Sen": 10445, + "Senate": 32998, + "Senator": 29774, + "Send": 25206, + "Senior": 31224, + "Sense": 41166, + "Sensor": 47864, + "Sent": 31837, + "Sep": 19117, + "Sept": 14635, + "September": 17543, + "Sequ": 44015, + "Ser": 7089, + "Serial": 32634, + "Series": 27996, + "Seriously": 42338, + "Serv": 11838, + "Server": 10697, + "Service": 16177, + "Services": 31007, + "Session": 36044, + "Set": 7248, + "Setting": 34149, + "Settings": 26232, + "Setup": 40786, + "Seven": 31334, + "Several": 14945, + "Sex": 23398, + "Sexual": 49161, + "Sh": 2484, + "Shadow": 27447, + "Sham": 43478, + "Shape": 33383, + "Shar": 40201, + "Share": 11649, + "Shares": 43566, + "Sharp": 44336, + "She": 3347, + "Shell": 23248, + "Sher": 28782, + "Shield": 33651, + "Shift": 33377, + "Shin": 44592, + "Ship": 25586, + "Shipping": 45169, + "Shock": 31646, + "Shop": 29917, + "Short": 16438, + "Shortly": 30513, + "Shot": 28512, + "Should": 19926, + "Show": 15307, + "Shut": 39079, + "Si": 42801, + "Side": 24819, + "Sign": 11712, + "Sil": 15086, + "Silver": 26766, + "Sim": 8890, + "Similar": 18925, + "Similarly": 28039, + "Simon": 35475, + "Simple": 26437, + "Simply": 35596, + "Sin": 46200, + "Since": 6385, + "Sing": 29974, + "Single": 28008, + "Sir": 22788, + "Sit": 46655, + "Site": 29123, + "Six": 21447, + "Size": 10699, + "Sk": 15739, + "Skill": 35040, + "Skin": 42455, + "Skip": 50232, + "Sky": 22308, + "Sl": 11122, + "Sleep": 40555, + "Slot": 38963, + "Slow": 36423, + "Sm": 7556, + "Small": 18712, + "Smart": 25610, + "Smith": 17919, + "Sn": 16501, + "Snake": 49795, + "Snap": 43826, + "Snow": 28974, + "So": 2396, + "Soc": 37949, + "Social": 20636, + "Socket": 39105, + "Soft": 18380, + "Software": 25423, + "Sol": 36949, + "Solar": 38825, + "Sold": 33873, + "Solid": 46933, + "Solution": 46344, + "Some": 4366, + "Someone": 28211, + "Something": 22210, + "Sometimes": 15468, + "Son": 31056, + "Song": 44241, + "Sony": 32895, + "Soon": 28093, + "Sorry": 14385, + "Sort": 42758, + "Soul": 36315, + "Sound": 21369, + "Sounds": 40825, + "Source": 7416, + "SourceFile": 37226, + "Sources": 21188, + "South": 14942, + "Southern": 44993, + "Sov": 38574, + "Soviet": 40408, + "Sp": 4561, + "Space": 14106, + "SpaceEngineers": 31032, + "Spain": 45355, + "Spanish": 43584, + "Spawn": 49855, + "Spe": 5248, + "Speaking": 13887, + "Spec": 22882, + "Special": 13409, + "Specific": 32419, + "Specifically": 48379, + "Spect": 49738, + "Speed": 22785, + "Spell": 31221, + "Sphere": 38882, + "Spider": 41294, + "Spirit": 41910, + "Spl": 26568, + "Split": 41205, + "Spoiler": 31895, + "Spons": 43522, + "Sport": 42576, + "Sports": 18153, + "Spot": 32565, + "Spr": 38454, + "Spread": 44458, + "Spring": 30387, + "Squ": 22266, + "Square": 48011, + "St": 1273, + "Stack": 25896, + "Staff": 31449, + "Stage": 29391, + "Stan": 32140, + "Stand": 15480, + "Standard": 23615, + "Standing": 44196, + "Star": 8248, + "Stars": 29366, + "Start": 10434, + "Starting": 22851, + "Stat": 17126, + "State": 9012, + "Statement": 48682, + "States": 42237, + "Static": 45442, + "Station": 12367, + "Statistics": 48346, + "Stats": 29668, + "Status": 19580, + "Stay": 25681, + "Ste": 7447, + "Steam": 19109, + "Steel": 39807, + "Step": 8600, + "Stephen": 24920, + "Steve": 19206, + "Steven": 28292, + "Stew": 49328, + "Still": 9590, + "Stock": 26207, + "Stone": 34346, + "Stop": 19485, + "Storage": 31425, + "Store": 22658, + "Storm": 32173, + "Story": 11605, + "Str": 13290, + "Stra": 41347, + "Strange": 38114, + "Stre": 30611, + "Stream": 12124, + "Streamer": 28696, + "StreamerBot": 37574, + "Street": 34356, + "Strength": 45027, + "Stretch": 39181, + "Strike": 31584, + "String": 10100, + "Strong": 33004, + "Struct": 44909, + "Stud": 13007, + "Student": 38778, + "Students": 28239, + "Studies": 45833, + "Studio": 41501, + "Study": 39841, + "Sty": 18716, + "Style": 21466, + "Su": 5606, + "Sub": 7004, + "Subject": 19776, + "Submit": 45135, + "Subscribe": 27125, + "Success": 33244, + "Such": 16678, + "Suddenly": 38582, + "Suggest": 43857, + "Sullivan": 47572, + "Sum": 13065, + "Summary": 22093, + "Summer": 33560, + "Sun": 16012, + "Sund": 20602, + "Sunday": 21934, + "Sup": 40784, + "Super": 12442, + "Supp": 15979, + "Supplement": 42615, + "Support": 15514, + "Supported": 48181, + "Supporters": 49422, + "Sur": 14214, + "Sure": 19457, + "Surv": 34652, + "Sus": 30746, + "Susan": 45842, + "Sw": 10462, + "Swe": 40783, + "Sweet": 36087, + "Switch": 38978, + "Sword": 43117, + "Sy": 13940, + "Sym": 43094, + "Syn": 29934, + "Sync": 28985, + "Synopsis": 49771, + "Syria": 40029, + "Syrian": 42747, + "Sys": 44387, + "System": 11964, + "T": 51, + "TA": 5603, + "TABLE": 38148, + "TAG": 42197, + "TAIN": 30339, + "TB": 22737, + "TC": 4825, + "TD": 21016, + "TE": 9328, + "TED": 36493, + "TER": 5781, + "TERN": 31800, + "TEXT": 32541, + "TEXTURE": 47648, + "TF": 10234, + "TG": 35990, + "TH": 4221, + "THE": 10970, + "THER": 21250, + "THING": 39356, + "THIS": 43559, + "TI": 25621, + "TIME": 34694, + "TING": 48996, + "TION": 24131, + "TIT": 49560, + "TL": 14990, + "TM": 15972, + "TN": 46559, + "TO": 10468, + "TON": 11357, + "TOP": 35222, + "TOR": 32961, + "TP": 7250, + "TPP": 31435, + "TPPStreamerBot": 37579, + "TPS": 28820, + "TR": 5446, + "TRUMP": 42473, + "TRY": 40405, + "TS": 4694, + "TT": 15751, + "TV": 6849, + "TW": 34551, + "TX": 29551, + "TY": 9936, + "TYPE": 25216, + "Ta": 38586, + "Tab": 33349, + "Table": 10962, + "Tact": 45803, + "Tag": 24835, + "Tags": 36142, + "Tai": 47976, + "Take": 12322, + "Taking": 26556, + "Tal": 31466, + "Talk": 25685, + "Talking": 45904, + "Tam": 42061, + "Tan": 45557, + "Tang": 43909, + "Tank": 32978, + "Tap": 45081, + "Tar": 47079, + "Target": 21745, + "Task": 25714, + "Tax": 27017, + "Taylor": 29907, + "Te": 6767, + "TeX": 49568, + "Tea": 49770, + "Team": 15592, + "Tech": 17760, + "Techn": 25574, + "Technical": 45638, + "Technology": 44893, + "Ted": 38972, + "Teen": 45639, + "Tel": 33317, + "Tele": 31709, + "Tell": 24446, + "Tem": 12966, + "Temp": 30782, + "Temperature": 42492, + "Template": 30800, + "Ten": 24893, + "Tenn": 43139, + "Ter": 15156, + "Term": 40596, + "Termin": 44798, + "Terror": 40194, + "Terry": 50241, + "Tes": 36504, + "Tesla": 41351, + "Test": 14402, + "Testing": 44154, + "Tex": 17005, + "Texas": 21607, + "Text": 8206, + "TextColor": 42470, + "Texture": 32742, + "Textures": 39860, + "Th": 817, + "Thank": 10449, + "Thankfully": 48387, + "Thanks": 9690, + "That": 2504, + "The": 464, + "Their": 14574, + "Theme": 47863, + "Then": 6423, + "Ther": 35048, + "There": 1858, + "Therefore": 26583, + "These": 4711, + "They": 2990, + "Things": 22248, + "Think": 22073, + "Third": 22747, + "Thirty": 38856, + "This": 1212, + "Thom": 37582, + "Thomas": 22405, + "Thompson": 48942, + "Thor": 46765, + "Those": 9627, + "Though": 10915, + "Thousands": 37482, + "Thread": 16818, + "Three": 12510, + "Through": 15046, + "Throughout": 26797, + "Throw": 39431, + "Thu": 39902, + "Thumbnail": 35523, + "ThumbnailImage": 39142, + "Thunder": 45713, + "Thursday": 25381, + "Thus": 19093, + "Ti": 40533, + "Tickets": 43254, + "Tier": 35252, + "Tile": 35103, + "Tim": 14967, + "Time": 7575, + "Timeout": 48031, + "Timer": 48801, + "Times": 28595, + "Tip": 28434, + "Tips": 43368, + "Title": 19160, + "To": 2514, + "Today": 8888, + "Todd": 42817, + "Together": 41631, + "Tok": 19042, + "Token": 30642, + "Tokens": 22906, + "Tom": 13787, + "Tomorrow": 49488, + "Ton": 35416, + "Tonight": 43783, + "Tony": 29387, + "Too": 23307, + "Tool": 25391, + "Tools": 33637, + "Top": 9126, + "Topic": 33221, + "Topics": 25902, + "Tor": 15884, + "Toronto": 31359, + "Torrent": 39286, + "Total": 14957, + "Touch": 35211, + "Tour": 39152, + "Town": 38097, + "Toy": 48236, + "Tr": 2898, + "Tra": 15721, + "Track": 24802, + "Tracker": 35694, + "Trade": 35965, + "Traditional": 48485, + "Train": 44077, + "Training": 44357, + "Trans": 8291, + "Transaction": 48720, + "Transfer": 43260, + "Transform": 41762, + "Translation": 48313, + "Travel": 33074, + "Tre": 31055, + "Tree": 27660, + "Trend": 45461, + "Tri": 14824, + "Trigger": 48344, + "Trivia": 23854, + "Tro": 44095, + "True": 17821, + "Trump": 6170, + "Trust": 33814, + "Truth": 38782, + "Try": 23433, + "Ts": 33758, + "Tu": 47247, + "Tube": 6876, + "Tue": 41392, + "Tuesday": 26133, + "Tumblr": 39415, + "Tur": 17483, + "Turkey": 31632, + "Turkish": 42872, + "Turn": 17278, + "Tw": 5080, + "Twe": 32665, + "Tweet": 47845, + "Twenty": 34096, + "Twitter": 14254, + "Two": 7571, + "Tx": 46047, + "Ty": 25492, + "Tyler": 46807, + "Typ": 31467, + "Type": 6030, + "Types": 31431, + "Typically": 49321, + "U": 52, + "UA": 34970, + "UAL": 25620, + "UB": 10526, + "UC": 9598, + "UCK": 16696, + "UCT": 18415, + "UD": 8322, + "UE": 8924, + "UES": 35409, + "UF": 36820, + "UFC": 44534, + "UFF": 47588, + "UG": 7340, + "UGC": 31179, + "UGE": 41251, + "UGH": 44004, + "UI": 10080, + "UID": 27586, + "UK": 15039, + "UL": 6239, + "ULAR": 37232, + "ULE": 24212, + "ULL": 9994, + "ULT": 16724, + "ULTS": 35342, + "UM": 5883, + "UME": 38340, + "UMP": 20476, + "UN": 4944, + "UNCH": 47461, + "UNE": 41884, + "UP": 8577, + "UPDATE": 16977, + "UR": 4261, + "URA": 45570, + "URE": 11335, + "URES": 29514, + "URI": 47269, + "URL": 21886, + "URN": 27064, + "URR": 31302, + "URRENT": 39237, + "US": 2937, + "USA": 14053, + "USB": 27155, + "USD": 29072, + "USE": 19108, + "USER": 29904, + "USH": 27143, + "USS": 32835, + "UST": 7759, + "UT": 3843, + "UTC": 17429, + "UTE": 37780, + "UTERS": 14974, + "UTF": 48504, + "UTH": 24318, + "UTION": 35354, + "UU": 30100, + "UV": 31667, + "UX": 31235, + "Ub": 36609, + "Uber": 39018, + "Uh": 34653, + "Uk": 28425, + "Ukraine": 44814, + "Ul": 47920, + "Ult": 16301, + "Ultimate": 47892, + "Ultimately": 27212, + "Ultra": 36122, + "Um": 37280, + "Un": 3118, + "Uncommon": 43023, + "Und": 31319, + "Under": 9203, + "Understanding": 43467, + "Unfortunately": 13898, + "Union": 38176, + "Unique": 40257, + "Unit": 26453, + "United": 17013, + "Unity": 35955, + "Universal": 38747, + "University": 21009, + "Unix": 47000, + "Unknown": 20035, + "Unless": 28042, + "Unlike": 18521, + "Unt": 35792, + "Until": 18273, + "Untitled": 46332, + "Up": 4933, + "Update": 10260, + "Updated": 17354, + "Upgrade": 44948, + "Upload": 41592, + "Upon": 23792, + "Ur": 16692, + "Urban": 46667, + "Url": 28165, + "Us": 5842, + "Usage": 28350, + "Use": 11041, + "Used": 38052, + "User": 12982, + "Users": 14490, + "Using": 12814, + "Usually": 37887, + "Ut": 18274, + "Utah": 44350, + "V": 53, + "VA": 11731, + "VAL": 23428, + "VALUE": 39488, + "VB": 44526, + "VC": 15922, + "VD": 8898, + "VE": 6089, + "VEL": 18697, + "VEN": 28290, + "VER": 5959, + "VERS": 28884, + "VERSION": 43717, + "VERT": 15858, + "VERTIS": 18000, + "VERTISEMENT": 18679, + "VG": 43490, + "VI": 12861, + "VICE": 27389, + "VID": 11008, + "VIDEO": 42937, + "VIDIA": 13171, + "VIEW": 28206, + "VII": 45529, + "VILLE": 38526, + "VIS": 29817, + "VK": 47191, + "VL": 47468, + "VM": 15996, + "VO": 29516, + "VOL": 44558, + "VP": 8859, + "VPN": 33883, + "VR": 13024, + "VS": 20304, + "VT": 36392, + "VW": 30133, + "Va": 33906, + "Val": 7762, + "Valid": 47139, + "Value": 11395, + "Values": 40161, + "Van": 25298, + "Var": 19852, + "Vari": 23907, + "Variable": 43015, + "Various": 40009, + "Vaults": 33937, + "Ve": 26979, + "Vector": 38469, + "Veh": 37870, + "Vel": 46261, + "Ven": 37522, + "Ver": 13414, + "Vers": 34947, + "Version": 14815, + "Versions": 45150, + "Vert": 42369, + "Very": 16371, + "Veter": 45182, + "Vi": 38432, + "Via": 30754, + "Vice": 47910, + "Vict": 21944, + "Victoria": 49898, + "Video": 10798, + "View": 7680, + "Vill": 42074, + "Viol": 33894, + "Virgin": 34674, + "Virginia": 41017, + "Virtual": 37725, + "Vis": 15854, + "Vision": 44206, + "Visit": 31141, + "Visual": 36259, + "Vo": 42144, + "Voice": 35708, + "Vol": 16598, + "Volume": 31715, + "Vote": 37394, + "Vs": 23266, + "W": 54, + "WA": 15543, + "WAR": 16279, + "WARD": 39743, + "WARE": 33746, + "WARN": 37771, + "WARNING": 31502, + "WASHINGTON": 21793, + "WATCH": 35192, + "WAY": 27285, + "WAYS": 42451, + "WB": 45607, + "WC": 27353, + "WD": 22332, + "WE": 8845, + "WER": 45532, + "WF": 48397, + "WH": 12418, + "WHAT": 32971, + "WHERE": 47357, + "WHO": 41856, + "WI": 36326, + "WIN": 37620, + "WIND": 28929, + "WINDOWS": 33207, + "WM": 22117, + "WN": 29767, + "WOOD": 49466, + "WOR": 45359, + "WORK": 33249, + "WP": 25527, + "WR": 18564, + "WS": 19416, + "WT": 39386, + "WW": 17947, + "Wa": 33484, + "Wait": 21321, + "Wal": 21902, + "Walk": 35963, + "Walker": 39950, + "Wall": 22401, + "Wallet": 47152, + "Wan": 45681, + "Want": 19633, + "War": 13195, + "Ward": 49021, + "Ware": 38824, + "Warning": 20361, + "Warren": 43464, + "Wars": 41508, + "Was": 16973, + "Washington": 17402, + "Watch": 10723, + "Water": 19184, + "Wave": 39709, + "Way": 25309, + "We": 1135, + "Weak": 44898, + "Weapon": 27632, + "Weapons": 41818, + "Weather": 41865, + "Web": 13908, + "Website": 33420, + "Wed": 19864, + "Wednesday": 27150, + "Week": 20916, + "Weight": 25844, + "Weiss": 48760, + "Welcome": 14618, + "Well": 5779, + "Were": 35653, + "West": 15045, + "Western": 24227, + "Wh": 1199, + "What": 2061, + "Whatever": 21875, + "Whe": 10842, + "Wheel": 45307, + "When": 2215, + "Whenever": 28877, + "Where": 8496, + "Whereas": 48494, + "Whether": 15354, + "Which": 13828, + "While": 3633, + "Whit": 43617, + "White": 12256, + "Who": 8241, + "Whoever": 47896, + "Why": 5195, + "Wi": 31294, + "Wide": 42559, + "Widget": 38300, + "Width": 30916, + "Wik": 33010, + "Wiki": 32603, + "Wikipedia": 48845, + "Wil": 22327, + "Wild": 25946, + "Will": 8743, + "William": 17121, + "Williams": 27869, + "Wilson": 37349, + "Win": 16643, + "Wind": 8731, + "Window": 27703, + "Windows": 11209, + "Wing": 35612, + "Winged": 47418, + "Winner": 48056, + "Winter": 35376, + "Wire": 29451, + "Wisconsin": 49097, + "With": 3152, + "WithNo": 35992, + "Within": 22005, + "Without": 16249, + "Witness": 38670, + "Wo": 49450, + "Wolf": 32069, + "Woman": 48081, + "Women": 18495, + "Wonder": 42337, + "Wood": 22911, + "Word": 26449, + "Words": 37117, + "Work": 12468, + "Working": 28516, + "Works": 23044, + "World": 10603, + "Would": 17353, + "Wow": 22017, + "Wr": 39213, + "Wra": 36918, + "Writ": 20257, + "Write": 16594, + "Writer": 34379, + "Writing": 33874, + "Written": 25354, + "Ws": 46456, + "X": 55, + "XL": 32457, + "XM": 37643, + "XP": 27481, + "XT": 25010, + "XX": 8051, + "XXX": 43145, + "XXXX": 24376, + "XY": 34278, + "Xbox": 43377, + "Xi": 42528, + "Y": 56, + "YA": 44947, + "YC": 44816, + "YD": 35755, + "YE": 48743, + "YES": 43335, + "YING": 45761, + "YL": 45448, + "YN": 40760, + "YOU": 36981, + "YP": 48232, + "YR": 38162, + "YS": 16309, + "YY": 26314, + "Yan": 49664, + "Yang": 38663, + "Ye": 35543, + "Yeah": 10995, + "Year": 17688, + "Years": 40630, + "Yellow": 39499, + "Yep": 47834, + "Yes": 5297, + "Yesterday": 28065, + "Yet": 11486, + "Yo": 38101, + "York": 49278, + "You": 1639, + "YouTube": 33869, + "Young": 20917, + "Your": 7120, + "Yu": 40728, + "Z": 57, + "ZA": 34892, + "ZE": 21211, + "ZI": 48926, + "ZX": 40692, + "ZZ": 30148, + "Ze": 36056, + "Zen": 47573, + "Zero": 28667, + "Zip": 41729, + "Zone": 26961, + "[": 58, + "[\"": 14692, + "['": 17816, + "[/": 13412, + "[[": 30109, + "[]": 21737, + "[_": 29795, + "\\": 59, + "\\\"": 7879, + "\\\",": 34607, + "\\\":": 30478, + "\\\">": 38214, + "\\'": 43054, + "\\)": 22725, + "\\-": 41441, + "\\.": 17405, + "\\/": 11139, + "\\/\\/": 45422, + "\\<": 49778, + "\\\\": 6852, + "\\\\\\\\": 13426, + "\\\\\\\\\\\\\\\\": 21807, + "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\": 34604, + "]": 60, + "]\"": 30866, + "]'": 49946, + "](": 16151, + "])": 12962, + "]),": 46570, + "]).": 35944, + "]);": 36563, + "]+": 48688, + "],": 4357, + "],\"": 17241, + "],[": 38430, + "]-": 45297, + "].": 4083, + "].\"": 29225, + "]:": 5974, + "];": 11208, + "]=": 22241, + "][": 7131, + "][/": 44926, + "]]": 11907, + "]}": 48999, + "^": 61, + "^^": 18237, + "^^^^": 39397, + "^{": 36796, + "_": 62, + "_(": 41052, + "_-": 22955, + "_-_": 31386, + "_.": 44807, + "_>": 49029, + "__": 834, + "___": 17569, + "____": 1427, + "_____": 29343, + "______": 25947, + "_______": 37405, + "________": 2602, + "________________": 4841, + "________________________": 32941, + "________________________________": 10221, + "________________________________________________________________": 27193, + "_{": 23330, + "`": 63, + "`,": 47671, + "`.": 44646, + "``": 15506, + "````": 33153, + "a": 64, + "aa": 7252, + "aaa": 46071, + "aaaa": 24794, + "aah": 37500, + "aan": 28340, + "ab": 397, + "aba": 15498, + "abad": 17325, + "abal": 44349, + "abama": 8809, + "aban": 45094, + "aband": 49248, + "abase": 5754, + "abases": 18826, + "abb": 6485, + "abba": 48910, + "abbage": 32061, + "abbit": 14229, + "abbling": 47883, + "abby": 42457, + "abc": 39305, + "abe": 11231, + "abee": 32580, + "abel": 9608, + "abella": 43653, + "aber": 27359, + "abet": 8380, + "abetes": 11064, + "abeth": 9407, + "abetic": 33312, + "abi": 17914, + "abiding": 43056, + "abies": 43256, + "abil": 14991, + "abilia": 48249, + "abilities": 5738, + "ability": 1799, + "abin": 6014, + "abis": 8102, + "abit": 29968, + "abl": 23117, + "able": 540, + "abled": 4510, + "ables": 2977, + "abling": 11716, + "ablish": 17148, + "ablished": 22555, + "ablishment": 25380, + "ablo": 18817, + "ably": 1346, + "abo": 34748, + "abol": 28426, + "abolic": 29304, + "abor": 4820, + "abortion": 32396, + "about": 10755, + "abouts": 27880, + "above": 29370, + "abre": 46241, + "abs": 8937, + "absolute": 48546, + "absolutely": 42994, + "absor": 46303, + "abul": 16665, + "abulary": 22528, + "abus": 46844, + "abuse": 47158, + "abwe": 27050, + "aby": 3930, + "abyte": 37828, + "abytes": 38346, + "ac": 330, + "aca": 22260, + "acan": 50195, + "acas": 40263, + "acc": 4134, + "acca": 43552, + "accept": 13635, + "acceptable": 16037, + "access": 15526, + "accessible": 33780, + "acci": 44456, + "acco": 8679, + "accompan": 41974, + "accompanied": 42588, + "according": 38169, + "account": 23317, + "ace": 558, + "acea": 44977, + "aceae": 48319, + "acebook": 2887, + "aced": 2286, + "acement": 5592, + "acements": 28613, + "acent": 12643, + "aceous": 37797, + "acer": 11736, + "acerb": 22428, + "acers": 49908, + "aces": 2114, + "acet": 23253, + "aceutical": 14642, + "acey": 25415, + "ach": 620, + "acha": 34518, + "achable": 34446, + "ache": 4891, + "ached": 2317, + "achel": 9636, + "achelor": 19335, + "acher": 3493, + "achers": 17892, + "aches": 3694, + "achev": 42961, + "achi": 14299, + "achine": 20480, + "aching": 8103, + "achment": 15520, + "acho": 43703, + "acht": 19725, + "achu": 32323, + "achus": 9523, + "achusetts": 9770, + "achy": 35586, + "aci": 32009, + "acia": 47431, + "acial": 18150, + "acid": 46309, + "acies": 13433, + "acing": 4092, + "acio": 48711, + "acion": 49443, + "acious": 14209, + "aciously": 45289, + "acist": 20279, + "acists": 33194, + "acity": 4355, + "ack": 441, + "acked": 6021, + "acker": 10735, + "ackers": 28874, + "acket": 8317, + "ackets": 25180, + "acking": 5430, + "ackle": 20523, + "acks": 4595, + "acky": 36053, + "acl": 37779, + "acle": 6008, + "acles": 9928, + "acly": 39691, + "aclysm": 40605, + "aco": 10602, + "acon": 7807, + "acons": 37256, + "acqu": 43561, + "acre": 12345, + "acs": 16436, + "act": 529, + "acted": 23800, + "acter": 7321, + "acteria": 10634, + "acterial": 44965, + "acters": 19858, + "actic": 12009, + "acting": 27362, + "action": 2673, + "actionDate": 31538, + "actions": 4658, + "activ": 15791, + "activate": 39022, + "activated": 33106, + "activation": 48545, + "active": 5275, + "actively": 33329, + "activity": 21797, + "actly": 24342, + "actor": 11218, + "actory": 9548, + "acts": 8656, + "actual": 50039, + "actually": 37739, + "actus": 34144, + "acular": 12754, + "acus": 48628, + "acy": 1590, + "ad": 324, + "ada": 4763, + "adal": 31682, + "adan": 29157, + "adapt": 42552, + "adas": 38768, + "adata": 14706, + "aday": 43593, + "adays": 20544, + "add": 2860, + "addafi": 32113, + "added": 29373, + "adden": 38014, + "adder": 26676, + "adders": 45940, + "addin": 46782, + "adding": 26872, + "addle": 37382, + "addock": 35509, + "addon": 48078, + "addons": 39996, + "addr": 29851, + "address": 21975, + "addy": 13218, + "ade": 671, + "aded": 5286, + "adel": 6959, + "adelphia": 8273, + "adem": 36920, + "ademic": 49113, + "aden": 40780, + "adena": 38047, + "adeon": 12424, + "adequ": 16515, + "ader": 5067, + "aders": 9972, + "ades": 2367, + "adesh": 13410, + "adh": 24411, + "adi": 9189, + "adia": 29523, + "adian": 18425, + "adiator": 33716, + "adic": 23876, + "adier": 38868, + "adies": 50192, + "adin": 17072, + "ading": 4980, + "adiq": 48687, + "adish": 48563, + "aditional": 27013, + "adium": 6271, + "adj": 41255, + "adjust": 23032, + "adjusted": 29117, + "adle": 35166, + "admin": 28482, + "administ": 39081, + "ado": 4533, + "adobe": 36752, + "adoes": 46368, + "ador": 7079, + "ados": 22484, + "adow": 4584, + "adows": 9797, + "adr": 41909, + "adra": 49456, + "ads": 5643, + "adult": 49922, + "adv": 32225, + "advant": 13461, + "advert": 17904, + "advertisement": 45876, + "advertising": 34442, + "ady": 4597, + "ae": 3609, + "aea": 44705, + "aed": 8432, + "aeda": 11641, + "ael": 3010, + "aeper": 28235, + "aepernick": 28333, + "aer": 25534, + "aeus": 46052, + "aez": 47246, + "af": 1878, + "afa": 28485, + "afe": 8635, + "afer": 34659, + "afety": 27925, + "aff": 2001, + "affe": 21223, + "affected": 43958, + "affer": 31183, + "affiliated": 46818, + "affle": 30697, + "affles": 48501, + "afi": 19910, + "afia": 22214, + "afort": 24515, + "aft": 14940, + "after": 8499, + "ag": 363, + "aga": 8126, + "again": 17776, + "against": 32826, + "agall": 44906, + "agame": 46746, + "agan": 7329, + "aganda": 43589, + "agar": 32452, + "agara": 38415, + "agascar": 44309, + "agate": 37861, + "age": 496, + "aged": 1886, + "ageddon": 33054, + "agement": 5082, + "agements": 38113, + "agen": 11286, + "agency": 40955, + "agent": 25781, + "agents": 49638, + "ager": 3536, + "agers": 10321, + "ages": 1095, + "agg": 9460, + "agged": 14655, + "agger": 7928, + "agging": 16406, + "aggressive": 49639, + "agh": 10471, + "aghan": 45109, + "aghd": 16650, + "agher": 30450, + "aghetti": 35812, + "agi": 18013, + "agic": 9083, + "agically": 39066, + "agin": 23183, + "agine": 12756, + "aging": 3039, + "agle": 19345, + "agles": 37803, + "agn": 4660, + "agna": 48669, + "agnar": 30475, + "agne": 21080, + "agnetic": 25145, + "ago": 3839, + "agog": 37300, + "agogue": 32238, + "agon": 1840, + "agonal": 27923, + "agonist": 15239, + "agonists": 36764, + "agons": 34765, + "agos": 48215, + "agra": 45429, + "agram": 6713, + "agraph": 6111, + "agree": 49221, + "ags": 3775, + "agu": 11433, + "ague": 2064, + "agues": 6120, + "agus": 31111, + "agy": 46671, + "ah": 993, + "aha": 12236, + "ahah": 36225, + "ahan": 19210, + "ahar": 37325, + "ahead": 38204, + "ahi": 32810, + "ahime": 49997, + "ahl": 15668, + "ahn": 15386, + "aho": 17108, + "ahon": 30491, + "ahoo": 12992, + "ahs": 39095, + "ahu": 12196, + "ai": 1872, + "aic": 18452, + "aid": 1698, + "aida": 30546, + "aiden": 17538, + "aido": 44354, + "aign": 1784, + "aii": 42648, + "ail": 603, + "aila": 39460, + "ailability": 8994, + "ailable": 1508, + "ailand": 16188, + "ailed": 6255, + "ailing": 11608, + "ails": 1768, + "aily": 3079, + "aim": 1385, + "aiman": 47840, + "aimon": 49438, + "ain": 391, + "aina": 42183, + "aine": 5718, + "ained": 1328, + "ainer": 10613, + "ainers": 50221, + "aining": 1397, + "ainment": 37091, + "ains": 1299, + "aint": 2913, + "aintain": 32725, + "ainted": 14215, + "aints": 6003, + "air": 958, + "aird": 41620, + "aire": 7626, + "aired": 9820, + "aires": 17693, + "airo": 18131, + "airs": 3468, + "airy": 13021, + "ais": 15152, + "ait": 4548, + "aith": 3921, + "aito": 38995, + "aj": 1228, + "aja": 27792, + "aji": 26436, + "ajo": 34944, + "ajor": 1518, + "ak": 461, + "aka": 8130, + "akable": 29033, + "ake": 539, + "aked": 4335, + "akedown": 25817, + "aken": 1685, + "akening": 18800, + "akens": 31627, + "aker": 3110, + "akers": 3979, + "akeru": 43246, + "akery": 33684, + "akes": 1124, + "akespe": 20621, + "akespeare": 20946, + "akh": 11322, + "aki": 8182, + "akia": 21897, + "akin": 27048, + "aking": 868, + "akings": 45665, + "akis": 27321, + "ako": 25496, + "akov": 44715, + "akra": 38004, + "aks": 4730, + "aku": 8719, + "akura": 47754, + "akuya": 29863, + "aky": 15492, + "al": 282, + "ala": 6081, + "alach": 33786, + "alam": 44949, + "alan": 25786, + "albeit": 45781, + "album": 40916, + "alcohol": 42142, + "ald": 1940, + "alde": 35885, + "aldehyde": 44895, + "aldi": 37566, + "aldo": 41476, + "ale": 1000, + "aleb": 32100, + "aled": 3021, + "aleigh": 30729, + "aler": 36213, + "alert": 44598, + "ales": 2040, + "aley": 16730, + "alez": 22149, + "alf": 1604, + "alg": 14016, + "algia": 47111, + "ali": 7344, + "alia": 9752, + "alian": 7199, + "alias": 26011, + "aliation": 22885, + "alid": 10751, + "alien": 42690, + "align": 31494, + "aligned": 41634, + "alin": 14414, + "aline": 20663, + "aling": 4272, + "alion": 19275, + "alions": 50022, + "alis": 27315, + "alist": 49845, + "alities": 27969, + "ality": 1483, + "alk": 971, + "alker": 20949, + "alking": 18998, + "alks": 23833, + "alky": 18354, + "alkyrie": 21316, + "all": 439, + "alla": 30315, + "allah": 31840, + "allas": 7826, + "alle": 6765, + "alled": 4262, + "allel": 29363, + "allery": 17022, + "alli": 36546, + "allic": 18196, + "alling": 9221, + "allion": 48332, + "allo": 49457, + "alloc": 32332, + "allow": 12154, + "allowed": 40845, + "alloween": 50107, + "allows": 47205, + "alls": 5691, + "ally": 453, + "alm": 38182, + "almost": 28177, + "alo": 7335, + "alog": 11794, + "alogue": 30326, + "alogy": 48909, + "alon": 40755, + "alone": 17749, + "along": 24176, + "alore": 40612, + "alos": 41823, + "alph": 17307, + "alpha": 26591, + "als": 874, + "alsa": 32058, + "alse": 2820, + "alsh": 22114, + "also": 14508, + "alt": 2501, + "alted": 29590, + "alter": 47653, + "altern": 33645, + "alth": 1094, + "although": 16670, + "alties": 10355, + "alty": 6017, + "alus": 46781, + "always": 33770, + "aly": 3400, + "alys": 26266, + "alysed": 47557, + "alyses": 43710, + "alysis": 8767, + "alyst": 21470, + "am": 321, + "ama": 1689, + "amac": 11494, + "amacare": 11724, + "aman": 10546, + "amar": 39236, + "amara": 47848, + "amaru": 46893, + "amas": 17485, + "amate": 36754, + "amation": 14755, + "amaz": 45983, + "amazon": 33103, + "amb": 4131, + "amba": 31842, + "amber": 7789, + "ambers": 16368, + "ambling": 15366, + "ambo": 22651, + "amboo": 27708, + "amd": 28745, + "ame": 480, + "amed": 2434, + "ameda": 49637, + "amel": 17983, + "ameless": 39942, + "amen": 41763, + "ament": 3263, + "amental": 6860, + "aments": 12604, + "amer": 2382, + "amera": 18144, + "ameron": 41639, + "ames": 1047, + "ami": 6277, + "amia": 49442, + "amic": 18127, + "amide": 37905, + "amiliar": 19968, + "amily": 5993, + "amin": 5669, + "amina": 18891, + "amination": 24979, + "amine": 9862, + "aminer": 32086, + "amines": 41047, + "aming": 3723, + "amins": 24937, + "amiya": 38241, + "aml": 43695, + "amm": 6475, + "ammad": 26035, + "ammed": 10573, + "ammers": 36846, + "ammu": 49487, + "ammy": 46736, + "amn": 34684, + "amo": 18811, + "amon": 16487, + "among": 35131, + "amorph": 37670, + "amoto": 25384, + "amount": 17287, + "amous": 10877, + "amp": 696, + "ampa": 13299, + "amped": 13322, + "amph": 28474, + "amphetamine": 31262, + "amping": 37843, + "ampion": 6734, + "ampions": 4350, + "ampire": 13577, + "ampires": 27933, + "ample": 1403, + "amples": 12629, + "ampoo": 40239, + "amps": 9430, + "ampton": 23427, + "ampunk": 46183, + "ams": 4105, + "amsung": 30136, + "amura": 37324, + "amus": 25509, + "amy": 14814, + "an": 272, + "ana": 2271, + "analy": 38200, + "analysis": 20930, + "anamo": 33524, + "anan": 27870, + "anas": 15991, + "anasia": 45551, + "anc": 1192, + "anca": 42124, + "ance": 590, + "anced": 2903, + "ancel": 21130, + "ancer": 8250, + "ancers": 20811, + "ances": 1817, + "anch": 3702, + "anche": 6362, + "anches": 12140, + "anchester": 8911, + "anchez": 20364, + "ancial": 2783, + "ancies": 16183, + "ancing": 5077, + "anco": 47699, + "ancock": 37077, + "ancouver": 10264, + "ancy": 3883, + "and": 392, + "anda": 5282, + "andal": 7642, + "andals": 23819, + "andan": 42509, + "ande": 40004, + "anded": 12249, + "andel": 33134, + "andem": 30025, + "ander": 4066, + "andering": 42454, + "anders": 45070, + "andestine": 35887, + "andi": 26800, + "anding": 27225, + "andise": 18888, + "ando": 25440, + "andom": 3749, + "andon": 5063, + "andowski": 44391, + "andr": 46273, + "andra": 15918, + "andre": 49078, + "andro": 28092, + "android": 19411, + "ands": 1746, + "andum": 25933, + "andy": 10757, + "ane": 1531, + "aned": 22739, + "aneers": 33547, + "aneous": 11655, + "aneously": 27683, + "anes": 7305, + "aney": 22297, + "ang": 648, + "anga": 16484, + "angan": 37089, + "ange": 858, + "anged": 5102, + "angel": 8368, + "angelo": 46525, + "anger": 2564, + "angered": 19041, + "angering": 49470, + "angers": 6606, + "anges": 6231, + "angible": 39639, + "anging": 4924, + "angle": 9248, + "angled": 22393, + "angler": 49910, + "angles": 27787, + "angling": 27499, + "ango": 14208, + "angs": 27725, + "angu": 2303, + "anguage": 9000, + "anguages": 33213, + "anguard": 23521, + "angular": 21413, + "ani": 3216, + "ania": 5411, + "anian": 38336, + "anic": 26277, + "anical": 36684, + "anie": 34166, + "aniel": 6321, + "anim": 11227, + "animal": 41607, + "animate": 45685, + "animous": 45873, + "aning": 7574, + "anish": 7115, + "anism": 48162, + "anity": 19689, + "anium": 15776, + "ank": 962, + "anka": 15927, + "anke": 49200, + "anked": 14076, + "ankind": 28066, + "anking": 15230, + "anks": 2283, + "anky": 39556, + "anmar": 21708, + "ann": 1236, + "anna": 7697, + "annabin": 43655, + "annah": 25761, + "anne": 21952, + "anned": 3577, + "annel": 4276, + "annels": 8961, + "anners": 15672, + "anni": 31296, + "annie": 42883, + "annis": 45017, + "annon": 8825, + "annot": 34574, + "announced": 43499, + "anny": 7737, + "ano": 5733, + "anoia": 30661, + "anol": 22012, + "anon": 36902, + "anooga": 42165, + "anos": 40015, + "another": 29214, + "anova": 40993, + "anqu": 26184, + "ans": 504, + "ansas": 6618, + "anse": 40054, + "ansen": 33807, + "anship": 47086, + "ansion": 5487, + "ansk": 34738, + "anski": 44978, + "ansky": 49792, + "ansom": 22011, + "anson": 23103, + "ansson": 44038, + "answer": 41484, + "answered": 31966, + "ant": 415, + "anta": 4910, + "antage": 36403, + "antam": 49653, + "antasy": 34921, + "ante": 12427, + "anted": 4126, + "antes": 39781, + "anth": 29313, + "antha": 32589, + "anthrop": 22178, + "anti": 17096, + "antic": 5109, + "antically": 31589, + "anticipated": 45178, + "antics": 29320, + "antine": 29003, + "anting": 20482, + "antis": 20836, + "antle": 16941, + "antly": 3875, + "anto": 14723, + "antom": 11456, + "anton": 23026, + "antry": 21238, + "ants": 1187, + "anty": 46098, + "antz": 46269, + "anu": 42357, + "anus": 41141, + "anut": 20651, + "anuts": 37555, + "anwhile": 6710, + "any": 1092, + "anya": 34183, + "anyahu": 15966, + "anye": 23495, + "anyl": 34816, + "anyon": 21330, + "anything": 49459, + "anz": 35410, + "anza": 35819, + "ao": 5488, + "aos": 7495, + "ap": 499, + "apa": 32678, + "apache": 43073, + "apan": 2674, + "ape": 1758, + "apeake": 49528, + "aped": 5813, + "apego": 40561, + "aper": 2136, + "apers": 5656, + "apes": 7916, + "apesh": 25490, + "apeshifter": 29554, + "apest": 35746, + "aph": 6570, + "aphael": 34889, + "api": 15042, + "aping": 9269, + "apist": 41690, + "apixel": 48633, + "aple": 24052, + "aples": 28624, + "apo": 41817, + "apolis": 11174, + "apolog": 46407, + "apon": 9184, + "apons": 13486, + "apor": 12687, + "apore": 11656, + "app": 1324, + "appa": 20975, + "apped": 6320, + "append": 33295, + "apper": 11463, + "appers": 46629, + "appiness": 42661, + "apping": 5912, + "appings": 39242, + "apple": 18040, + "application": 31438, + "apply": 39014, + "appointed": 32924, + "appro": 21064, + "appropri": 11488, + "appropriate": 13335, + "appropriately": 45175, + "approved": 29137, + "approximately": 47498, + "apps": 18211, + "appy": 7774, + "aps": 1686, + "apse": 7512, + "apsed": 28361, + "apses": 45903, + "apt": 2373, + "apter": 3429, + "apters": 12126, + "aptic": 32963, + "aptop": 45007, + "apult": 41387, + "apy": 12826, + "aq": 30188, + "aqu": 36129, + "aque": 18251, + "aques": 46806, + "aquin": 48734, + "ar": 283, + "ara": 3301, + "arag": 29967, + "arah": 23066, + "arak": 30447, + "aram": 41158, + "aran": 19173, + "arant": 4741, + "arantine": 37996, + "araoh": 33766, + "arat": 34174, + "arate": 30748, + "aration": 10186, + "arations": 24355, + "arb": 38039, + "arbon": 42084, + "arc": 5605, + "arcer": 17649, + "arch": 998, + "arching": 38270, + "archive": 17474, + "archives": 48814, + "archment": 36767, + "archs": 34592, + "archy": 9282, + "arcity": 32689, + "ard": 446, + "arde": 45093, + "arded": 10676, + "arden": 5872, + "ardi": 22490, + "arding": 13493, + "ardless": 14694, + "ardo": 13109, + "ardon": 19917, + "ards": 1371, + "ardy": 39124, + "are": 533, + "area": 20337, + "ared": 1144, + "aredevil": 38281, + "arel": 20318, + "arella": 45494, + "aren": 5757, + "arent": 1580, + "arenthood": 17117, + "arently": 13773, + "arer": 11258, + "arers": 34231, + "ares": 3565, + "arest": 12423, + "aret": 8984, + "areth": 26659, + "arette": 14758, + "arettes": 13890, + "aretz": 48338, + "arez": 19655, + "arf": 37595, + "arg": 853, + "arge": 1376, + "arger": 32270, + "arget": 7641, + "argo": 9448, + "argon": 37920, + "args": 22046, + "argument": 49140, + "ari": 2743, + "aria": 10312, + "arial": 36098, + "arian": 3699, + "arians": 13517, + "ariat": 21621, + "arie": 49173, + "aries": 3166, + "arij": 39010, + "arijuana": 42834, + "arily": 3093, + "arin": 17714, + "arine": 34569, + "aring": 1723, + "ario": 4982, + "arios": 13010, + "arious": 27129, + "aris": 20066, + "arist": 34566, + "arity": 6806, + "arium": 17756, + "arius": 19897, + "ark": 668, + "arkable": 45543, + "arkin": 39027, + "arks": 5558, + "arl": 7063, + "arlane": 49344, + "arling": 30045, + "arm": 1670, + "arma": 10961, + "armac": 32813, + "armed": 12026, + "arming": 18052, + "armor": 40456, + "arms": 8357, + "arn": 1501, + "arna": 28610, + "arnaev": 42311, + "arning": 4228, + "aro": 12022, + "aron": 8045, + "aroo": 38049, + "around": 14145, + "arov": 42737, + "arp": 5117, + "arr": 3258, + "arranted": 47940, + "arrass": 9187, + "array": 18747, + "arre": 9624, + "arrell": 47769, + "arrett": 34878, + "arrison": 22472, + "arro": 34852, + "arrow": 6018, + "arry": 6532, + "ars": 945, + "arse": 17208, + "arser": 28198, + "arsh": 5406, + "arsity": 45826, + "arson": 12613, + "art": 433, + "arta": 34202, + "arte": 32074, + "arted": 19112, + "arten": 23996, + "arter": 2571, + "arters": 6137, + "arth": 11999, + "arthed": 36370, + "arthy": 18270, + "article": 20205, + "articles": 26845, + "artifacts": 50179, + "artisan": 19714, + "artist": 49016, + "artment": 1823, + "artments": 32514, + "artney": 41709, + "arton": 41328, + "arts": 5889, + "arty": 25494, + "artz": 13636, + "aru": 11493, + "arus": 20272, + "ary": 560, + "arya": 43898, + "aryl": 36822, + "aryn": 38621, + "as": 292, + "asa": 15462, + "asaki": 33846, + "asant": 8775, + "asar": 42391, + "asc": 3372, + "asca": 42688, + "ascade": 28966, + "ascal": 27747, + "ascar": 37740, + "ascist": 31968, + "ascript": 15961, + "ascular": 14767, + "ascus": 20275, + "ase": 589, + "ased": 839, + "asel": 48038, + "aser": 6005, + "asers": 19865, + "ases": 1386, + "ash": 1077, + "asha": 14715, + "ashed": 5263, + "asher": 31218, + "ashes": 7465, + "ashi": 12144, + "ashing": 2140, + "ashington": 2542, + "ashion": 5880, + "ashtra": 38535, + "asi": 17053, + "asia": 23218, + "asin": 47337, + "asing": 2313, + "asio": 29831, + "asion": 4247, + "asionally": 31775, + "asions": 39327, + "asis": 17765, + "asive": 17443, + "ask": 2093, + "aska": 8480, + "asket": 11715, + "asketball": 14575, + "asking": 30463, + "asks": 6791, + "asley": 30705, + "asm": 8597, + "asma": 11797, + "asms": 34432, + "ason": 888, + "asonable": 17994, + "asonic": 30189, + "asonry": 38950, + "asons": 2812, + "asp": 5126, + "aspberry": 17653, + "asper": 32981, + "aspers": 49412, + "aspx": 31740, + "ass": 562, + "assad": 30178, + "assador": 10623, + "assadors": 33429, + "assault": 46635, + "asse": 21612, + "assed": 21390, + "assemb": 34455, + "assembled": 46826, + "assembly": 41873, + "asser": 24929, + "assert": 30493, + "asses": 13978, + "assets": 19668, + "assetsadobe": 41383, + "assi": 46527, + "assian": 46091, + "assic": 31635, + "assies": 46257, + "assin": 44961, + "assing": 19696, + "assion": 11857, + "assis": 20297, + "assisted": 42191, + "assium": 26663, + "assment": 45312, + "asso": 28372, + "associated": 32852, + "assuming": 32935, + "assy": 11720, + "ast": 459, + "asta": 40197, + "aste": 4594, + "asted": 8992, + "aster": 1603, + "astered": 14054, + "astern": 6470, + "asters": 7060, + "astery": 29310, + "astic": 3477, + "astical": 32044, + "astically": 16607, + "astics": 24232, + "asting": 9222, + "aston": 45966, + "astrous": 20168, + "asts": 5773, + "asty": 7833, + "asu": 27345, + "asure": 5015, + "asured": 34006, + "asures": 13846, + "asuring": 45925, + "asury": 11579, + "asus": 40895, + "asy": 4107, + "at": 265, + "ata": 1045, + "atable": 21156, + "ataka": 48088, + "atal": 10254, + "atalie": 30951, + "atan": 39036, + "atana": 43777, + "atar": 9459, + "atari": 35554, + "atars": 40193, + "atch": 963, + "atche": 24809, + "atched": 14265, + "atcher": 34734, + "atches": 20981, + "atchewan": 29736, + "atching": 19775, + "ate": 378, + "atech": 40340, + "ated": 515, + "ateful": 11850, + "ateg": 2397, + "ategic": 47917, + "ategor": 47467, + "ategories": 26129, + "ategory": 11606, + "ategy": 4338, + "atel": 25791, + "atell": 7528, + "atellite": 26493, + "ately": 1286, + "atem": 23900, + "aten": 36686, + "ater": 729, + "ateral": 10534, + "aterasu": 45335, + "atered": 34190, + "aterial": 2273, + "atern": 9205, + "aternal": 14744, + "aternity": 17094, + "aters": 8605, + "ates": 689, + "ateur": 15093, + "ateurs": 45211, + "atever": 3587, + "atform": 3390, + "ath": 776, + "atha": 30921, + "atham": 37520, + "athan": 6696, + "athe": 26221, + "athed": 35932, + "ather": 1032, + "athered": 8638, + "atherine": 15289, + "athering": 25545, + "athetic": 18874, + "athi": 44202, + "athing": 26927, + "athlon": 50236, + "athom": 32910, + "athon": 12938, + "aths": 33148, + "athy": 10036, + "ati": 7246, + "atial": 34961, + "atibility": 25901, + "atible": 16873, + "atic": 1512, + "atical": 39056, + "atically": 4142, + "atican": 18245, + "atics": 23372, + "atile": 12610, + "atility": 18486, + "atin": 10680, + "ating": 803, + "atinum": 16881, + "atio": 39485, + "ation": 341, + "ational": 864, + "ationally": 15208, + "ations": 602, + "atis": 37749, + "atisf": 17403, + "atism": 26185, + "ative": 876, + "atively": 9404, + "atives": 2929, + "ativity": 22055, + "atl": 25864, + "atlantic": 43342, + "atmeal": 45280, + "ato": 5549, + "atoes": 15048, + "atography": 45501, + "atom": 37696, + "atomic": 47116, + "aton": 13951, + "atonin": 44248, + "atoon": 23122, + "ator": 1352, + "atorial": 21592, + "atories": 19854, + "atorium": 30732, + "ators": 2024, + "atory": 2870, + "atos": 35492, + "atown": 41079, + "atra": 26066, + "atre": 10562, + "atri": 26646, + "atro": 47756, + "atron": 23484, + "ats": 1381, + "atson": 13506, + "atsu": 19231, + "atsuki": 40063, + "att": 1078, + "atta": 25014, + "attach": 47348, + "attack": 20358, + "attacks": 38458, + "atted": 16898, + "atten": 41769, + "atter": 1436, + "attered": 10228, + "attering": 16475, + "atters": 34387, + "attery": 16296, + "atti": 34891, + "attle": 1999, + "attled": 43535, + "atto": 45807, + "atton": 38680, + "attr": 35226, + "attribute": 42348, + "atts": 30353, + "atu": 33419, + "atum": 21307, + "atur": 2541, + "atural": 2660, + "aturally": 7436, + "aturated": 30192, + "aturation": 36921, + "aturday": 3658, + "aturdays": 39724, + "ature": 1300, + "atures": 6691, + "atus": 7240, + "atz": 27906, + "au": 559, + "auc": 14272, + "aucas": 25205, + "aucus": 16710, + "aucuses": 38271, + "aud": 3885, + "auder": 29233, + "audi": 31330, + "audio": 24051, + "auer": 16261, + "aug": 7493, + "auga": 44718, + "augh": 1567, + "aughed": 13726, + "aughlin": 42730, + "aughs": 19256, + "aught": 3413, + "aughter": 3637, + "aughtered": 32734, + "aughters": 13441, + "aughty": 28496, + "aukee": 15263, + "aul": 2518, + "auld": 30406, + "auldron": 45637, + "ault": 1721, + "aults": 13185, + "aum": 26043, + "aun": 1942, + "auna": 32837, + "aunch": 11429, + "aund": 14677, + "aunder": 21118, + "aundering": 23496, + "aunders": 32818, + "aunt": 12968, + "aunted": 20227, + "aunting": 20706, + "auntlet": 32633, + "auntlets": 39695, + "aunts": 43981, + "aur": 2899, + "aura": 33830, + "auri": 35190, + "aurus": 22302, + "aus": 8717, + "ause": 682, + "ausible": 17178, + "aut": 2306, + "auth": 18439, + "authent": 41299, + "author": 9800, + "authored": 39351, + "authorized": 19721, + "authors": 41617, + "autical": 37073, + "aution": 32917, + "autions": 28766, + "auto": 23736, + "automatic": 37800, + "auts": 17712, + "aux": 14644, + "av": 615, + "ava": 4170, + "avage": 33757, + "availability": 47274, + "available": 15182, + "aval": 9226, + "avan": 12421, + "avanaugh": 19872, + "avascript": 16098, + "ave": 1015, + "aved": 9586, + "avement": 44034, + "aven": 4005, + "aver": 8770, + "average": 23913, + "avering": 42610, + "avers": 30400, + "avery": 12447, + "aves": 3080, + "avez": 28851, + "avi": 15820, + "avia": 40543, + "avid": 8490, + "avier": 19492, + "avin": 20637, + "aving": 2703, + "avior": 15759, + "aviour": 37716, + "avis": 23401, + "avoid": 27080, + "avor": 5570, + "avorable": 32006, + "avored": 48275, + "avorite": 19227, + "avour": 29023, + "avy": 2830, + "aw": 707, + "awa": 6909, + "awaited": 41742, + "awan": 43004, + "awar": 48841, + "aware": 9685, + "awareness": 47812, + "awaru": 39008, + "awatts": 46684, + "away": 8272, + "aways": 23949, + "awed": 36825, + "awei": 38247, + "awi": 23368, + "awk": 19301, + "awks": 11890, + "awn": 3832, + "aws": 8356, + "ax": 897, + "axe": 38231, + "axies": 25472, + "axis": 22704, + "axter": 40864, + "axy": 6969, + "ay": 323, + "aya": 11729, + "ayan": 22931, + "aye": 48822, + "ayed": 16548, + "ayer": 2794, + "ayers": 6962, + "ayette": 27067, + "aying": 8369, + "aylor": 7167, + "ayn": 49987, + "ayne": 43906, + "ays": 592, + "ayson": 34907, + "az": 1031, + "aza": 7056, + "azaar": 34485, + "azaki": 32276, + "azar": 29413, + "azard": 26267, + "aze": 6201, + "azed": 13865, + "azeera": 28535, + "azel": 41319, + "azer": 19178, + "azes": 36096, + "azi": 7761, + "azine": 4994, + "azines": 15742, + "azing": 4070, + "azo": 44299, + "azon": 5168, + "azor": 17725, + "azy": 12582, + "azz": 8101, + "b": 65, + "ba": 7012, + "bable": 33460, + "bably": 11921, + "baby": 40252, + "bach": 19496, + "back": 1891, + "backed": 17078, + "backer": 49978, + "background": 25249, + "backs": 10146, + "bad": 14774, + "bag": 21454, + "bage": 13866, + "bags": 34005, + "bah": 47041, + "bal": 6893, + "balance": 20427, + "balanced": 27753, + "ball": 1894, + "balls": 21591, + "ban": 3820, + "band": 3903, + "bands": 21397, + "bane": 20235, + "bang": 36668, + "bank": 17796, + "banks": 43558, + "bar": 5657, + "bara": 39389, + "bard": 23024, + "bare": 49382, + "bars": 34046, + "bart": 16575, + "bas": 12093, + "base": 8692, + "based": 3106, + "bash": 41757, + "basic": 35487, + "basketball": 21265, + "bass": 42933, + "bat": 8664, + "batch": 43501, + "bath": 37648, + "bats": 50199, + "battle": 38471, + "baugh": 23768, + "baum": 24738, + "bay": 24406, + "bb": 11848, + "bc": 15630, + "bd": 17457, + "bda": 43444, + "be": 1350, + "beam": 40045, + "bean": 14289, + "beans": 44749, + "bear": 33227, + "beard": 39433, + "bearing": 28655, + "beat": 12945, + "beaut": 40544, + "bec": 9423, + "because": 13893, + "becca": 20627, + "beck": 27343, + "becue": 31927, + "bed": 3077, + "bedroom": 36269, + "bee": 20963, + "been": 47436, + "beer": 42428, + "bees": 41712, + "before": 19052, + "begin": 27471, + "beh": 20709, + "behavior": 46571, + "behind": 42200, + "being": 11873, + "beit": 15357, + "bek": 47083, + "bel": 6667, + "bell": 7923, + "below": 35993, + "belt": 37976, + "ben": 11722, + "bench": 26968, + "bender": 45666, + "bending": 49667, + "benef": 36934, + "benefit": 48649, + "bent": 46119, + "ber": 527, + "bered": 9451, + "berg": 3900, + "berger": 21041, + "berman": 34591, + "bern": 33900, + "bernatorial": 43660, + "berra": 31358, + "berries": 20853, + "berry": 8396, + "bers": 1213, + "bert": 4835, + "berto": 32371, + "berus": 39192, + "bery": 13001, + "bes": 12636, + "best": 13466, + "bestos": 40651, + "bet": 11181, + "beta": 31361, + "bett": 48138, + "better": 27903, + "between": 23395, + "bey": 23454, + "bf": 19881, + "bg": 35904, + "bh": 34369, + "bi": 8482, + "bia": 23339, + "bial": 25200, + "bian": 12210, + "bians": 30071, + "biased": 38002, + "bid": 14065, + "bidden": 37978, + "bie": 12590, + "bies": 29846, + "big": 14261, + "bike": 32256, + "bil": 33473, + "bill": 35546, + "billion": 24540, + "bilt": 34508, + "bin": 8800, + "binary": 39491, + "bind": 21653, + "binding": 30786, + "bing": 4623, + "biology": 43592, + "bird": 16944, + "birds": 32002, + "birth": 24280, + "bis": 41907, + "bish": 31795, + "bishop": 27832, + "bit": 2545, + "bitcoin": 35395, + "bite": 37018, + "bitious": 14228, + "bits": 9895, + "biz": 42189, + "bj": 50007, + "bl": 2436, + "black": 13424, + "blade": 22500, + "blance": 42757, + "blank": 27190, + "blast": 39806, + "ble": 903, + "bleacher": 47975, + "bled": 9342, + "bledon": 49258, + "blem": 11253, + "blems": 22143, + "bler": 43400, + "blers": 43022, + "bles": 7689, + "bley": 43263, + "blind": 27461, + "bling": 11108, + "block": 9967, + "blocking": 41938, + "blocks": 27372, + "blog": 14036, + "blogs": 49096, + "blogspot": 35217, + "blood": 18041, + "blooded": 50132, + "blow": 48619, + "blown": 31290, + "blue": 17585, + "bly": 36874, + "bm": 20475, + "bn": 9374, + "bnb": 31971, + "bo": 2127, + "boa": 48614, + "board": 3526, + "boarding": 27794, + "boards": 12821, + "boat": 24482, + "boats": 46058, + "bodied": 45190, + "body": 2618, + "bol": 28984, + "bold": 36575, + "bole": 45693, + "bolt": 25593, + "bomb": 27657, + "bon": 4189, + "bone": 15992, + "bones": 35095, + "bons": 23461, + "book": 2070, + "books": 12106, + "bool": 30388, + "boost": 39521, + "boot": 18769, + "bor": 2865, + "border": 20192, + "borg": 23297, + "borgh": 49870, + "born": 6286, + "borne": 13555, + "boro": 21513, + "borough": 17913, + "bors": 32289, + "bos": 39565, + "boss": 42820, + "bot": 13645, + "both": 16885, + "bots": 42478, + "bott": 10985, + "bottom": 22487, + "bound": 7784, + "bour": 6084, + "bourg": 24256, + "bourne": 12544, + "bow": 8176, + "bowl": 36859, + "bows": 25435, + "box": 3524, + "boxes": 29305, + "boxing": 45471, + "boy": 7081, + "boys": 13202, + "bp": 46583, + "bps": 18799, + "br": 1671, + "bra": 16057, + "brace": 46565, + "brain": 27825, + "brainer": 49334, + "bral": 24427, + "brance": 28031, + "brand": 17938, + "branded": 35559, + "braska": 17088, + "brate": 40804, + "brates": 44835, + "bre": 4679, + "bread": 29573, + "break": 9032, + "breaker": 25766, + "breakers": 49295, + "breaking": 13395, + "breaks": 30058, + "bred": 36074, + "breeding": 49705, + "brew": 11269, + "brid": 10236, + "bridge": 9458, + "brids": 40637, + "bright": 29199, + "bring": 48580, + "bringer": 48046, + "bringing": 35749, + "bris": 15311, + "bro": 7957, + "broad": 36654, + "broken": 25826, + "brook": 19094, + "brother": 37343, + "brow": 25367, + "brown": 33282, + "browser": 40259, + "brush": 32680, + "bryce": 32524, + "bs": 1443, + "bsite": 12485, + "bsp": 24145, + "bt": 18347, + "btn": 46118, + "bu": 11110, + "bub": 46176, + "buck": 27041, + "bucks": 18999, + "budget": 37315, + "buf": 29325, + "buff": 36873, + "buffer": 22252, + "bug": 25456, + "bugs": 32965, + "build": 11249, + "builder": 38272, + "builders": 50034, + "building": 16894, + "built": 18780, + "bul": 15065, + "bull": 16308, + "bum": 4435, + "buquerque": 36461, + "bur": 6236, + "burg": 7423, + "burgh": 9228, + "burn": 10899, + "burning": 44313, + "burse": 21780, + "burst": 31961, + "bury": 10711, + "bus": 10885, + "bush": 50231, + "business": 22680, + "buster": 24899, + "busters": 30181, + "but": 4360, + "butt": 43059, + "button": 16539, + "buy": 17846, + "by": 1525, + "bye": 16390, + "byn": 14929, + "bys": 48209, + "byss": 15040, + "byte": 26327, + "byter": 36204, + "bytes": 33661, + "c": 66, + "ca": 6888, + "cache": 23870, + "cade": 46395, + "cair": 37155, + "cake": 30560, + "cakes": 37263, + "cal": 9948, + "cale": 38765, + "caliber": 43288, + "call": 13345, + "callback": 47423, + "called": 7174, + "calling": 44714, + "cam": 20991, + "camera": 25695, + "camp": 16544, + "campaign": 35012, + "campus": 43842, + "can": 5171, + "cancer": 48870, + "cand": 46188, + "cano": 35490, + "canon": 49883, + "cap": 11128, + "capacity": 42404, + "cape": 36435, + "capital": 27544, + "capitalist": 49970, + "caps": 27979, + "capt": 27144, + "car": 7718, + "carb": 35684, + "carbon": 29255, + "card": 9517, + "cards": 27761, + "care": 6651, + "carry": 34993, + "cars": 37993, + "cart": 26674, + "cas": 34004, + "case": 7442, + "cases": 33964, + "cash": 30350, + "cast": 2701, + "caster": 17970, + "casters": 26248, + "casting": 19913, + "castle": 18676, + "casts": 40924, + "cat": 9246, + "catch": 40198, + "catching": 50106, + "category": 22872, + "catentry": 39165, + "cation": 30907, + "cats": 24619, + "cause": 25587, + "cb": 21101, + "cc": 535, + "cca": 13227, + "ccess": 1591, + "cci": 35764, + "ccoli": 34544, + "ccording": 2941, + "cd": 10210, + "cdn": 32341, + "ce": 344, + "cean": 5829, + "ceans": 19961, + "ced": 771, + "cedented": 12292, + "cedes": 19285, + "ceed": 2707, + "ceivable": 48054, + "ceive": 15164, + "ceived": 6471, + "ceiver": 39729, + "cel": 5276, + "cele": 49840, + "celer": 7015, + "cell": 3846, + "cellaneous": 25673, + "cellence": 19801, + "cellent": 5666, + "cells": 46342, + "celona": 14308, + "cember": 3273, + "cemic": 40478, + "cence": 43696, + "cend": 15695, + "cens": 42595, + "cent": 1087, + "center": 16159, + "centered": 38050, + "central": 31463, + "centric": 28577, + "century": 14792, + "cephal": 43996, + "cept": 984, + "ception": 4516, + "ceptions": 11755, + "ceptive": 25867, + "ceptor": 49492, + "cer": 2189, + "cern": 30903, + "cerned": 49990, + "cerning": 41981, + "cerpt": 17040, + "cers": 7999, + "cert": 22583, + "certain": 39239, + "cery": 12757, + "ces": 728, + "cess": 919, + "cession": 43914, + "cessive": 45428, + "cest": 9165, + "cester": 33187, + "cf": 12993, + "cffff": 31727, + "cffffcc": 31957, + "cfg": 37581, + "cgi": 37157, + "ch": 354, + "cha": 11693, + "chain": 7983, + "chains": 38861, + "chair": 16337, + "chairs": 49655, + "chal": 38009, + "chall": 36747, + "cham": 49869, + "chan": 3147, + "chance": 39486, + "change": 3803, + "changed": 40985, + "changes": 36653, + "changing": 22954, + "channel": 17620, + "channelAvailability": 39757, + "chant": 8907, + "chanted": 28923, + "chapter": 43582, + "char": 10641, + "character": 22769, + "chard": 30215, + "charg": 11121, + "charge": 10136, + "charged": 17200, + "charges": 34948, + "charging": 31498, + "chart": 40926, + "chat": 17006, + "che": 2395, + "cheat": 46799, + "check": 9122, + "checked": 26752, + "checking": 41004, + "checks": 42116, + "ched": 1740, + "chedel": 24015, + "chel": 29232, + "chell": 12398, + "chem": 15245, + "chemical": 31379, + "chemist": 28899, + "chemy": 26599, + "chen": 6607, + "chenko": 45059, + "chens": 29937, + "cheon": 40556, + "cher": 2044, + "chers": 3533, + "chery": 31132, + "ches": 2052, + "chest": 46713, + "chester": 35983, + "chet": 20043, + "chev": 49916, + "chi": 11072, + "chid": 28402, + "chie": 3043, + "chief": 17351, + "chieve": 24957, + "child": 9410, + "children": 17197, + "chin": 24658, + "ching": 10813, + "chini": 45045, + "chio": 40900, + "chip": 35902, + "chlor": 36813, + "chn": 1349, + "chnology": 19587, + "cho": 6679, + "choes": 23001, + "choice": 25541, + "chool": 1251, + "christ": 43533, + "chrom": 28663, + "chrome": 46659, + "chron": 11413, + "cht": 21474, + "chu": 46417, + "chuk": 46019, + "church": 36964, + "chwitz": 36297, + "chy": 29658, + "ci": 979, + "cia": 33743, + "cial": 2413, + "cially": 2131, + "ciating": 46136, + "ciation": 17269, + "cible": 37369, + "cience": 4234, + "cient": 3456, + "cientious": 43037, + "cients": 35611, + "cies": 3171, + "cific": 7790, + "cig": 22683, + "cigarette": 46040, + "cigarettes": 32529, + "cil": 2856, + "cill": 20346, + "cin": 17879, + "cing": 2259, + "cious": 4680, + "cipl": 6671, + "cipled": 41296, + "ciples": 6418, + "ciplinary": 29386, + "cipline": 34647, + "circ": 21170, + "circle": 45597, + "cise": 37561, + "cised": 37168, + "cision": 16005, + "cit": 47992, + "citizens": 46801, + "city": 19205, + "cium": 16910, + "cius": 28599, + "civil": 37636, + "ck": 694, + "cker": 15280, + "cki": 49108, + "cking": 44377, + "cknow": 5319, + "cknowled": 33165, + "cko": 37549, + "cks": 4657, + "cl": 565, + "clad": 29853, + "claim": 6604, + "claimed": 12795, + "claimer": 17111, + "clair": 27659, + "clamation": 20931, + "class": 4871, + "classes": 37724, + "classic": 49421, + "classified": 31691, + "clave": 44281, + "claw": 43143, + "cle": 2375, + "clean": 27773, + "clear": 20063, + "cled": 20095, + "cler": 22902, + "clerosis": 31399, + "cles": 5427, + "cli": 44506, + "click": 12976, + "client": 16366, + "cliffe": 33783, + "climate": 42570, + "cling": 8493, + "clinical": 47367, + "clinton": 37821, + "clip": 15036, + "clips": 31945, + "clipse": 17043, + "clock": 15750, + "clone": 21018, + "cloneembedreportprint": 30899, + "close": 19836, + "closed": 20225, + "closure": 17966, + "cloth": 44905, + "cloud": 17721, + "club": 18664, + "clud": 758, + "clude": 9152, + "cluded": 10341, + "cludes": 13955, + "cluding": 6360, + "clus": 2527, + "clusion": 4717, + "clusions": 11539, + "clusive": 5731, + "clusively": 44307, + "cm": 11215, + "cmd": 28758, + "cmp": 48991, + "cms": 46406, + "cn": 31522, + "co": 1073, + "coal": 25140, + "coat": 31434, + "cock": 21517, + "cod": 19815, + "code": 8189, + "coded": 40976, + "codes": 40148, + "coe": 49270, + "cohol": 4857, + "coin": 3630, + "coins": 14624, + "col": 4033, + "cold": 36673, + "coll": 26000, + "collar": 37676, + "collect": 33327, + "collection": 43681, + "college": 44107, + "colm": 18414, + "colo": 45745, + "colonial": 49787, + "color": 8043, + "colored": 25717, + "colour": 49903, + "column": 28665, + "com": 785, + "comb": 24011, + "combat": 39969, + "combe": 49325, + "come": 2958, + "comed": 15128, + "comes": 8988, + "comfort": 21598, + "coming": 4976, + "comings": 30715, + "comm": 9503, + "command": 21812, + "comment": 23893, + "comments": 15944, + "commerce": 27061, + "commercial": 36313, + "commit": 41509, + "committee": 26799, + "common": 11321, + "commun": 10709, + "communication": 32560, + "communications": 20860, + "community": 28158, + "comp": 5589, + "compan": 34390, + "company": 39722, + "compatible": 38532, + "competitive": 46131, + "compl": 23855, + "complete": 20751, + "completely": 46699, + "complex": 41887, + "compliance": 47587, + "component": 42895, + "computer": 33215, + "con": 1102, + "concept": 43169, + "concert": 48415, + "cond": 17561, + "condition": 31448, + "conduct": 36495, + "cone": 49180, + "conf": 10414, + "conference": 41124, + "confidence": 39745, + "config": 11250, + "confirmed": 36349, + "cong": 36801, + "coni": 45774, + "conn": 37043, + "connect": 8443, + "connected": 15236, + "connection": 38659, + "conom": 1519, + "cons": 5936, + "conscious": 16796, + "conserv": 38925, + "conservancy": 41215, + "conservative": 43218, + "consider": 44353, + "console": 41947, + "const": 9979, + "constitutional": 18789, + "construct": 41571, + "consumer": 49827, + "consuming": 35873, + "cont": 3642, + "contact": 32057, + "contained": 45964, + "container": 34924, + "containing": 38301, + "content": 11299, + "context": 22866, + "contin": 18487, + "continental": 35415, + "continue": 43043, + "contract": 28484, + "control": 13716, + "controlled": 14401, + "controller": 36500, + "conv": 42946, + "cook": 27916, + "cooked": 46591, + "cookie": 44453, + "cool": 24494, + "coon": 20912, + "coord": 37652, + "cop": 22163, + "copy": 30073, + "cor": 10215, + "core": 7295, + "corn": 20772, + "correct": 30283, + "corruption": 46260, + "cos": 6966, + "cost": 15805, + "cosystem": 12541, + "cot": 25557, + "cott": 14612, + "could": 24089, + "count": 9127, + "counter": 24588, + "country": 19315, + "cour": 43220, + "course": 17319, + "court": 22230, + "cover": 9631, + "covered": 32111, + "cow": 8232, + "cox": 40359, + "cp": 13155, + "cpp": 20322, + "cpu": 36166, + "cr": 6098, + "craft": 3323, + "crafted": 39160, + "crazy": 50112, + "cre": 7513, + "cream": 36277, + "creat": 20123, + "create": 17953, + "created": 25598, + "creation": 38793, + "creator": 45382, + "credit": 43082, + "creen": 32060, + "crete": 38669, + "crew": 42276, + "cribed": 32968, + "crim": 50086, + "crime": 28126, + "criminal": 45955, + "cript": 6519, + "cription": 6820, + "criptions": 24370, + "crit": 22213, + "critical": 34666, + "cro": 19915, + "croft": 36714, + "crop": 31476, + "cross": 19692, + "crow": 47114, + "cru": 32838, + "cry": 20470, + "crypt": 29609, + "cs": 6359, + "css": 25471, + "csv": 40664, + "ct": 310, + "ctic": 11048, + "ctica": 28914, + "ction": 596, + "ctions": 2733, + "ctive": 14070, + "ctl": 34168, + "ctor": 2715, + "ctors": 5217, + "ctory": 25977, + "ctr": 24087, + "ctrl": 44755, + "ctuary": 15258, + "cture": 48715, + "ctx": 49464, + "cu": 27399, + "cube": 40296, + "cue": 15509, + "cul": 3129, + "cular": 10440, + "culated": 49262, + "culation": 14902, + "cule": 23172, + "cules": 13930, + "culosis": 38767, + "cult": 40820, + "cultural": 30844, + "culture": 25584, + "culus": 17576, + "cum": 36340, + "cup": 25244, + "cur": 22019, + "currency": 34415, + "current": 14421, + "currently": 41745, + "cus": 9042, + "cussion": 36262, + "custom": 23144, + "cut": 8968, + "cuts": 23779, + "cutting": 29753, + "cv": 33967, + "cy": 948, + "cycl": 15539, + "cycle": 13696, + "cycles": 32503, + "cyclop": 22873, + "cyclopedia": 25497, + "cyl": 38801, + "cz": 26691, + "cé": 32682, + "d": 67, + "dB": 36077, + "dL": 45582, + "da": 6814, + "dad": 47984, + "daily": 29468, + "dain": 27162, + "dal": 31748, + "dale": 14597, + "dam": 11043, + "damage": 28735, + "dan": 25604, + "danger": 38537, + "daq": 48539, + "dar": 27455, + "dark": 21953, + "dash": 42460, + "dat": 19608, + "data": 7890, + "database": 48806, + "date": 4475, + "dated": 8715, + "dates": 19581, + "dating": 38734, + "daughter": 29642, + "day": 820, + "dayName": 45392, + "days": 12545, + "db": 9945, + "dc": 17896, + "dd": 1860, + "dden": 4742, + "dding": 33403, + "dds": 33714, + "de": 2934, + "dead": 25124, + "deal": 31769, + "deals": 14302, + "death": 22595, + "deb": 11275, + "debian": 24689, + "debug": 24442, + "dec": 12501, + "deck": 35875, + "decl": 32446, + "ded": 9395, + "deen": 39060, + "deep": 22089, + "def": 4299, + "default": 12286, + "defense": 19774, + "define": 13086, + "defined": 23211, + "definition": 46758, + "deg": 13500, + "degree": 16863, + "del": 12381, + "delay": 40850, + "delete": 33678, + "dem": 9536, + "demand": 28550, + "democracy": 42017, + "democratic": 41232, + "demon": 26567, + "den": 6559, + "density": 43337, + "dep": 10378, + "depend": 45841, + "dependent": 21186, + "depending": 44023, + "depth": 18053, + "der": 1082, + "derived": 34631, + "des": 8906, + "desc": 20147, + "described": 34869, + "description": 11213, + "design": 26124, + "designed": 30473, + "desktop": 41375, + "despite": 41081, + "dest": 16520, + "destroy": 41659, + "destruct": 35678, + "det": 15255, + "detail": 49170, + "details": 36604, + "determination": 40869, + "dev": 7959, + "develop": 16244, + "developed": 33082, + "development": 31267, + "device": 25202, + "devices": 42034, + "df": 7568, + "dfx": 48753, + "dh": 34985, + "di": 10989, + "diagn": 47356, + "dial": 38969, + "dict": 11600, + "did": 20839, + "didn": 45168, + "die": 11979, + "dies": 25990, + "diff": 26069, + "different": 39799, + "dig": 12894, + "digit": 27003, + "digital": 34725, + "digy": 41923, + "dim": 27740, + "dimension": 46156, + "dimensional": 19577, + "din": 25194, + "dinand": 41993, + "ding": 12083, + "dir": 15908, + "direct": 12942, + "directed": 34762, + "direction": 37295, + "director": 35248, + "directory": 34945, + "dirty": 49075, + "dis": 6381, + "disable": 40223, + "disabled": 47730, + "disc": 15410, + "disciplinary": 40625, + "discrimination": 42723, + "disk": 39531, + "display": 13812, + "displayText": 31536, + "dist": 17080, + "distance": 30246, + "dit": 5266, + "div": 7146, + "division": 21426, + "dj": 28241, + "dk": 34388, + "dl": 25404, + "dll": 12736, + "dm": 36020, + "dn": 32656, + "do": 4598, + "doc": 15390, + "docker": 45986, + "docs": 31628, + "doctor": 35580, + "doctoral": 44064, + "document": 22897, + "documented": 47045, + "does": 22437, + "doesn": 45084, + "dog": 9703, + "dogs": 22242, + "doi": 34023, + "doing": 19631, + "dollar": 22569, + "dom": 3438, + "domain": 27830, + "dominated": 34475, + "doms": 23686, + "don": 9099, + "donald": 40915, + "done": 28060, + "door": 9424, + "doors": 19559, + "dor": 40180, + "dos": 37427, + "dose": 34436, + "dot": 26518, + "double": 23352, + "down": 2902, + "download": 15002, + "downs": 30371, + "dozen": 44932, + "dp": 26059, + "dq": 49506, + "dr": 7109, + "dra": 32491, + "draft": 35679, + "dragon": 14844, + "draw": 19334, + "drawn": 41549, + "dream": 25966, + "dress": 49380, + "dri": 7553, + "drive": 19472, + "driven": 15808, + "driver": 26230, + "drivers": 36702, + "driving": 24255, + "drm": 49007, + "dro": 22285, + "drop": 14781, + "dropping": 37554, + "drops": 49253, + "drug": 30349, + "dry": 39140, + "ds": 9310, + "dt": 28664, + "du": 646, + "duc": 6077, + "ducers": 41213, + "duct": 2359, + "duction": 11124, + "due": 23301, + "duino": 24493, + "dule": 5950, + "dullah": 23969, + "dump": 39455, + "duration": 32257, + "during": 42122, + "dust": 48859, + "duty": 26278, + "dx": 34350, + "dy": 9892, + "dyl": 30360, + "dylib": 31739, + "e": 68, + "ea": 18213, + "each": 27379, + "ead": 1329, + "eah": 4617, + "eal": 2287, + "ealing": 26919, + "ealous": 15746, + "eals": 10621, + "ean": 11025, + "eanor": 17663, + "ear": 451, + "earable": 40816, + "earance": 23435, + "earances": 35630, + "earch": 3679, + "earcher": 50194, + "earchers": 16604, + "eared": 3380, + "earing": 6648, + "early": 11458, + "earned": 39123, + "ears": 4127, + "earth": 16442, + "eas": 30412, + "east": 23316, + "easy": 38171, + "eat": 4098, + "eating": 30041, + "eatured": 20980, + "eatures": 11585, + "eaturing": 31347, + "eb": 1765, + "ebin": 23497, + "ebook": 16497, + "ebra": 37052, + "ebted": 35895, + "ebus": 33209, + "ec": 721, + "eca": 31047, + "ecake": 46557, + "ecast": 43299, + "ecause": 3156, + "ecd": 21142, + "ech": 3055, + "eches": 16672, + "echo": 30328, + "ecided": 35503, + "eco": 47704, + "econom": 13926, + "economic": 17079, + "ect": 478, + "ectar": 44504, + "ected": 11197, + "ection": 3213, + "ective": 13967, + "ectomy": 42505, + "ector": 9250, + "ecycle": 47510, + "ed": 276, + "edIn": 20801, + "eda": 18082, + "edar": 44226, + "eday": 23712, + "edd": 6048, + "edded": 47238, + "eddy": 21874, + "ede": 18654, + "eded": 15395, + "eden": 31829, + "eder": 5702, + "ederal": 2110, + "ederation": 9748, + "edes": 37507, + "edge": 14907, + "edged": 48916, + "edi": 13740, + "edia": 5507, + "edience": 20826, + "edient": 35279, + "edin": 27152, + "eding": 8228, + "edit": 19312, + "edited": 42131, + "edition": 28736, + "editor": 35352, + "edly": 49288, + "edo": 24757, + "edom": 3836, + "eds": 5379, + "edu": 15532, + "educ": 18123, + "educated": 27317, + "education": 40796, + "edy": 4716, + "ee": 1453, + "eed": 2308, + "eeds": 39642, + "eeee": 41591, + "eeks": 32201, + "eele": 26213, + "eely": 45269, + "eem": 13761, + "een": 6429, + "eenth": 28117, + "eeper": 41278, + "eer": 28153, + "eering": 48066, + "eers": 47619, + "ees": 2841, + "eez": 33105, + "ef": 891, + "efe": 22521, + "efeated": 36807, + "efer": 41027, + "eff": 14822, + "effect": 10760, + "effective": 16803, + "effects": 34435, + "effic": 24531, + "efficiency": 45888, + "efficient": 16814, + "efficients": 41945, + "efined": 18156, + "eful": 13839, + "efully": 7549, + "eg": 1533, + "ega": 26470, + "egal": 39839, + "eger": 11893, + "egg": 33856, + "egu": 15703, + "eh": 17231, + "ei": 20295, + "eight": 26022, + "either": 31336, + "ek": 988, + "eka": 38001, + "eker": 28233, + "eki": 39548, + "eking": 18754, + "eks": 2573, + "el": 417, + "ela": 10304, + "elaide": 25078, + "eland": 8822, + "elcome": 9571, + "ele": 11129, + "elect": 9509, + "elected": 28604, + "election": 14300, + "electric": 31067, + "eled": 18449, + "element": 30854, + "eless": 5321, + "elf": 7046, + "elfare": 27122, + "elfth": 44659, + "eli": 43733, + "elia": 25418, + "elight": 49984, + "eligible": 31595, + "elin": 27176, + "eline": 4470, + "elines": 20655, + "eling": 10809, + "elist": 46331, + "ell": 695, + "ella": 12627, + "ellar": 14203, + "ellation": 28828, + "elle": 13485, + "ellect": 6879, + "ellectual": 29706, + "elled": 11978, + "ellen": 40635, + "eller": 12368, + "ellery": 41800, + "elli": 23225, + "ellig": 2976, + "elligence": 3480, + "elligent": 32940, + "elling": 9417, + "ello": 11109, + "ellow": 5037, + "ells": 19187, + "elly": 6148, + "elman": 32370, + "eln": 45542, + "elo": 22126, + "elong": 21537, + "elope": 47329, + "els": 1424, + "else": 17772, + "elsen": 25328, + "elsh": 21564, + "elsius": 32495, + "elson": 10151, + "elt": 2120, + "elta": 12514, + "elve": 9954, + "elvet": 32667, + "em": 368, + "ema": 19687, + "emade": 21398, + "email": 12888, + "emaker": 32174, + "emale": 10144, + "eman": 8463, + "emark": 47626, + "emate": 47686, + "emb": 24419, + "embed": 20521, + "embedreportprint": 30898, + "ember": 1491, + "eme": 34755, + "emed": 9006, + "emen": 8952, + "ement": 972, + "ements": 3196, + "emer": 24677, + "emet": 19261, + "emetery": 19785, + "emi": 43967, + "emia": 22859, + "emic": 5314, + "emies": 5090, + "emin": 14857, + "eming": 46564, + "emis": 30561, + "emn": 37705, + "emo": 41903, + "emon": 7966, + "emonic": 50016, + "emonium": 33044, + "emort": 24466, + "emouth": 46880, + "emp": 45787, + "emphasis": 36663, + "empl": 18856, + "employ": 7033, + "employed": 36266, + "employment": 28812, + "emporary": 33080, + "empt": 1791, + "emption": 11221, + "empty": 28920, + "ems": 5232, + "emy": 3065, + "en": 268, + "ena": 8107, + "enable": 21633, + "enabled": 25616, + "ename": 12453, + "enance": 36368, + "enaries": 30216, + "enario": 39055, + "enary": 21629, + "enberg": 23140, + "enburg": 37036, + "enc": 12685, + "ence": 594, + "enced": 5864, + "encer": 12137, + "encers": 42288, + "ences": 3007, + "ench": 24421, + "encia": 29634, + "encies": 3976, + "encing": 9532, + "encrypted": 43628, + "ency": 1387, + "end": 437, + "enda": 7438, + "endale": 41147, + "endant": 23048, + "endants": 30841, + "endar": 9239, + "endars": 44942, + "endas": 35624, + "ende": 38396, + "ended": 1631, + "ender": 2194, + "endered": 30398, + "enders": 7338, + "endez": 41913, + "endi": 43109, + "endiary": 43034, + "endif": 32088, + "ending": 1571, + "endish": 48442, + "endium": 49811, + "endix": 19573, + "endment": 5904, + "endo": 31110, + "endon": 43153, + "endor": 18738, + "endra": 48286, + "ends": 2412, + "endum": 43755, + "ene": 1734, + "ened": 2945, + "eneg": 46495, + "enegger": 44028, + "enei": 46009, + "enemy": 46970, + "ener": 877, + "energy": 22554, + "eners": 36014, + "enery": 24156, + "enes": 18719, + "eness": 9449, + "enez": 11437, + "enezuel": 12596, + "enf": 33701, + "enforcement": 44976, + "enfranch": 39827, + "eng": 1516, + "enge": 3540, + "engeance": 21364, + "enged": 47422, + "enger": 6540, + "engers": 9302, + "enges": 34120, + "engine": 18392, + "engineering": 40321, + "english": 39126, + "ength": 3286, + "engu": 13561, + "enh": 16550, + "enhagen": 30347, + "eni": 43850, + "enic": 35866, + "ening": 3101, + "enium": 47477, + "enko": 32720, + "enment": 23242, + "enn": 1697, + "enna": 13713, + "enne": 29727, + "ennes": 42573, + "ennett": 48151, + "ennial": 27779, + "ennis": 10679, + "enny": 11870, + "eno": 23397, + "enos": 28380, + "enough": 48229, + "ens": 641, + "ensable": 33447, + "ensation": 25742, + "ense": 1072, + "ensed": 15385, + "ensen": 18756, + "enser": 45268, + "enses": 4541, + "ensible": 27339, + "ensibly": 28508, + "ensical": 46165, + "ensing": 26426, + "ension": 3004, + "ensional": 37176, + "ensions": 5736, + "ensis": 37834, + "ensitive": 18464, + "ensitivity": 40545, + "ensity": 6377, + "ensive": 2021, + "enson": 19069, + "ensor": 22854, + "enstein": 37975, + "ensual": 31406, + "ensus": 7314, + "ent": 298, + "enta": 29188, + "ental": 2470, + "entanyl": 41455, + "entary": 48648, + "ente": 21872, + "ented": 4714, + "enter": 9255, + "enth": 7944, + "enthal": 34728, + "ential": 1843, + "entially": 3746, + "entials": 14817, + "entimes": 43598, + "entin": 31371, + "enting": 36589, + "ention": 1463, + "entious": 43787, + "entity": 26858, + "entle": 8651, + "ently": 1473, + "ento": 50217, + "enton": 26673, + "entric": 22317, + "entry": 13000, + "ents": 658, + "enture": 36697, + "enty": 3787, + "enum": 44709, + "env": 24330, + "environment": 38986, + "eny": 28558, + "enz": 19471, + "enza": 23674, + "enzie": 26389, + "eon": 23277, + "eor": 13492, + "eous": 15303, + "ep": 538, + "epad": 47852, + "epend": 2690, + "ependence": 15091, + "ependent": 8682, + "eper": 5723, + "eph": 27446, + "eping": 7213, + "episode": 38668, + "eport": 45813, + "eps": 25386, + "ept": 19598, + "eq": 27363, + "equ": 4853, + "equal": 40496, + "equality": 48203, + "equipped": 40617, + "er": 263, + "era": 8607, + "eral": 1691, + "erala": 33314, + "erald": 12573, + "erate": 21620, + "erb": 23552, + "erc": 2798, + "ercise": 23697, + "erd": 45744, + "ere": 567, + "ered": 1068, + "eredith": 36897, + "eree": 45316, + "erek": 18238, + "erella": 36648, + "eren": 14226, + "erence": 1945, + "erences": 4972, + "erenn": 31915, + "erent": 9100, + "erential": 33369, + "ereo": 32934, + "erer": 11882, + "erers": 19288, + "erest": 1260, + "eret": 31229, + "erey": 48023, + "erg": 6422, + "ergic": 19793, + "ergus": 13607, + "erguson": 14168, + "ergy": 26079, + "eri": 33442, + "eria": 5142, + "erial": 48499, + "eric": 35626, + "erick": 41556, + "erie": 18287, + "eries": 10640, + "ering": 1586, + "erion": 28019, + "erity": 32821, + "erk": 9587, + "erker": 35779, + "erm": 7780, + "erman": 2224, + "ermanent": 30312, + "ermott": 46187, + "ern": 1142, + "ernal": 35220, + "ername": 13292, + "ernand": 13023, + "ernandez": 18092, + "ernaut": 37879, + "ernel": 7948, + "ernels": 44930, + "erness": 17447, + "erning": 8917, + "erno": 24100, + "ero": 3529, + "eros": 27498, + "erous": 48411, + "err": 8056, + "erred": 17436, + "errilla": 31859, + "error": 18224, + "errors": 48277, + "erry": 6996, + "ers": 364, + "ersed": 20204, + "ersen": 46516, + "ership": 49437, + "ersion": 6900, + "ersive": 24469, + "erson": 882, + "ert": 861, + "ertain": 1425, + "ertation": 42245, + "ertility": 27651, + "erto": 13806, + "ertodd": 36481, + "erton": 29111, + "erv": 712, + "erva": 32775, + "ervation": 13208, + "ervative": 22003, + "ervatives": 35291, + "erve": 3760, + "erved": 8520, + "erver": 18497, + "erves": 11184, + "erville": 33487, + "erving": 14344, + "ery": 1924, + "eryl": 44886, + "es": 274, + "esa": 49183, + "esame": 34038, + "esan": 42890, + "esar": 18964, + "esc": 3798, + "escal": 47647, + "escap": 50141, + "escape": 41915, + "escent": 45470, + "escription": 7260, + "ese": 2771, + "esh": 5069, + "esi": 46551, + "esian": 35610, + "esides": 11788, + "esis": 9339, + "esity": 11924, + "esley": 49048, + "esm": 45798, + "esome": 5927, + "eson": 42038, + "esp": 9774, + "especially": 16480, + "espie": 42120, + "esque": 28939, + "ess": 408, + "essa": 21411, + "essage": 7589, + "esse": 35270, + "essed": 6676, + "essee": 10702, + "essel": 7878, + "essen": 44483, + "essential": 31195, + "essert": 20335, + "esses": 44667, + "essim": 30265, + "essing": 27289, + "ession": 2521, + "essional": 12743, + "essions": 6202, + "essler": 33730, + "essment": 21687, + "esson": 39670, + "essor": 5987, + "essors": 23295, + "est": 395, + "esta": 18059, + "establish": 40037, + "established": 27718, + "establishment": 44390, + "estamp": 27823, + "estate": 44146, + "estation": 27364, + "este": 29872, + "estead": 37897, + "ested": 7287, + "esteem": 31869, + "ester": 7834, + "estern": 3330, + "esters": 8586, + "esthes": 29678, + "esthesia": 34811, + "esthetic": 37531, + "estial": 21711, + "estic": 4699, + "estinal": 34284, + "estine": 27374, + "esting": 37761, + "estival": 6743, + "eston": 19115, + "estone": 13631, + "estones": 30637, + "estro": 47692, + "ests": 3558, + "esty": 9673, + "estyle": 10992, + "estyles": 42530, + "esville": 19641, + "esy": 9259, + "et": 316, + "eta": 17167, + "etary": 8527, + "etc": 14784, + "etch": 7569, + "etchup": 47132, + "ete": 14471, + "eteen": 34026, + "eteenth": 26425, + "eter": 2357, + "eteria": 39622, + "etermin": 13221, + "etermination": 29610, + "etermined": 23444, + "eters": 7307, + "eth": 2788, + "ethe": 10567, + "etheless": 12845, + "ether": 6750, + "etheus": 36916, + "ethical": 32949, + "ethnic": 38546, + "ethy": 33077, + "ethyl": 21610, + "ethyst": 44166, + "etic": 5139, + "etically": 16877, + "etics": 14596, + "eties": 31638, + "etime": 8079, + "etimes": 46874, + "eting": 13629, + "etition": 15620, + "etitive": 17295, + "eto": 27206, + "eton": 18483, + "etooth": 16271, + "etr": 21879, + "etric": 19482, + "etrical": 34546, + "etry": 11973, + "ets": 1039, + "etsk": 29515, + "etsu": 30470, + "etsy": 34877, + "ett": 3087, + "etta": 15253, + "ette": 5857, + "ettel": 47417, + "etter": 40088, + "ettes": 23014, + "etti": 24851, + "etting": 35463, + "ettings": 12374, + "ettle": 23570, + "ettlement": 27331, + "etts": 9357, + "etus": 29158, + "ety": 2963, + "etz": 23773, + "eu": 12496, + "eur": 23365, + "euro": 44252, + "eus": 27650, + "ev": 1990, + "eva": 48855, + "eval": 18206, + "evaluate": 49786, + "eve": 44655, + "even": 10197, + "event": 15596, + "events": 31534, + "ever": 964, + "everal": 8438, + "every": 16833, + "everyone": 47057, + "everything": 37814, + "evidence": 46817, + "evil": 23542, + "evin": 6830, + "ew": 413, + "eware": 29725, + "ewater": 21422, + "eway": 16172, + "eways": 43613, + "ewitness": 28588, + "ework": 6433, + "eworks": 19653, + "eworld": 38136, + "eworthy": 25969, + "ews": 15515, + "ewski": 46151, + "ex": 1069, + "examination": 47779, + "example": 20688, + "exc": 41194, + "except": 16341, + "excluding": 42218, + "exclusive": 41195, + "exe": 13499, + "exec": 18558, + "execute": 41049, + "exempt": 42679, + "exist": 38476, + "existence": 41084, + "existent": 32786, + "existing": 25687, + "exit": 37023, + "exp": 11201, + "expected": 40319, + "expensive": 22031, + "exper": 23100, + "expl": 20676, + "export": 39344, + "expr": 31937, + "express": 42712, + "expression": 38011, + "ext": 2302, + "external": 22615, + "externalActionCode": 31576, + "extra": 26086, + "extreme": 29896, + "extremely": 41073, + "ey": 2959, + "eye": 25379, + "eyed": 18834, + "eyes": 48418, + "ez": 8471, + "ezvous": 50063, + "f": 69, + "fa": 13331, + "fab": 36434, + "fac": 38942, + "face": 2550, + "facebook": 19024, + "faced": 24903, + "faces": 32186, + "facing": 29532, + "fact": 22584, + "factor": 31412, + "facts": 37473, + "fail": 32165, + "failed": 47904, + "fair": 22043, + "faith": 41751, + "fake": 30706, + "fal": 42932, + "fall": 7207, + "falls": 23348, + "false": 9562, + "fam": 44769, + "family": 17989, + "famous": 45143, + "fan": 24408, + "far": 16370, + "fare": 9496, + "farious": 41504, + "farm": 43323, + "fascist": 46928, + "fashion": 25265, + "fashioned": 28776, + "fast": 7217, + "fat": 17359, + "father": 11358, + "favorite": 35200, + "fax": 23560, + "fb": 21855, + "fc": 16072, + "fd": 16344, + "fe": 5036, + "feat": 27594, + "feature": 30053, + "features": 40890, + "fect": 2309, + "fecture": 36637, + "fed": 19082, + "fee": 39071, + "feed": 12363, + "feeding": 22824, + "feel": 36410, + "feet": 39690, + "feld": 16265, + "fell": 23299, + "felt": 31985, + "female": 24724, + "femin": 33594, + "fen": 41037, + "fer": 2232, + "ference": 4288, + "ferred": 18186, + "fest": 23411, + "fet": 34045, + "fetched": 50012, + "few": 32146, + "ff": 487, + "ffe": 16658, + "ffect": 4812, + "ffee": 5853, + "ffen": 46985, + "ffer": 36761, + "fff": 20972, + "ffff": 12927, + "ffic": 2108, + "fficiency": 35590, + "fficient": 5632, + "ffield": 31374, + "ffiti": 25198, + "fg": 40616, + "fi": 12463, + "fiction": 24046, + "field": 3245, + "fields": 25747, + "fif": 32041, + "fifth": 43556, + "fig": 5647, + "fight": 15481, + "fighter": 24733, + "fighters": 17114, + "fighting": 26594, + "fights": 50121, + "figure": 26875, + "figured": 46296, + "fil": 10379, + "file": 7753, + "filename": 34345, + "files": 16624, + "fill": 20797, + "filled": 20286, + "film": 26240, + "filter": 24455, + "fin": 15643, + "final": 20311, + "finals": 32089, + "financial": 46921, + "find": 19796, + "finder": 22805, + "finding": 41070, + "fine": 38125, + "fing": 28825, + "finger": 35461, + "finished": 43952, + "fire": 6495, + "fired": 26803, + "fires": 27312, + "first": 11085, + "fish": 11084, + "fit": 11147, + "fits": 21013, + "fitted": 38631, + "fitting": 32232, + "five": 13261, + "fix": 13049, + "fixed": 34021, + "fixes": 42624, + "fl": 2704, + "flag": 32109, + "flags": 33152, + "flake": 47597, + "flame": 49621, + "flash": 34167, + "flat": 38568, + "flation": 33521, + "fle": 27919, + "fledged": 45223, + "fleet": 33559, + "flex": 32880, + "flies": 27959, + "flight": 22560, + "flix": 10046, + "flo": 48679, + "float": 22468, + "floor": 28300, + "flow": 11125, + "flower": 25547, + "flows": 44041, + "flu": 35522, + "flush": 25925, + "fly": 12254, + "flying": 45928, + "fm": 38353, + "fman": 35826, + "fml": 38122, + "fn": 22184, + "fo": 6513, + "focus": 37635, + "focused": 18143, + "fol": 9062, + "fold": 11379, + "folder": 43551, + "folio": 13652, + "folios": 45242, + "folk": 19956, + "follow": 27780, + "font": 10331, + "foo": 21943, + "food": 19425, + "foot": 5898, + "football": 15914, + "footed": 43127, + "for": 1640, + "force": 3174, + "forced": 12072, + "forcement": 13442, + "forcer": 45515, + "forces": 27087, + "forcing": 18766, + "ford": 3841, + "fore": 754, + "foreign": 38823, + "foreseen": 44952, + "forest": 29623, + "forestation": 41570, + "forge": 30293, + "fork": 32523, + "form": 687, + "formance": 10367, + "format": 18982, + "formation": 1161, + "formed": 12214, + "former": 16354, + "formerly": 36234, + "forming": 15464, + "forms": 23914, + "fort": 3319, + "fortable": 12065, + "forth": 25718, + "forts": 47378, + "fortunately": 6668, + "fortune": 37359, + "forum": 27302, + "forums": 37141, + "forward": 11813, + "found": 9275, + "foundation": 42526, + "founded": 27060, + "founder": 15454, + "foundland": 42030, + "four": 14337, + "fourth": 49393, + "fox": 12792, + "fp": 46428, + "fps": 29647, + "fr": 8310, + "frac": 31944, + "fram": 19298, + "frame": 14535, + "frames": 37805, + "framework": 30604, + "fre": 19503, + "fred": 39193, + "free": 5787, + "freedom": 41295, + "frequency": 35324, + "fresh": 48797, + "frey": 37425, + "fried": 25520, + "friend": 6726, + "friendly": 13120, + "friends": 36154, + "frog": 49956, + "from": 6738, + "front": 8534, + "fruit": 34711, + "fs": 9501, + "ft": 701, + "ften": 14785, + "fter": 637, + "fters": 47131, + "ftime": 31387, + "fts": 35594, + "fty": 19628, + "fu": 20942, + "fuck": 31699, + "fuel": 25802, + "ful": 913, + "full": 12853, + "fully": 2759, + "fulness": 15538, + "fun": 12543, + "func": 20786, + "function": 8818, + "functional": 45124, + "fund": 10990, + "funded": 18246, + "funding": 25032, + "fur": 38916, + "furt": 29205, + "fusc": 37695, + "future": 37443, + "fw": 44482, + "fx": 21373, + "fy": 24928, + "g": 70, + "ga": 4908, + "gaard": 36232, + "gado": 50054, + "gae": 25002, + "gage": 10502, + "gain": 48544, + "gal": 13528, + "galitarian": 39907, + "gall": 39580, + "gallery": 24460, + "gam": 28483, + "game": 6057, + "gamer": 36515, + "games": 19966, + "gaming": 48616, + "gan": 1030, + "gang": 28284, + "gans": 39352, + "gap": 43554, + "gar": 4563, + "gard": 19977, + "gars": 25821, + "gart": 41651, + "gary": 14849, + "gas": 22649, + "gat": 41268, + "gate": 10494, + "gay": 22744, + "gb": 22296, + "gc": 36484, + "gd": 21287, + "gdala": 40420, + "ge": 469, + "geant": 30205, + "gear": 31763, + "gebra": 29230, + "ged": 2004, + "gee": 29622, + "geist": 49782, + "gel": 25280, + "gem": 24090, + "gement": 16025, + "gements": 43547, + "gemony": 38953, + "gen": 5235, + "gence": 12745, + "gencies": 33333, + "gency": 4949, + "gender": 8388, + "gener": 8612, + "general": 24622, + "generated": 27568, + "generation": 20158, + "generic": 41357, + "genic": 38516, + "genre": 35850, + "gent": 6783, + "gently": 34727, + "geon": 6281, + "geoning": 31614, + "geons": 16297, + "ger": 1362, + "gerald": 26941, + "gered": 10446, + "geries": 30230, + "gers": 5355, + "gery": 7076, + "ges": 3212, + "gest": 3495, + "get": 1136, + "getic": 24321, + "gets": 11407, + "gettable": 42182, + "getting": 37210, + "gew": 39909, + "gewater": 40843, + "gex": 25636, + "gey": 39608, + "gg": 1130, + "gged": 11178, + "gger": 26679, + "ggie": 23571, + "ggies": 33049, + "gging": 18792, + "ggle": 16444, + "ggles": 32723, + "ggy": 19970, + "gh": 456, + "gha": 46090, + "ghai": 20380, + "ghan": 6064, + "ghazi": 21775, + "ghost": 38933, + "gi": 12397, + "gian": 18299, + "gie": 22699, + "giene": 28363, + "gif": 27908, + "gil": 37718, + "gin": 1655, + "ging": 2667, + "gins": 29878, + "ginx": 42822, + "gio": 27769, + "girl": 15219, + "girlfriend": 45189, + "girls": 36960, + "git": 18300, + "github": 12567, + "give": 26535, + "given": 35569, + "giving": 13992, + "gl": 4743, + "glas": 14391, + "glass": 20721, + "glers": 33641, + "gling": 40799, + "global": 20541, + "glomer": 37757, + "gly": 10853, + "gm": 39870, + "gmail": 14816, + "gment": 5154, + "gments": 11726, + "gn": 4593, + "gnu": 41791, + "go": 2188, + "goal": 35231, + "gob": 44270, + "god": 25344, + "goers": 31006, + "going": 5146, + "gold": 24267, + "gom": 19120, + "gomery": 20142, + "gon": 14520, + "gone": 21260, + "goo": 42469, + "good": 11274, + "google": 13297, + "gor": 7053, + "gorith": 7727, + "gorithm": 42289, + "got": 23442, + "gotten": 21646, + "gov": 9567, + "govern": 47866, + "government": 14480, + "governmental": 31353, + "govtrack": 41230, + "gow": 21175, + "gp": 31197, + "gpu": 46999, + "gr": 2164, + "gra": 46784, + "grab": 32393, + "grad": 9744, + "gradation": 26317, + "grade": 9526, + "graded": 21791, + "grades": 31177, + "gradient": 49607, + "grading": 29247, + "graduate": 17680, + "grain": 48270, + "gram": 4546, + "gran": 46324, + "grand": 23936, + "graph": 34960, + "grass": 29815, + "grave": 41711, + "gravity": 46453, + "gray": 44605, + "gre": 16694, + "greSQL": 47701, + "great": 18223, + "green": 14809, + "greg": 9903, + "gregation": 17097, + "gren": 32762, + "gres": 34239, + "gress": 5914, + "gression": 32383, + "gressive": 19741, + "grey": 49502, + "grid": 25928, + "grim": 33563, + "gro": 27333, + "gross": 47181, + "ground": 2833, + "grounds": 40520, + "group": 8094, + "groupon": 14531, + "groups": 24432, + "grow": 45921, + "growing": 25167, + "grown": 22377, + "growth": 27922, + "gru": 48929, + "gs": 14542, + "gt": 13655, + "gu": 5162, + "guard": 14864, + "guards": 33427, + "gue": 18701, + "gui": 48317, + "guide": 41311, + "guided": 23657, + "gun": 7145, + "guns": 44265, + "gur": 45073, + "guy": 22932, + "guyen": 39922, + "gy": 1360, + "gyn": 40183, + "gypt": 6022, + "gz": 34586, + "h": 71, + "ha": 3099, + "haar": 42948, + "hab": 5976, + "habi": 37362, + "hack": 31153, + "had": 18108, + "hai": 44488, + "hair": 27108, + "haired": 29972, + "hak": 43573, + "hal": 14201, + "half": 13959, + "hall": 18323, + "halla": 41911, + "ham": 2763, + "hammad": 14875, + "hammer": 17980, + "han": 7637, + "hand": 4993, + "handed": 13638, + "handedly": 43919, + "hander": 44510, + "handle": 28144, + "handled": 38788, + "handler": 30281, + "hands": 43365, + "hang": 33255, + "hani": 29839, + "hao": 23778, + "hap": 45897, + "happy": 34191, + "haps": 2772, + "har": 9869, + "hard": 10424, + "hardt": 28375, + "hare": 43466, + "hari": 49573, + "harm": 29155, + "hart": 18647, + "has": 10134, + "hash": 17831, + "hat": 5183, + "hate": 37035, + "hatt": 11653, + "hattan": 12904, + "haul": 15194, + "haus": 30404, + "haust": 42456, + "have": 14150, + "haven": 39487, + "having": 40965, + "haw": 26615, + "hawk": 40624, + "hawks": 27221, + "hazard": 37598, + "hd": 31298, + "he": 258, + "hea": 21632, + "head": 2256, + "headed": 15353, + "header": 25677, + "headers": 50145, + "heading": 33878, + "heads": 16600, + "health": 13948, + "healthy": 22796, + "heard": 23636, + "heart": 11499, + "hearted": 20122, + "heartedly": 44407, + "heast": 9522, + "heastern": 18160, + "heat": 25080, + "heavy": 23701, + "hed": 704, + "heddar": 44937, + "hedon": 46086, + "hedral": 21962, + "hee": 21067, + "heed": 23616, + "heet": 25473, + "hei": 27392, + "heid": 28420, + "height": 17015, + "heim": 9096, + "heimer": 16288, + "heit": 29361, + "hel": 2978, + "held": 10217, + "helial": 35566, + "hell": 12758, + "helle": 34454, + "hello": 31373, + "helm": 33485, + "help": 16794, + "helps": 35194, + "hem": 4411, + "hemat": 10024, + "hematic": 23380, + "hematically": 46558, + "hement": 35347, + "hemer": 39557, + "hemoth": 34394, + "hemy": 36598, + "hen": 831, + "hend": 15631, + "hene": 29473, + "heng": 31753, + "henko": 30161, + "hens": 5135, + "hent": 6925, + "heny": 47413, + "heon": 37060, + "her": 372, + "here": 1456, + "hered": 6083, + "herence": 23545, + "herent": 8334, + "herer": 48386, + "heres": 19079, + "heric": 15011, + "herical": 37910, + "hern": 2881, + "hero": 11718, + "herry": 13372, + "hers": 7084, + "herty": 29029, + "hes": 956, + "hesda": 30049, + "heses": 39815, + "hesion": 32582, + "hesis": 8497, + "hesive": 25938, + "hess": 33979, + "hest": 3634, + "hester": 19593, + "het": 3202, + "hetamine": 25385, + "heter": 43332, + "hetic": 6587, + "hetical": 21485, + "hetically": 31786, + "hetics": 24965, + "hett": 17442, + "hetti": 33392, + "hetto": 35619, + "hew": 6391, + "hews": 40645, + "hex": 33095, + "hey": 20342, + "hh": 12337, + "hhh": 49126, + "hhhh": 36607, + "hi": 5303, + "hib": 3145, + "hiba": 49224, + "hibit": 26964, + "hibited": 44139, + "hibition": 24108, + "hid": 49675, + "hidden": 30342, + "hide": 24717, + "hift": 29323, + "hig": 25196, + "high": 8929, + "higher": 46503, + "highest": 35323, + "highly": 47444, + "hill": 12639, + "hillary": 47826, + "him": 38400, + "hin": 20079, + "hing": 722, + "hip": 1056, + "hips": 5748, + "hire": 10695, + "hiro": 49907, + "hirt": 49756, + "his": 14363, + "hist": 10034, + "historic": 31304, + "history": 23569, + "hit": 17945, + "hitting": 48320, + "hl": 18519, + "hler": 49737, + "hm": 23940, + "hma": 21720, + "hn": 21116, + "hner": 22277, + "ho": 8873, + "hod": 2065, + "hoe": 38979, + "hof": 39891, + "hoff": 36092, + "hog": 31897, + "hol": 3937, + "hold": 2946, + "holder": 13829, + "holders": 10476, + "holding": 19216, + "hole": 13207, + "holes": 28439, + "holiday": 37689, + "holm": 22981, + "holy": 44287, + "hom": 26452, + "home": 11195, + "hon": 24130, + "hood": 2894, + "hook": 25480, + "hooting": 35486, + "hop": 8548, + "hops": 21936, + "hor": 17899, + "horn": 25311, + "horse": 30527, + "hospital": 49257, + "host": 4774, + "hot": 8940, + "hots": 17398, + "hou": 15710, + "houn": 47714, + "hound": 39047, + "hour": 9769, + "hours": 24425, + "house": 4803, + "houses": 20089, + "housing": 50028, + "hov": 28026, + "hovah": 33023, + "hover": 43753, + "how": 4919, + "hower": 33539, + "hp": 24831, + "hr": 11840, + "hra": 45056, + "hran": 16848, + "href": 33257, + "hs": 11994, + "ht": 4352, + "htaking": 34148, + "htar": 38672, + "htm": 19211, + "html": 6494, + "htt": 2804, + "http": 4023, + "https": 5450, + "hu": 13415, + "hua": 33061, + "hub": 40140, + "huge": 40878, + "hum": 17047, + "human": 10734, + "humane": 44766, + "humans": 40205, + "hun": 20088, + "hung": 43274, + "hunt": 35060, + "hunter": 37488, + "hur": 48349, + "hurst": 33500, + "hus": 7537, + "husband": 48912, + "hw": 36599, + "hy": 12114, + "hya": 48812, + "hyd": 15511, + "hyde": 39175, + "hyp": 36362, + "hyper": 49229, + "hz": 32179, + "i": 72, + "iHUD": 38370, + "iOS": 35742, + "iPhone": 37032, + "ia": 544, + "iability": 12455, + "iable": 3379, + "iably": 18745, + "iac": 9607, + "iae": 33100, + "iage": 42360, + "iago": 29601, + "iah": 9520, + "iak": 32994, + "ial": 498, + "ially": 1927, + "ials": 8231, + "iam": 1789, + "iameter": 13173, + "iami": 7871, + "iamond": 8446, + "ian": 666, + "iana": 7484, + "iance": 3610, + "iances": 16097, + "iane": 46470, + "iang": 15483, + "iani": 25111, + "iann": 28627, + "iannopoulos": 36408, + "iano": 10115, + "ians": 1547, + "iant": 3014, + "iants": 17883, + "iao": 13481, + "iar": 12571, + "iard": 42425, + "iaries": 18361, + "iary": 8042, + "ias": 4448, + "iasco": 40025, + "iasis": 48455, + "iasm": 16401, + "iat": 5375, + "iate": 9386, + "iated": 12931, + "iates": 32820, + "iating": 26336, + "iation": 3920, + "iations": 40356, + "iator": 38585, + "iatric": 11439, + "iatrics": 36549, + "iatures": 42711, + "iatus": 34704, + "iaz": 17890, + "iazep": 48826, + "ib": 571, + "iba": 23718, + "ibaba": 37541, + "ibal": 21342, + "iban": 14278, + "iband": 35967, + "ibble": 43992, + "ibe": 32438, + "ibel": 43837, + "iber": 1856, + "iberal": 16813, + "ibi": 27567, + "ibia": 41145, + "ibilities": 7992, + "ibility": 2247, + "ibl": 10506, + "ible": 856, + "ibles": 18764, + "ibli": 29142, + "iblical": 16897, + "ibling": 27448, + "iblings": 19389, + "ibliography": 45689, + "ibly": 3193, + "ibo": 26762, + "ibr": 2889, + "ibrarian": 35808, + "ibraries": 11127, + "ibrary": 4115, + "ibu": 33828, + "ibur": 38616, + "ibus": 26333, + "ic": 291, + "ica": 3970, + "icable": 18424, + "icably": 41685, + "icago": 4549, + "ical": 605, + "ically": 1146, + "icals": 20155, + "ican": 7490, + "icans": 22398, + "icas": 44645, + "icate": 5344, + "icated": 3474, + "icates": 16856, + "icating": 12364, + "ication": 3299, + "ications": 3736, + "icative": 43058, + "icator": 26407, + "icators": 44549, + "icc": 44240, + "ice": 501, + "iced": 3711, + "icent": 36712, + "iceps": 41663, + "icer": 16647, + "ices": 1063, + "icester": 26382, + "ich": 488, + "ichael": 40302, + "iche": 14234, + "ichen": 41437, + "ichever": 22617, + "ichi": 16590, + "ichick": 38448, + "ichita": 41940, + "icho": 38720, + "icht": 30830, + "ici": 44070, + "icia": 33577, + "icial": 6652, + "ician": 6749, + "icians": 5106, + "iciary": 13556, + "icidal": 21488, + "icide": 5285, + "icides": 16751, + "iciency": 19777, + "icient": 11373, + "icing": 6345, + "icio": 46441, + "icion": 47430, + "icious": 6243, + "icip": 4311, + "icipated": 40988, + "icism": 11965, + "icist": 48187, + "icit": 3628, + "icity": 8467, + "ick": 624, + "icka": 29873, + "icked": 9484, + "icken": 5973, + "icker": 15799, + "ickers": 21630, + "icket": 9715, + "ickets": 15970, + "ickey": 40389, + "icking": 7958, + "ickle": 39423, + "ickr": 18994, + "icks": 3378, + "ickson": 46381, + "icky": 17479, + "icle": 1548, + "icles": 2983, + "ico": 3713, + "icol": 27045, + "icon": 4749, + "icone": 27981, + "icons": 34280, + "icro": 2500, + "icrobial": 48518, + "ics": 873, + "ict": 713, + "icted": 5722, + "icter": 36278, + "iction": 2867, + "ictional": 47273, + "ictionary": 14188, + "ictions": 9278, + "ictive": 45279, + "icts": 14137, + "icular": 13174, + "icularly": 22585, + "icult": 2249, + "icultural": 26823, + "iculture": 47428, + "iculty": 22402, + "icum": 39901, + "icus": 24552, + "icut": 13554, + "icy": 4611, + "icycle": 35298, + "icz": 28051, + "id": 312, + "ida": 3755, + "idable": 23321, + "idad": 32482, + "idae": 31718, + "idal": 11624, + "idan": 27610, + "idas": 24496, + "idate": 20540, + "idated": 41475, + "idates": 37051, + "idation": 24765, + "idav": 20331, + "iday": 2567, + "idays": 13842, + "idd": 1638, + "idden": 4651, + "idding": 13494, + "iddle": 2509, + "iddled": 34897, + "iddler": 26458, + "iddles": 29319, + "iddling": 41367, + "iddy": 34208, + "ide": 485, + "ided": 1384, + "idel": 5943, + "idelines": 7984, + "idelity": 23091, + "idem": 28913, + "iden": 14029, + "idence": 1704, + "idences": 44845, + "idency": 9147, + "ident": 738, + "idental": 35182, + "identally": 23961, + "idential": 35599, + "identified": 19107, + "idently": 46046, + "idents": 3231, + "ideo": 1651, + "ideon": 42381, + "ideos": 4921, + "idepress": 25895, + "ider": 1304, + "idered": 3089, + "iders": 4157, + "ides": 1460, + "ideshow": 42286, + "idespread": 9790, + "idge": 3130, + "idges": 15969, + "idget": 17484, + "idi": 19830, + "idia": 38513, + "idian": 19825, + "idine": 39422, + "iding": 2530, + "idious": 33243, + "idis": 29207, + "idity": 17995, + "idium": 43523, + "ido": 17305, + "idon": 47287, + "ids": 2340, + "idth": 5649, + "idy": 19325, + "ie": 494, + "iece": 8535, + "ied": 798, + "ief": 2086, + "ieft": 49868, + "ieg": 15702, + "iege": 14566, + "iegel": 28210, + "iel": 8207, + "ield": 1164, + "ielding": 30449, + "iem": 26597, + "ien": 2013, + "ience": 1240, + "ienced": 26343, + "iences": 10035, + "iencies": 22139, + "iency": 6160, + "ienne": 37938, + "iens": 10465, + "ient": 1153, + "ients": 2334, + "ier": 959, + "iera": 41976, + "ierce": 9798, + "iere": 13235, + "ieri": 29864, + "ierra": 16367, + "ierre": 31058, + "ierrez": 44448, + "iers": 3183, + "iership": 36689, + "iery": 23012, + "ies": 444, + "iesel": 29893, + "iest": 6386, + "iesta": 36283, + "iet": 1155, + "ietal": 21587, + "ieth": 19235, + "ieties": 9545, + "iets": 27955, + "iety": 1905, + "ieu": 22304, + "iev": 11203, + "ieval": 14671, + "ieve": 12311, + "ieved": 39591, + "iever": 47818, + "ievers": 30296, + "ieves": 17974, + "ieving": 30749, + "iew": 769, + "iewicz": 48596, + "if": 361, + "ifa": 19215, + "ifact": 29660, + "ifacts": 37199, + "ifax": 26590, + "ife": 901, + "ifer": 7087, + "iferation": 49801, + "ifest": 8409, + "ifestyle": 42004, + "iff": 733, + "iffe": 22391, + "ifference": 33012, + "ifferent": 17125, + "iffin": 42022, + "iffs": 10203, + "ifi": 22238, + "ifiable": 16823, + "ific": 811, + "ificant": 17294, + "ificantly": 42491, + "ificate": 22460, + "ification": 2649, + "ifications": 6637, + "ifice": 9680, + "ificent": 21559, + "ificial": 9542, + "ified": 1431, + "ifier": 7483, + "ifiers": 13350, + "ifies": 6945, + "ifix": 42169, + "ifle": 8316, + "ifled": 47157, + "ifles": 16063, + "ifling": 38966, + "iflower": 42642, + "iform": 6933, + "iframe": 39621, + "ift": 2135, + "ifted": 21715, + "ifter": 18171, + "ifting": 13309, + "ifts": 19265, + "ifty": 24905, + "iful": 4135, + "ifully": 17049, + "ify": 1958, + "ifying": 4035, + "ig": 328, + "iga": 13827, + "igan": 5516, + "igans": 34090, + "igate": 10055, + "igated": 26963, + "igating": 29129, + "igation": 7065, + "igator": 23823, + "igators": 25975, + "ige": 10045, + "igel": 47709, + "igen": 9324, + "igenous": 12357, + "igent": 47096, + "iger": 8254, + "igers": 34984, + "igg": 6950, + "igger": 15249, + "iggins": 23567, + "iggle": 24082, + "iggs": 20340, + "iggurat": 44557, + "igh": 394, + "igham": 34000, + "ighed": 12570, + "ight": 432, + "ighter": 4799, + "ighters": 6261, + "ighth": 10887, + "ighthouse": 32303, + "ighting": 47610, + "ighton": 42993, + "ights": 2337, + "ighty": 14400, + "igi": 25754, + "igible": 26032, + "igil": 27187, + "igion": 17035, + "igious": 10956, + "igl": 38686, + "igm": 17225, + "igma": 13495, + "igmat": 32441, + "igmatic": 38860, + "ign": 570, + "ignant": 25114, + "igne": 48946, + "igned": 3916, + "igning": 38944, + "ignment": 16747, + "ignore": 46430, + "ignt": 16891, + "ignty": 17224, + "igo": 14031, + "igon": 37107, + "igor": 36274, + "igr": 3692, + "igrant": 9893, + "igrants": 5663, + "igraph": 45920, + "igrate": 42175, + "igrated": 38769, + "igration": 4254, + "igree": 41233, + "igroup": 47875, + "igs": 9235, + "igsaw": 45636, + "igslist": 40704, + "igue": 15212, + "igun": 50118, + "iguous": 29709, + "igure": 7047, + "ih": 4449, + "ihad": 11166, + "ihadi": 42449, + "ihar": 38405, + "ihara": 45902, + "ihil": 20898, + "ihilation": 33299, + "ihu": 48406, + "ii": 4178, + "iii": 15479, + "ij": 2926, + "ija": 34655, + "ijah": 32778, + "iji": 20770, + "ijing": 11030, + "ijk": 45961, + "ijn": 48848, + "ijuana": 5343, + "ik": 1134, + "ika": 9232, + "ikan": 49894, + "ikarp": 36850, + "ikawa": 40398, + "ike": 522, + "iked": 17951, + "iken": 29943, + "iker": 18320, + "ikers": 24913, + "ikes": 7938, + "ikh": 13848, + "ikhail": 39065, + "iki": 5580, + "iking": 14132, + "ikini": 35542, + "ikk": 36073, + "iko": 12125, + "iku": 28643, + "ikuman": 42889, + "iky": 47536, + "il": 346, + "ila": 10102, + "ilage": 50006, + "ilan": 38239, + "iland": 40855, + "ilant": 37794, + "ilantro": 48311, + "ilar": 1794, + "ilated": 40080, + "ilater": 38601, + "ilateral": 14796, + "ilaterally": 39707, + "ilation": 10520, + "ild": 688, + "ilda": 27281, + "ilde": 44725, + "ilded": 46158, + "ildo": 39583, + "ile": 576, + "ileaks": 27983, + "iled": 3902, + "ilee": 40626, + "ileen": 42236, + "ilege": 41866, + "ileged": 48446, + "iler": 5329, + "ilers": 34393, + "iles": 2915, + "iless": 30608, + "ilet": 41550, + "iley": 9618, + "ili": 2403, + "ilia": 17517, + "ilial": 43475, + "ilian": 35824, + "iliar": 4797, + "iliary": 28129, + "iliate": 49826, + "iliated": 31705, + "iliation": 15547, + "ilib": 22282, + "ilibrium": 24741, + "ilic": 41896, + "ilies": 3922, + "ilight": 15512, + "iling": 4386, + "ilings": 43271, + "ilingual": 34900, + "ilion": 29935, + "ilipp": 8908, + "ilit": 6392, + "ilitarian": 43900, + "ilitary": 18748, + "ilitating": 34871, + "ilitation": 18194, + "ilities": 2410, + "ility": 879, + "ilk": 43545, + "ill": 359, + "illa": 5049, + "illac": 40607, + "illance": 7682, + "illard": 32681, + "illary": 15856, + "illas": 25314, + "illation": 40903, + "ille": 8270, + "illed": 2967, + "illegal": 47749, + "iller": 4665, + "illery": 14920, + "illes": 21718, + "illet": 32512, + "illi": 50173, + "illian": 37896, + "illin": 32672, + "illing": 4509, + "illion": 1131, + "illions": 40083, + "illo": 16111, + "illon": 23027, + "ills": 2171, + "illus": 44342, + "illusion": 35760, + "illy": 6548, + "ilo": 18526, + "ilogy": 19202, + "ilon": 33576, + "ilot": 23439, + "ils": 4487, + "ilst": 11750, + "ilt": 2326, + "ilton": 9044, + "iltr": 19438, + "iltration": 36055, + "ilts": 50076, + "ilty": 6267, + "ilus": 35815, + "ilver": 46978, + "ily": 813, + "ilyn": 38020, + "im": 320, + "ima": 8083, + "imag": 48466, + "image": 9060, + "images": 17566, + "imal": 4402, + "iman": 24086, + "imar": 49399, + "imaru": 49551, + "imate": 1920, + "imated": 15655, + "imately": 3358, + "imates": 26748, + "imating": 39204, + "imation": 18991, + "imb": 14107, + "imbabwe": 27175, + "imble": 34477, + "ime": 524, + "imedia": 20626, + "imei": 45519, + "imen": 19027, + "imens": 12117, + "imensional": 16198, + "iment": 3681, + "imental": 9134, + "imentary": 39051, + "iments": 6800, + "imeo": 47776, + "imer": 22723, + "imes": 999, + "imester": 47484, + "imet": 38813, + "imeter": 16912, + "imeters": 31551, + "img": 9600, + "imgur": 19791, + "imi": 25236, + "imil": 26641, + "imilar": 49941, + "imilation": 42963, + "iminary": 38429, + "imir": 13057, + "imity": 18853, + "imize": 48439, + "imm": 8608, + "immer": 10957, + "immers": 36904, + "immigrant": 39835, + "immigration": 47620, + "imming": 27428, + "immune": 38345, + "imo": 25147, + "imon": 20473, + "imony": 33969, + "imore": 9401, + "imoto": 43354, + "imov": 44273, + "imp": 11011, + "impact": 48240, + "impl": 23928, + "import": 11748, + "important": 18049, + "imposed": 36457, + "impro": 32077, + "improve": 49453, + "ims": 12078, + "imsy": 48295, + "imum": 2847, + "imura": 43817, + "imus": 20704, + "in": 259, + "ina": 1437, + "inal": 1292, + "inally": 3289, + "inals": 6897, + "inance": 14149, + "inances": 34999, + "inant": 42483, + "inar": 22050, + "inarily": 21565, + "inary": 3219, + "inas": 24252, + "inate": 4559, + "inated": 3898, + "inately": 48618, + "inates": 17540, + "inating": 6010, + "ination": 1883, + "inational": 26201, + "inations": 7352, + "inator": 20900, + "inators": 47721, + "inatory": 23132, + "inav": 26802, + "inburgh": 22222, + "inc": 1939, + "incarn": 13211, + "ince": 924, + "incent": 42816, + "incerity": 40310, + "inces": 17386, + "inch": 8589, + "inches": 45457, + "incial": 13744, + "incible": 33494, + "incinn": 15020, + "incinnati": 15130, + "include": 17256, + "includes": 42813, + "including": 8201, + "incoln": 11690, + "income": 12519, + "incre": 24988, + "increasing": 42647, + "inct": 4612, + "inction": 9438, + "inctions": 31253, + "ind": 521, + "inda": 22261, + "indal": 44644, + "independence": 39894, + "independent": 34750, + "inder": 5540, + "inders": 29700, + "index": 9630, + "inding": 6020, + "individual": 43129, + "indle": 42343, + "indu": 10259, + "induced": 17223, + "inducing": 48016, + "indust": 23213, + "industrial": 31130, + "ine": 500, + "inea": 18343, + "ined": 1389, + "inel": 20538, + "inelli": 44076, + "inem": 7749, + "inement": 21828, + "inen": 42326, + "inence": 18386, + "inent": 7233, + "inently": 26528, + "iner": 7274, + "ineries": 48858, + "iners": 21257, + "inery": 15451, + "ines": 1127, + "inese": 3762, + "iness": 1272, + "inet": 42504, + "inez": 18885, + "inf": 10745, + "infect": 27816, + "infeld": 47187, + "inflamm": 29639, + "inflammatory": 32272, + "info": 10951, + "information": 17018, + "informed": 35698, + "ing": 278, + "inge": 11912, + "inged": 24431, + "ingen": 36795, + "inger": 3889, + "ingers": 40923, + "inges": 26792, + "ingham": 25875, + "inging": 14146, + "ingle": 17697, + "ingly": 4420, + "ingo": 32735, + "ings": 654, + "ington": 9557, + "ingu": 6680, + "inguishable": 41726, + "inguished": 46709, + "inho": 20327, + "ini": 5362, + "inia": 43168, + "inian": 24605, + "inic": 47277, + "inical": 32352, + "ining": 3191, + "inion": 23971, + "inis": 16661, + "inished": 30603, + "init": 15003, + "inite": 9504, + "initely": 12998, + "initial": 36733, + "initialized": 17532, + "inition": 17750, + "initions": 50101, + "inity": 6269, + "ink": 676, + "inka": 48955, + "inker": 24275, + "inki": 38799, + "inking": 8040, + "inkle": 19894, + "inks": 2973, + "inky": 29246, + "inline": 45145, + "inn": 3732, + "innacle": 37087, + "innamon": 21920, + "inner": 5083, + "inness": 32990, + "innie": 49708, + "inning": 23062, + "innon": 45067, + "ino": 2879, + "inoa": 40564, + "inois": 8981, + "inos": 11996, + "inosaur": 21317, + "inous": 29823, + "input": 15414, + "inqu": 18934, + "ins": 1040, + "inse": 38521, + "insert": 28463, + "inside": 48787, + "insk": 35803, + "inski": 21141, + "insky": 19870, + "inson": 7899, + "inspired": 24194, + "inst": 8625, + "install": 17350, + "installed": 37050, + "instance": 39098, + "instead": 38070, + "instein": 11962, + "insula": 16495, + "insured": 28409, + "int": 600, + "intage": 14630, + "integ": 18908, + "integer": 41433, + "intel": 48779, + "intelligence": 32683, + "intend": 7315, + "intendent": 21075, + "intendo": 8773, + "intensity": 47799, + "intensive": 38096, + "intent": 48536, + "intention": 40867, + "inter": 3849, + "interest": 9446, + "interested": 34339, + "interesting": 47914, + "interface": 39994, + "intern": 23124, + "internal": 32538, + "international": 45609, + "internet": 37675, + "interpret": 27381, + "interrupted": 46037, + "inters": 20193, + "interstitial": 29446, + "intestinal": 36387, + "inth": 9304, + "into": 20424, + "inton": 2371, + "intosh": 37638, + "introdu": 27427, + "ints": 29503, + "intuitive": 42105, + "inus": 35237, + "inv": 16340, + "inventory": 24807, + "inventoryQuantity": 39756, + "invest": 24859, + "invoke": 37669, + "involved": 44697, + "inx": 28413, + "iny": 3541, + "inyl": 19754, + "io": 952, + "ioch": 41097, + "iod": 2101, + "iol": 1669, + "iola": 30292, + "iolet": 19194, + "iological": 15071, + "iologist": 31599, + "iology": 12371, + "iom": 29005, + "ion": 295, + "iona": 32792, + "ionage": 24919, + "ional": 1538, + "ione": 7935, + "ioned": 14994, + "ionic": 26523, + "ionics": 49900, + "ions": 507, + "iop": 14922, + "ior": 1504, + "iors": 12706, + "ios": 4267, + "iosis": 42960, + "iosity": 15023, + "iosyn": 48448, + "iosyncr": 48702, + "iot": 5151, + "iotic": 16357, + "iotics": 18296, + "iots": 16228, + "iott": 20773, + "iour": 49439, + "ious": 699, + "iously": 6819, + "iov": 16664, + "iovascular": 19381, + "iox": 12190, + "ioxid": 26294, + "ioxide": 16671, + "ip": 541, + "ipal": 8521, + "ipation": 25857, + "ipe": 3757, + "iped": 46647, + "ipedia": 11151, + "ipeg": 21700, + "ipel": 40634, + "iper": 9346, + "ipers": 29288, + "ipes": 18636, + "iph": 13323, + "iphany": 49915, + "iphate": 34981, + "ipher": 10803, + "ipient": 48137, + "iping": 34690, + "ipl": 24705, + "iple": 2480, + "ipment": 4667, + "ipolar": 49133, + "ipop": 42800, + "ipp": 3974, + "ipped": 3949, + "ipper": 14710, + "ippers": 16415, + "ippery": 29530, + "ippi": 12715, + "ipping": 4501, + "ipple": 18793, + "ipples": 27844, + "ippy": 41214, + "ips": 2419, + "ipt": 10257, + "iq": 25011, + "iqu": 1557, + "ique": 2350, + "iqueness": 46764, + "iques": 6368, + "iquette": 40387, + "iquid": 6394, + "ir": 343, + "ira": 8704, + "irable": 13194, + "iral": 21093, + "iration": 15297, + "irc": 1980, + "ircraft": 27002, + "ird": 1447, + "irds": 11049, + "ire": 557, + "irect": 1060, + "irection": 4154, + "ired": 1202, + "irement": 24615, + "irements": 18883, + "iren": 24080, + "irens": 42917, + "ires": 2387, + "irez": 31762, + "irgin": 4672, + "iri": 14783, + "irie": 28191, + "iries": 18561, + "irin": 47388, + "iring": 3428, + "iris": 29616, + "irit": 3276, + "irk": 14232, + "irl": 1901, + "irled": 49376, + "irlf": 9841, + "irlfriend": 9872, + "irling": 24297, + "irlwind": 32785, + "irm": 2533, + "irmation": 36241, + "irmed": 15491, + "irming": 29808, + "irms": 8789, + "iro": 7058, + "iron": 1934, + "irrel": 22793, + "irs": 17062, + "irsch": 47108, + "irst": 667, + "irt": 2265, + "irted": 48357, + "irteen": 22530, + "irth": 3333, + "irting": 35355, + "irts": 9682, + "irtual": 22341, + "irty": 5893, + "iru": 35406, + "irus": 19397, + "iry": 9045, + "is": 271, + "isSpecial": 39714, + "isSpecialOrderable": 39755, + "isa": 9160, + "isable": 43942, + "isal": 28456, + "isan": 9057, + "isance": 31872, + "isans": 26100, + "isation": 5612, + "isations": 38189, + "isbury": 47967, + "isc": 2304, + "iscal": 7860, + "isch": 25308, + "ische": 46097, + "ischer": 24645, + "isco": 4861, + "iscons": 8795, + "isconsin": 8816, + "iscopal": 42522, + "iscover": 29392, + "iscovered": 41168, + "iscovery": 40821, + "isd": 9409, + "isdom": 9350, + "ise": 786, + "isec": 27866, + "ised": 1417, + "isel": 36811, + "isen": 13254, + "iser": 5847, + "isers": 21572, + "ises": 2696, + "iseum": 38277, + "isexual": 20863, + "isf": 4468, + "ish": 680, + "isha": 19388, + "ishable": 31785, + "ished": 1348, + "isher": 4828, + "ishers": 39116, + "ishes": 5614, + "ishi": 21644, + "ishing": 3929, + "ishly": 29735, + "ishment": 17862, + "ishop": 10124, + "ishops": 21863, + "ishy": 49785, + "isi": 23267, + "isible": 12843, + "isin": 45763, + "isine": 27480, + "ising": 1710, + "ision": 1166, + "isions": 3279, + "isite": 16107, + "isites": 31327, + "isition": 10027, + "isitions": 29593, + "isive": 13911, + "isively": 42042, + "isk": 1984, + "isks": 36730, + "isky": 34041, + "isl": 3044, + "isle": 20919, + "ism": 1042, + "isma": 38017, + "isman": 23845, + "ismo": 44126, + "isms": 6583, + "isner": 49861, + "iso": 26786, + "isode": 3282, + "isodes": 8052, + "isoft": 29719, + "isol": 30152, + "ison": 1653, + "isons": 9886, + "isp": 8802, + "ispers": 27148, + "isphere": 22833, + "iss": 747, + "issa": 13808, + "issan": 24112, + "issance": 16419, + "isse": 20782, + "ission": 1480, + "issions": 7717, + "isson": 30927, + "issors": 32555, + "issue": 21949, + "issued": 39361, + "issues": 37165, + "issy": 36419, + "ist": 396, + "ista": 12523, + "istan": 4103, + "istance": 9311, + "istani": 16688, + "istant": 10167, + "istar": 47229, + "istas": 37503, + "iste": 40833, + "isted": 6347, + "istence": 13274, + "istent": 7609, + "ister": 1694, + "istered": 23187, + "isters": 6223, + "istic": 2569, + "istical": 19929, + "istically": 16772, + "istics": 3969, + "istine": 32248, + "isting": 9665, + "istle": 12535, + "iston": 36363, + "istor": 32380, + "istors": 46334, + "istrate": 28534, + "istrates": 37909, + "istration": 33397, + "istries": 32995, + "istry": 4592, + "ists": 1023, + "isu": 46313, + "isure": 20609, + "isy": 13560, + "it": 270, + "ita": 5350, + "itability": 34147, + "itable": 4674, + "itably": 14829, + "itage": 10208, + "itaire": 26627, + "ital": 1287, + "itals": 8321, + "itamin": 40746, + "itan": 18642, + "itance": 42942, + "itans": 43716, + "itant": 23737, + "itar": 7940, + "itarian": 8353, + "itars": 27745, + "itary": 9331, + "itas": 21416, + "itate": 12027, + "itated": 13939, + "itates": 38654, + "itating": 21712, + "itation": 3780, + "itational": 22181, + "itations": 20597, + "itative": 12464, + "itatively": 48668, + "itbart": 17868, + "itch": 2007, + "itched": 10981, + "itcher": 23640, + "itches": 9249, + "itchie": 48423, + "itching": 19811, + "ite": 578, + "itech": 45396, + "itect": 5712, + "ited": 863, + "itely": 3973, + "item": 9186, + "itement": 12559, + "items": 23814, + "itent": 48324, + "iter": 2676, + "iterator": 48727, + "iterranean": 19012, + "ites": 2737, + "ith": 342, + "ithe": 31470, + "ither": 1555, + "ithering": 40861, + "ithing": 44556, + "ithmetic": 29848, + "iths": 47252, + "ithub": 10060, + "iti": 8846, + "itia": 36723, + "itial": 6847, + "itialized": 13562, + "itially": 22640, + "itic": 16233, + "ities": 871, + "itimate": 30233, + "itime": 22552, + "iting": 1780, + "ition": 653, + "itional": 1859, + "itionally": 8736, + "itions": 1756, + "itious": 25253, + "itis": 11815, + "itism": 18937, + "itive": 1800, + "itiveness": 31366, + "itives": 20288, + "itivity": 11365, + "itiz": 3029, + "itized": 36951, + "itizen": 36958, + "itizens": 34100, + "itle": 2578, + "itled": 7803, + "itles": 30540, + "itness": 3659, + "ito": 10094, + "itol": 11650, + "iton": 37752, + "itone": 49644, + "itor": 2072, + "itored": 20026, + "itors": 6742, + "itory": 37765, + "itous": 22109, + "itri": 49510, + "its": 896, + "itsch": 48279, + "itsu": 19831, + "itt": 715, + "itta": 48519, + "ittal": 39979, + "ittance": 47912, + "itte": 2654, + "itted": 2175, + "ittee": 2979, + "ittees": 13263, + "itten": 2621, + "ittens": 34978, + "itter": 1967, + "ittered": 36613, + "itters": 45512, + "itting": 2535, + "ittle": 1206, + "itto": 37606, + "itton": 47304, + "itty": 9760, + "itu": 34272, + "itual": 10587, + "itud": 26331, + "itude": 3984, + "itudes": 10455, + "itudinal": 29121, + "iture": 8089, + "itures": 20686, + "itus": 17506, + "itute": 3678, + "itutes": 16845, + "itution": 2738, + "itutional": 5677, + "ity": 414, + "itz": 4224, + "itzer": 10557, + "itzerland": 13947, + "ité": 43816, + "iu": 16115, + "ium": 1505, + "ius": 3754, + "iuses": 44666, + "iv": 452, + "iva": 12151, + "ivable": 21911, + "ivably": 47994, + "ival": 2473, + "ivalent": 29540, + "ivalry": 47310, + "ivals": 10336, + "ivan": 13809, + "ivari": 35460, + "ivariate": 42524, + "ivas": 38630, + "ivated": 30829, + "ivating": 39438, + "ivation": 26939, + "ive": 425, + "ived": 1572, + "ively": 2280, + "iven": 1469, + "iveness": 6517, + "iver": 1428, + "ivered": 6396, + "ivering": 35598, + "iverpool": 10864, + "ivers": 1191, + "iversal": 11480, + "iversary": 9023, + "iverse": 3997, + "iversity": 1608, + "ivery": 6315, + "ives": 1083, + "ivia": 20817, + "ivic": 16482, + "ivid": 1699, + "ividual": 1896, + "ividually": 16335, + "ivil": 2464, + "iving": 1412, + "ivism": 25085, + "ivist": 30944, + "ivities": 28720, + "ivity": 3458, + "ivo": 23593, + "ivot": 45785, + "iw": 14246, + "ix": 844, + "ixed": 2966, + "ixel": 7168, + "ixels": 14810, + "ixie": 39291, + "ixir": 32345, + "ixon": 12305, + "ixt": 6346, + "ixtape": 43938, + "ixties": 46550, + "ixture": 9602, + "ixtures": 25506, + "ixty": 19404, + "iy": 7745, + "iya": 21008, + "iyah": 46398, + "iz": 528, + "iza": 23638, + "izabeth": 9924, + "izable": 13821, + "izard": 8669, + "izards": 14124, + "izarre": 12474, + "ization": 1634, + "izational": 22684, + "izations": 4582, + "ize": 1096, + "ized": 1143, + "izen": 33977, + "izens": 44908, + "izer": 7509, + "izers": 11341, + "izes": 4340, + "izing": 2890, + "izo": 41282, + "izon": 8637, + "izons": 29457, + "izont": 12071, + "izontal": 38342, + "izoph": 18115, + "izophren": 18337, + "izu": 47775, + "izz": 6457, + "izza": 9990, + "izzard": 16191, + "izzle": 44461, + "izzy": 40593, + "j": 73, + "ja": 6592, + "jab": 27935, + "jac": 30482, + "jack": 19650, + "jad": 38442, + "jah": 31558, + "jam": 39159, + "jamin": 13337, + "jan": 13881, + "jandro": 47983, + "jar": 9491, + "jas": 28121, + "java": 12355, + "javascript": 37495, + "jay": 33708, + "jc": 48055, + "je": 18015, + "ject": 752, + "jected": 35408, + "jection": 29192, + "jee": 34589, + "jen": 48796, + "jer": 44009, + "jet": 31173, + "jew": 47483, + "ji": 7285, + "jiang": 39598, + "jin": 18594, + "jing": 49940, + "jit": 45051, + "jj": 41098, + "jl": 20362, + "jo": 7639, + "job": 21858, + "jobs": 43863, + "john": 30686, + "joice": 41026, + "join": 22179, + "joined": 46416, + "joining": 40044, + "jon": 46286, + "jong": 32428, + "journal": 24891, + "joy": 2633, + "jp": 34523, + "jpg": 9479, + "jri": 38790, + "jriwal": 39890, + "js": 8457, + "json": 17752, + "ju": 14396, + "jud": 10456, + "judicial": 46769, + "jug": 31761, + "jump": 43327, + "jun": 29741, + "jured": 38608, + "juries": 47496, + "jury": 21871, + "just": 3137, + "justice": 31012, + "juven": 39427, + "k": 74, + "kB": 38841, + "kHz": 44191, + "ka": 4914, + "kai": 32765, + "kamp": 40899, + "kan": 27541, + "kar": 21070, + "kas": 42749, + "kat": 41826, + "kay": 5568, + "kaya": 35372, + "kb": 32812, + "ke": 365, + "ked": 9091, + "kee": 11035, + "keep": 14894, + "keeper": 13884, + "keepers": 24952, + "keeping": 19934, + "kees": 16683, + "kef": 30728, + "kefeller": 31424, + "kel": 7750, + "keleton": 38800, + "keley": 13490, + "kell": 17164, + "ken": 3464, + "kens": 14972, + "kept": 45089, + "ker": 6122, + "kered": 28970, + "kernel": 33885, + "kers": 15949, + "kes": 5209, + "ket": 7126, + "key": 2539, + "keye": 34929, + "keyes": 43174, + "keys": 13083, + "kg": 10025, + "kh": 14636, + "ki": 4106, + "kick": 24585, + "kid": 38439, + "kids": 45235, + "kie": 49375, + "kies": 43724, + "kil": 34553, + "kill": 12728, + "killed": 42130, + "killer": 32156, + "killers": 43492, + "killing": 43764, + "kin": 5116, + "kind": 11031, + "king": 3364, + "kins": 5331, + "kinson": 26030, + "kish": 31501, + "kiss": 41304, + "kit": 15813, + "kj": 42421, + "kk": 28747, + "kl": 41582, + "km": 13276, + "kn": 15418, + "knife": 48810, + "knit": 47095, + "know": 16275, + "knowledge": 45066, + "known": 4002, + "ko": 7204, + "kok": 32004, + "kos": 46150, + "kov": 21862, + "kowski": 26216, + "kr": 38584, + "krit": 44531, + "ks": 591, + "ksh": 50133, + "kson": 46505, + "kt": 21841, + "ktop": 16201, + "ku": 23063, + "kun": 28374, + "kus": 45614, + "kw": 46265, + "kward": 12378, + "ky": 2584, + "l": 75, + "la": 5031, + "lab": 23912, + "label": 18242, + "lace": 27077, + "lad": 9435, + "laden": 35668, + "lag": 30909, + "lah": 9271, + "lahoma": 9802, + "laim": 20438, + "lain": 34277, + "lake": 27180, + "lam": 2543, + "lambda": 50033, + "lamm": 11199, + "lan": 9620, + "lance": 23215, + "land": 1044, + "lander": 16235, + "landers": 32358, + "landish": 45626, + "lando": 11993, + "lands": 4447, + "lane": 33533, + "lang": 17204, + "language": 16129, + "lap": 37796, + "lar": 21681, + "larg": 15521, + "large": 11664, + "largest": 28209, + "las": 21921, + "lash": 17055, + "lass": 31172, + "lasses": 28958, + "last": 12957, + "lasting": 24810, + "lat": 15460, + "latable": 49009, + "late": 17660, + "lated": 17249, + "later": 36760, + "latest": 42861, + "lation": 7592, + "lations": 49905, + "lator": 41880, + "laugh": 44944, + "laughs": 28124, + "laughter": 27815, + "laun": 38722, + "launch": 35681, + "laus": 38024, + "lav": 18809, + "law": 6270, + "laws": 29317, + "lay": 10724, + "layer": 29289, + "layout": 39786, + "lb": 23160, + "lbs": 32133, + "lc": 44601, + "ld": 335, + "lda": 18986, + "lde": 35209, + "lder": 6499, + "ldom": 23826, + "ldon": 25900, + "le": 293, + "lead": 28230, + "leader": 27940, + "leaders": 37553, + "leading": 12294, + "leaf": 33201, + "league": 19316, + "lean": 13087, + "leaning": 25909, + "leanor": 41807, + "leans": 11861, + "lear": 3238, + "learn": 35720, + "learning": 40684, + "lease": 1274, + "leased": 14684, + "leases": 29329, + "leasing": 48764, + "leave": 47408, + "leck": 40667, + "lect": 801, + "lected": 12609, + "lectic": 42009, + "lection": 1564, + "lections": 26448, + "led": 992, + "ledge": 2965, + "ledged": 37436, + "lee": 7197, + "leen": 20042, + "leep": 8892, + "lees": 49410, + "leeve": 49189, + "left": 9464, + "leg": 1455, + "legal": 18011, + "legate": 34637, + "legates": 37061, + "lege": 2765, + "legged": 40898, + "legram": 30536, + "legraph": 16606, + "leground": 28272, + "lehem": 44797, + "leigh": 42342, + "lein": 33663, + "lem": 10671, + "lement": 1732, + "lements": 3639, + "lems": 46367, + "len": 11925, + "lene": 29466, + "leneck": 43163, + "leness": 48795, + "length": 13664, + "leon": 38970, + "ler": 1754, + "lers": 8116, + "les": 829, + "lesh": 29730, + "lesi": 36027, + "lesiastical": 46360, + "less": 1203, + "lessly": 8613, + "lessness": 17587, + "lest": 32712, + "let": 1616, + "letal": 47293, + "letcher": 29257, + "lete": 5807, + "leted": 33342, + "letes": 40676, + "lethal": 46480, + "letico": 47286, + "leton": 10565, + "lets": 5289, + "lett": 15503, + "lette": 21348, + "letter": 9291, + "letters": 15653, + "lev": 2768, + "levant": 14938, + "levard": 22123, + "level": 5715, + "levels": 46170, + "levision": 5024, + "lex": 2588, + "ley": 1636, + "leys": 21325, + "lez": 36858, + "lf": 1652, + "li": 4528, + "lia": 24660, + "liam": 5058, + "liament": 5130, + "lib": 8019, + "liber": 33203, + "liberal": 35739, + "library": 32016, + "lic": 677, + "lication": 10142, + "license": 43085, + "licensed": 36612, + "lich": 33467, + "licks": 49191, + "lict": 13758, + "licted": 17823, + "liction": 41101, + "licts": 42267, + "lie": 14485, + "lied": 18511, + "lier": 2505, + "lies": 13508, + "liest": 11318, + "lif": 36195, + "life": 6042, + "lift": 26282, + "lifting": 30510, + "lig": 4604, + "liga": 38910, + "light": 2971, + "lighting": 43351, + "lightly": 30945, + "lights": 8091, + "lihood": 11935, + "lik": 46965, + "like": 2339, + "likely": 40798, + "lim": 2475, + "lime": 27299, + "limit": 32374, + "limited": 10698, + "limits": 49196, + "lin": 2815, + "line": 1370, + "linear": 29127, + "lined": 10837, + "liner": 24683, + "liners": 34380, + "lines": 6615, + "liness": 26061, + "ling": 1359, + "linger": 33550, + "lings": 17783, + "lington": 17299, + "lining": 21310, + "link": 8726, + "linked": 25614, + "links": 28751, + "lins": 21602, + "linux": 23289, + "lio": 48590, + "lip": 40712, + "lique": 41522, + "liquid": 39250, + "lis": 27999, + "lish": 1836, + "lished": 2115, + "lisher": 8191, + "lishes": 19724, + "lishing": 20020, + "list": 4868, + "listed": 17935, + "lists": 20713, + "lit": 18250, + "lite": 36890, + "liter": 17201, + "literally": 43819, + "little": 31629, + "liv": 16017, + "live": 12583, + "lived": 24489, + "living": 19950, + "livion": 26018, + "livious": 35260, + "ll": 297, + "lla": 8466, + "llah": 22734, + "llan": 47993, + "lled": 3353, + "ller": 6051, + "llers": 13802, + "lli": 15516, + "lling": 2680, + "llo": 18798, + "llor": 14127, + "llular": 32771, + "lly": 12810, + "ln": 18755, + "lo": 5439, + "load": 2220, + "loaded": 14578, + "loader": 29356, + "loading": 25138, + "loads": 46030, + "loc": 17946, + "local": 12001, + "localhost": 36750, + "location": 24886, + "lock": 5354, + "locked": 24162, + "locking": 48331, + "locks": 28860, + "loe": 24617, + "log": 6404, + "login": 38235, + "lol": 47288, + "lon": 14995, + "long": 6511, + "loo": 29680, + "look": 5460, + "looking": 11534, + "loop": 26268, + "lopp": 39590, + "lor": 4685, + "lord": 10572, + "lords": 19673, + "lore": 31131, + "los": 33280, + "loss": 22462, + "lost": 33224, + "lot": 26487, + "lov": 27086, + "love": 23205, + "loving": 33983, + "low": 9319, + "lower": 21037, + "lp": 34431, + "lr": 14050, + "ls": 7278, + "lt": 2528, + "lu": 2290, + "lua": 40211, + "luaj": 36473, + "lucent": 35600, + "luck": 46708, + "lude": 38792, + "luence": 23079, + "luent": 28216, + "lund": 37525, + "lus": 41790, + "lust": 38878, + "luster": 48375, + "lux": 22564, + "lv": 6780, + "lves": 31018, + "lvl": 47147, + "ly": 306, + "lyak": 43782, + "lycer": 38577, + "lying": 3157, + "lymp": 6760, + "lyn": 6213, + "lynn": 12935, + "lys": 27385, + "lyss": 35670, + "lé": 45031, + "m": 76, + "mA": 42646, + "mAh": 28142, + "mL": 32087, + "ma": 2611, + "mable": 44102, + "mac": 20285, + "machine": 30243, + "mad": 9937, + "made": 9727, + "mag": 19726, + "mage": 25561, + "magic": 32707, + "maid": 23151, + "mail": 4529, + "mails": 26165, + "main": 12417, + "major": 22478, + "majority": 35839, + "make": 15883, + "maker": 10297, + "makers": 6620, + "makes": 49123, + "making": 8601, + "mal": 7617, + "male": 22606, + "malink": 31000, + "mallow": 42725, + "man": 805, + "manac": 46870, + "managed": 39935, + "management": 27604, + "manager": 37153, + "mand": 22249, + "manent": 44172, + "mania": 45733, + "mann": 9038, + "mans": 16221, + "manship": 25428, + "manuel": 18713, + "manufact": 48119, + "many": 21834, + "map": 8899, + "maps": 31803, + "mar": 3876, + "mare": 11449, + "mares": 23745, + "marg": 30887, + "margin": 36153, + "marine": 42380, + "mark": 4102, + "marked": 23505, + "market": 10728, + "markets": 34162, + "marks": 14306, + "marriage": 45394, + "married": 30526, + "mart": 13822, + "mary": 6874, + "mas": 5356, + "mask": 27932, + "mass": 22208, + "massive": 49777, + "mast": 47616, + "master": 9866, + "masters": 40706, + "mat": 6759, + "match": 15699, + "matched": 31409, + "mate": 9830, + "material": 33665, + "mates": 7300, + "math": 11018, + "matic": 13849, + "matical": 44935, + "matically": 49454, + "matter": 47635, + "max": 9806, + "maximum": 47033, + "maxwell": 29047, + "may": 11261, + "maybe": 25991, + "mb": 2022, + "mber": 1916, + "mberg": 47369, + "mble": 11306, + "mbol": 23650, + "mbuds": 45664, + "mbudsman": 47012, + "mc": 23209, + "md": 9132, + "me": 1326, + "meal": 28208, + "mean": 32604, + "meaning": 24815, + "measures": 47336, + "meat": 41495, + "med": 1150, + "medi": 2379, + "media": 11431, + "mediate": 13857, + "mediated": 38363, + "mediately": 23802, + "medical": 41693, + "medium": 24132, + "meet": 47745, + "meg": 28917, + "mega": 13731, + "meier": 49468, + "mel": 17694, + "melon": 45690, + "mem": 11883, + "member": 19522, + "members": 30814, + "memory": 31673, + "men": 3653, + "mens": 45535, + "ment": 434, + "mental": 37098, + "mentation": 14374, + "mented": 12061, + "mentioned": 17181, + "ments": 902, + "menu": 26272, + "mer": 647, + "merce": 11647, + "mercial": 15790, + "mere": 34671, + "merga": 44739, + "meric": 946, + "mers": 11056, + "mes": 6880, + "mess": 37348, + "message": 20500, + "met": 4164, + "meta": 28961, + "metadata": 38993, + "metal": 28469, + "meter": 27231, + "method": 24396, + "methyl": 43654, + "metic": 15103, + "metics": 27757, + "metry": 41935, + "meyer": 48794, + "mg": 11296, + "mi": 11632, + "mia": 20730, + "miah": 35029, + "mic": 9383, + "micro": 24055, + "microsoft": 40485, + "mid": 13602, + "middle": 27171, + "midt": 21184, + "mie": 44871, + "might": 44092, + "mil": 25433, + "mile": 18085, + "military": 33631, + "mill": 17805, + "million": 14100, + "milo": 48995, + "min": 1084, + "mination": 17928, + "mind": 10155, + "minded": 14543, + "mine": 3810, + "minecraft": 17761, + "minent": 19669, + "ming": 2229, + "mingham": 17737, + "mington": 39773, + "mini": 45313, + "minimum": 39504, + "mining": 45374, + "minist": 2201, + "ministic": 49228, + "mins": 42951, + "minster": 18462, + "mint": 34289, + "minus": 40191, + "minute": 11374, + "mir": 10793, + "mire": 47004, + "mis": 25413, + "misc": 44374, + "miss": 3927, + "missible": 21597, + "missing": 45688, + "mission": 3411, + "missions": 8481, + "missive": 33532, + "mist": 37980, + "mit": 2781, + "mite": 32937, + "mith": 22947, + "mits": 24883, + "mitt": 20124, + "mitted": 3291, + "mittedly": 43011, + "mitter": 37974, + "mitting": 16138, + "mix": 19816, + "mk": 28015, + "ml": 4029, + "mm": 3020, + "mma": 21672, + "mmm": 27532, + "mmmm": 40133, + "mn": 10295, + "mo": 5908, + "mob": 39949, + "mobi": 43549, + "mobile": 24896, + "mod": 4666, + "mode": 14171, + "model": 19849, + "models": 27530, + "moderate": 47189, + "modern": 23922, + "modified": 41771, + "mods": 24122, + "module": 21412, + "modules": 18170, + "moil": 25538, + "mol": 43132, + "mology": 29126, + "mom": 32542, + "mon": 2144, + "monary": 36639, + "mond": 6327, + "monds": 42620, + "mone": 47122, + "money": 26316, + "mong": 31059, + "monitor": 41143, + "monkey": 49572, + "mons": 11567, + "monster": 39050, + "mont": 8691, + "month": 8424, + "months": 41537, + "monton": 19729, + "mony": 9926, + "moon": 22977, + "mop": 35244, + "mopolitan": 44331, + "mor": 4491, + "moral": 41996, + "more": 3549, + "morning": 43911, + "morph": 24503, + "morrow": 9201, + "mort": 30171, + "mortem": 46515, + "mos": 16785, + "mosp": 6384, + "most": 1712, + "mostly": 29471, + "mot": 27926, + "mother": 13552, + "motion": 38714, + "mount": 14948, + "mounted": 29728, + "mouse": 35888, + "mouth": 14775, + "move": 21084, + "movie": 41364, + "moving": 31462, + "mp": 3149, + "mpeg": 43913, + "mph": 23335, + "mpire": 35386, + "mr": 43395, + "ms": 907, + "msg": 19662, + "mson": 24996, + "mt": 16762, + "mu": 30300, + "much": 29482, + "mud": 41650, + "mult": 16680, + "multi": 41684, + "multipl": 47945, + "multiple": 48101, + "mun": 6199, + "mund": 20125, + "munition": 12640, + "mur": 28582, + "mus": 14664, + "music": 28965, + "must": 27238, + "mut": 21973, + "mx": 36802, + "my": 1820, + "myra": 49216, + "mys": 28744, + "n": 77, + "na": 2616, + "nah": 40909, + "nai": 38600, + "naire": 24042, + "naires": 43317, + "naissance": 47090, + "nam": 7402, + "name": 3672, + "named": 13190, + "names": 14933, + "namese": 22678, + "nan": 12647, + "nance": 41601, + "nant": 22057, + "nants": 26501, + "nar": 23955, + "nard": 40542, + "nas": 24716, + "nat": 32353, + "natal": 33150, + "nation": 25729, + "national": 14648, + "native": 30191, + "natural": 11802, + "nature": 21353, + "natureconservancy": 41380, + "nav": 28341, + "nb": 46803, + "nc": 10782, + "nce": 1198, + "nces": 3179, + "nd": 358, + "nda": 45658, + "nder": 681, + "ndra": 24631, + "ndum": 11021, + "ne": 710, + "nea": 39718, + "neapolis": 19359, + "near": 40093, + "neath": 13725, + "neau": 46533, + "nec": 32984, + "necess": 10789, + "necessary": 49986, + "neck": 27235, + "nect": 1606, + "ned": 2817, + "nee": 21381, + "need": 31227, + "needed": 27938, + "needs": 50032, + "neg": 12480, + "negative": 31591, + "negie": 32360, + "nel": 4954, + "nell": 10076, + "nels": 19423, + "nen": 38572, + "ner": 1008, + "nered": 15826, + "nerg": 25649, + "nergy": 5877, + "ners": 2741, + "nery": 35865, + "nes": 2516, + "nesday": 3462, + "nesia": 31401, + "nesium": 27619, + "nesota": 8360, + "ness": 1108, + "nesses": 47556, + "nesty": 18718, + "net": 3262, + "netflix": 36977, + "netic": 9833, + "nets": 45938, + "nette": 48115, + "network": 27349, + "neum": 25668, + "neutral": 29797, + "never": 12081, + "new": 3605, + "news": 10827, + "nex": 12413, + "nexpected": 42072, + "next": 19545, + "nexus": 44520, + "ney": 1681, + "neys": 20141, + "ng": 782, + "ngth": 11910, + "ni": 8461, + "nia": 18142, + "nian": 44516, + "nic": 6988, + "nice": 44460, + "nick": 17172, + "nie": 11952, + "night": 3847, + "nih": 37373, + "nik": 17187, + "nikov": 45451, + "nil": 45991, + "nin": 35073, + "nine": 30888, + "ning": 768, + "nings": 23400, + "nington": 48405, + "niper": 45554, + "nir": 32986, + "nis": 21361, + "nit": 48825, + "nl": 21283, + "nm": 21533, + "nn": 20471, + "no": 3919, + "nob": 34952, + "node": 17440, + "nom": 26601, + "non": 13159, + "none": 23108, + "noon": 6357, + "nor": 13099, + "norm": 27237, + "normal": 11265, + "north": 43588, + "nos": 39369, + "nosis": 31707, + "nostic": 43758, + "not": 1662, + "notation": 38983, + "notations": 30078, + "note": 11295, + "notes": 17815, + "nothing": 22366, + "notice": 42138, + "noticed": 31696, + "nov": 37302, + "nova": 38438, + "now": 2197, + "nown": 3408, + "nox": 35420, + "noxious": 40591, + "np": 37659, + "nr": 48624, + "ns": 5907, + "nsic": 19364, + "nsics": 49242, + "nt": 429, + "ntax": 41641, + "ntil": 10125, + "nton": 28936, + "nu": 28803, + "nuclear": 43131, + "null": 8423, + "num": 22510, + "number": 17618, + "numbered": 35565, + "nut": 14930, + "nutrition": 40482, + "nuts": 31381, + "nv": 48005, + "nw": 47516, + "ny": 3281, + "nyder": 21053, + "nz": 27305, + "o": 78, + "oS": 34049, + "oa": 12162, + "oad": 1170, + "oaded": 22273, + "oak": 15877, + "oan": 24611, + "oard": 11953, + "oat": 15073, + "ob": 672, + "oba": 19981, + "obal": 2572, + "obar": 30973, + "obb": 21963, + "obbies": 41372, + "obby": 11369, + "obe": 5910, + "ober": 2023, + "obi": 13411, + "obia": 30665, + "obic": 20803, + "obil": 25898, + "obile": 3579, + "obiles": 36329, + "obin": 38954, + "obj": 26801, + "object": 15252, + "objects": 48205, + "obl": 45292, + "obo": 20391, + "obook": 49776, + "obos": 49878, + "obs": 8158, + "oby": 26730, + "obyl": 46666, + "oc": 420, + "oca": 11216, + "ocado": 33441, + "ocal": 4374, + "ocally": 44190, + "ocaly": 12063, + "ocalypse": 15145, + "ocalyptic": 28339, + "ocamp": 26047, + "ocard": 44412, + "ocate": 13369, + "ocated": 10533, + "ocating": 27123, + "ocation": 5040, + "ocations": 20968, + "ocative": 23466, + "ocaust": 16377, + "occ": 13966, + "occup": 19596, + "occupied": 28756, + "ocene": 34973, + "ocent": 29421, + "ocese": 31292, + "och": 5374, + "oche": 30848, + "ochem": 18958, + "ochemical": 32864, + "ochemistry": 37074, + "ochet": 49579, + "ochond": 22400, + "oci": 1733, + "ocial": 9402, + "ociate": 47615, + "ociated": 19293, + "ociation": 41003, + "ocide": 16207, + "ocious": 32346, + "ocity": 11683, + "ock": 735, + "ocked": 3543, + "ocker": 12721, + "ocket": 5459, + "ockets": 11603, + "ockey": 8337, + "ocking": 8629, + "ocks": 3320, + "ocl": 38679, + "oco": 25634, + "ocobo": 37642, + "ococ": 34403, + "ocol": 4668, + "ocolate": 9140, + "ocom": 42829, + "ocon": 36221, + "ocr": 1696, + "ocracy": 17818, + "ocrat": 35128, + "ocrates": 34095, + "ocratic": 15405, + "ocrats": 21988, + "ocre": 27945, + "ocrin": 39913, + "ocrine": 38658, + "ocry": 48103, + "oct": 38441, + "ocular": 37320, + "ocument": 7990, + "ocumented": 17664, + "ocus": 10901, + "ocused": 13073, + "ocusing": 45743, + "ocy": 13733, + "ocyte": 43320, + "ocytes": 30309, + "od": 375, + "oda": 11329, + "odan": 45561, + "oday": 4348, + "odcast": 7107, + "odd": 5088, + "odder": 35346, + "oddy": 38553, + "ode": 1098, + "oded": 9043, + "oder": 12342, + "odes": 4147, + "odge": 9728, + "odi": 23130, + "odiac": 40096, + "odic": 29512, + "odied": 32255, + "odies": 5042, + "oding": 7656, + "odium": 12664, + "odka": 28601, + "odo": 24313, + "odon": 46457, + "odor": 30530, + "odore": 25102, + "odox": 11430, + "ods": 12978, + "odus": 21878, + "ody": 1118, + "odynam": 24319, + "odynamic": 34743, + "odynamics": 44124, + "oe": 2577, + "oen": 6571, + "oenix": 8538, + "oes": 3028, + "oeuv": 37600, + "of": 1659, + "ofer": 30288, + "off": 2364, + "offensive": 45055, + "offer": 47895, + "offic": 14406, + "office": 31810, + "official": 16841, + "offs": 8210, + "offset": 28968, + "ofi": 39542, + "oft": 11205, + "often": 28950, + "og": 519, + "oga": 10949, + "ogan": 9632, + "ogen": 6644, + "ogene": 20878, + "ogeneity": 37477, + "ogeneous": 32269, + "ogenesis": 25908, + "ogenic": 15147, + "ogenous": 27897, + "ogens": 26612, + "ogether": 8236, + "ogg": 10332, + "ogged": 42545, + "ogging": 30853, + "oggle": 20258, + "oggles": 48549, + "ogh": 46664, + "ogi": 44381, + "ogical": 30766, + "ogie": 37987, + "ogl": 28678, + "ogle": 2467, + "oglobin": 49835, + "oglu": 49006, + "ogly": 34619, + "ogn": 2360, + "ognitive": 46610, + "ogo": 24076, + "ogram": 21857, + "ograms": 26836, + "ograp": 7113, + "ograph": 2384, + "ographed": 39620, + "ographer": 18539, + "ographers": 34063, + "ographic": 6826, + "ographical": 17046, + "ographically": 33145, + "ographics": 24188, + "ographies": 41480, + "ographs": 33492, + "ography": 4867, + "ogs": 18463, + "ogue": 5119, + "ogun": 39918, + "ogy": 9868, + "ogyn": 20593, + "oh": 1219, + "oha": 28083, + "ohan": 22436, + "ohl": 48988, + "ohm": 34028, + "ohn": 1562, + "oho": 40950, + "ohyd": 15782, + "ohydrate": 46358, + "oi": 23013, + "oice": 2942, + "oid": 1868, + "oidal": 47502, + "oided": 13780, + "oids": 10994, + "oil": 9437, + "oiler": 20837, + "oin": 36743, + "oine": 42722, + "oing": 40519, + "oint": 1563, + "ointed": 20909, + "ointment": 49805, + "oir": 10840, + "oire": 32177, + "ois": 10924, + "oise": 25678, + "oit": 30711, + "oj": 13210, + "oji": 31370, + "ojure": 32511, + "ok": 482, + "oka": 17411, + "okane": 41776, + "oke": 2088, + "oked": 6545, + "okemon": 12717, + "oken": 4233, + "oker": 11020, + "okers": 18698, + "okes": 3369, + "oki": 18228, + "okia": 22903, + "okin": 36749, + "oking": 5730, + "okingly": 48343, + "oko": 16044, + "oks": 28194, + "oku": 11601, + "oky": 31375, + "oké": 35861, + "ol": 349, + "ola": 5708, + "olan": 16617, + "oland": 23573, + "olar": 6192, + "olars": 7828, + "olas": 12456, + "olate": 27976, + "olated": 50027, + "olation": 21417, + "old": 727, + "olded": 48959, + "oldemort": 24710, + "older": 19892, + "olding": 33266, + "oldown": 15041, + "olds": 10119, + "ole": 2305, + "olean": 21052, + "oled": 45342, + "olen": 8622, + "oleon": 25637, + "oler": 13625, + "olerance": 37668, + "oles": 4316, + "olesc": 16850, + "olescent": 23406, + "olester": 15764, + "olesterol": 16743, + "oley": 48437, + "olf": 4024, + "oli": 11106, + "olia": 22703, + "oliath": 43009, + "oliberal": 28525, + "olic": 4160, + "olicited": 47607, + "olics": 19615, + "olicy": 21424, + "olid": 10180, + "olin": 24910, + "olina": 47196, + "oline": 14453, + "oling": 40949, + "olini": 43232, + "olis": 8506, + "olit": 6212, + "olitan": 12977, + "olith": 21446, + "olithic": 30764, + "olitical": 13781, + "olitics": 21704, + "olition": 50014, + "olk": 13597, + "olkien": 31052, + "oll": 692, + "olla": 33011, + "ollah": 17999, + "ollar": 13228, + "ollen": 29952, + "oller": 49252, + "ollo": 15578, + "ollow": 950, + "ollower": 47030, + "olls": 33421, + "olly": 5098, + "ollywood": 31777, + "oln": 10875, + "olo": 14057, + "olog": 928, + "ologic": 20781, + "ological": 2770, + "ologically": 13437, + "ologies": 5823, + "ologist": 7451, + "ologists": 9251, + "ologne": 30520, + "ologue": 39795, + "ology": 1435, + "olon": 43645, + "olor": 45621, + "olph": 10196, + "olphin": 27161, + "olphins": 16547, + "ols": 10220, + "olson": 32836, + "olt": 5978, + "olulu": 39814, + "olute": 3552, + "olutely": 16780, + "olution": 2122, + "olutions": 14191, + "olve": 6442, + "olved": 5634, + "olver": 14375, + "olves": 9010, + "olving": 10890, + "oly": 3366, + "olyn": 34742, + "om": 296, + "oma": 6086, + "omach": 10806, + "omal": 18048, + "omaly": 24335, + "oman": 5185, + "omas": 16911, + "omatic": 13730, + "omb": 2381, + "ombat": 41628, + "ombie": 9081, + "ombies": 12676, + "ombo": 47265, + "ombs": 33273, + "ome": 462, + "omed": 12657, + "omedical": 35914, + "omen": 3674, + "omer": 12057, + "omers": 21499, + "omes": 2586, + "omet": 908, + "ometer": 15635, + "ometers": 40077, + "omething": 8370, + "ometime": 47056, + "ometimes": 6533, + "ometown": 19191, + "ometric": 16996, + "ometry": 15748, + "omever": 49784, + "omew": 28030, + "omez": 30010, + "omi": 12753, + "omial": 49070, + "omic": 10179, + "omical": 22545, + "omics": 31994, + "omin": 6351, + "ominated": 50251, + "omination": 27744, + "oming": 3383, + "ominium": 46134, + "omm": 2002, + "ommel": 48990, + "ommod": 8641, + "omnia": 37340, + "omo": 17902, + "omon": 16698, + "omore": 22113, + "omorph": 25831, + "omorphic": 46374, + "omp": 3361, + "ompl": 6316, + "oms": 3150, + "omsday": 33415, + "omsky": 37093, + "omy": 9145, + "on": 261, + "ona": 4450, + "onal": 20996, + "once": 27078, + "ond": 623, + "onda": 13533, + "onday": 3204, + "onde": 14378, + "onder": 8623, + "onding": 42703, + "ondo": 22311, + "ondon": 3391, + "onds": 24764, + "onduct": 12920, + "onductor": 40990, + "one": 505, + "oned": 12004, + "onel": 26261, + "oneliness": 34634, + "onement": 49844, + "onen": 34481, + "onent": 3471, + "onential": 35470, + "onents": 3906, + "oner": 14491, + "ones": 1952, + "onest": 19129, + "onet": 36823, + "onew": 44181, + "oney": 1419, + "ong": 506, + "onga": 44294, + "onge": 14220, + "ongevity": 25454, + "ongh": 19757, + "ongo": 25162, + "ongs": 28079, + "ongyang": 20659, + "oni": 14651, + "onia": 11339, + "onial": 30752, + "onian": 27625, + "onic": 9229, + "onica": 32752, + "onics": 38530, + "onies": 17300, + "oning": 12484, + "onis": 43524, + "onite": 46285, + "online": 25119, + "only": 8807, + "onna": 6415, + "onnaissance": 31539, + "onne": 47476, + "ono": 29941, + "onom": 6326, + "onomic": 40036, + "onomous": 38175, + "onomy": 30565, + "ons": 684, + "onse": 2591, + "onsense": 46563, + "onsequ": 40819, + "onso": 26666, + "onson": 36742, + "ont": 756, + "onte": 38599, + "ontent": 38564, + "onto": 5957, + "onut": 16478, + "ony": 1647, + "onym": 5177, + "onymous": 6704, + "onyms": 43612, + "onz": 13569, + "oo": 2238, + "ood": 702, + "oodle": 27106, + "oodoo": 36038, + "oof": 37711, + "ook": 566, + "ooked": 46288, + "ookie": 18055, + "ooks": 31085, + "ooky": 29655, + "ool": 970, + "oola": 10513, + "ools": 10141, + "oom": 4207, + "ooming": 30602, + "oon": 2049, + "oons": 13022, + "ooo": 34160, + "oooo": 13321, + "oooooooo": 26759, + "oooooooooooooooo": 49135, + "oop": 11224, + "oops": 44860, + "oor": 2675, + "oos": 16426, + "oot": 1025, + "ooter": 25141, + "ooters": 48316, + "ooth": 5226, + "oother": 31724, + "ooting": 12494, + "oots": 13880, + "op": 404, + "opa": 26186, + "opal": 33067, + "opard": 15478, + "opath": 18569, + "opathic": 44650, + "opathy": 27189, + "opausal": 47637, + "ope": 3008, + "oped": 19458, + "open": 9654, + "opened": 26350, + "opening": 29443, + "opens": 44813, + "oper": 3575, + "operated": 42767, + "operation": 27184, + "operative": 27173, + "operator": 46616, + "opers": 20618, + "opes": 13920, + "opez": 20808, + "oph": 2522, + "ophe": 43852, + "ophen": 47806, + "opher": 8803, + "ophers": 20856, + "ophical": 49256, + "ophile": 37161, + "ophob": 13253, + "ophobia": 19851, + "ophobic": 23468, + "ophon": 48982, + "ophone": 38656, + "ophy": 16982, + "ophys": 39665, + "ophysical": 41789, + "opia": 24464, + "opian": 37548, + "opic": 16603, + "oping": 15816, + "opl": 20106, + "oplan": 46853, + "ople": 643, + "oples": 12614, + "opol": 39704, + "opolis": 47575, + "opoly": 35894, + "opot": 43372, + "opoulos": 20338, + "opp": 10365, + "oppable": 35628, + "opped": 38333, + "oppers": 37186, + "opping": 33307, + "oppy": 26696, + "ops": 2840, + "opsis": 24608, + "opsy": 44522, + "opt": 8738, + "opted": 45256, + "opter": 32563, + "optim": 40085, + "option": 18076, + "optional": 25968, + "options": 25811, + "opus": 25790, + "opy": 11081, + "oqu": 22696, + "or": 273, + "ora": 5799, + "orable": 10475, + "orage": 4945, + "orah": 40844, + "oral": 6864, + "orama": 36161, + "oran": 31884, + "orange": 43745, + "oras": 41043, + "orate": 16262, + "oration": 6944, + "orative": 36478, + "orb": 27688, + "orbit": 42594, + "orc": 24449, + "orce": 8387, + "ord": 585, + "ordable": 16819, + "ordan": 7350, + "orde": 17531, + "order": 2875, + "ordered": 24071, + "ordering": 34555, + "orders": 6361, + "ordes": 35770, + "ordial": 31223, + "ordinary": 35947, + "ordinate": 45480, + "ording": 1284, + "ordon": 9999, + "ords": 3669, + "ore": 382, + "oreAnd": 40219, + "oreAndOnline": 40240, + "orea": 46215, + "oreal": 39396, + "orean": 29456, + "ored": 1850, + "orem": 29625, + "oren": 29578, + "orer": 11934, + "orers": 28089, + "ores": 2850, + "oresc": 45166, + "orescence": 48699, + "orescent": 35414, + "orest": 26522, + "oret": 9997, + "orf": 24263, + "org": 2398, + "organ": 9971, + "organic": 36617, + "organisms": 45165, + "organized": 30280, + "orge": 3643, + "orget": 28122, + "orgetown": 29085, + "ori": 10145, + "oria": 7661, + "orial": 5132, + "orian": 22618, + "orians": 45825, + "oric": 8146, + "orical": 12409, + "orically": 26847, + "orie": 19257, + "oried": 42058, + "orient": 13989, + "oriented": 17107, + "ories": 1749, + "orig": 11612, + "origin": 47103, + "original": 14986, + "oring": 3255, + "orio": 40974, + "orious": 9982, + "oris": 37279, + "ority": 29134, + "orius": 48759, + "ork": 967, + "orks": 3647, + "orkshire": 29918, + "orld": 1764, + "orm": 579, + "ormal": 6636, + "orman": 26183, + "ormon": 10615, + "ormonal": 33792, + "ormons": 29966, + "orn": 1211, + "orne": 8553, + "orned": 26994, + "orney": 4195, + "orneys": 13060, + "ornia": 3317, + "ornings": 28863, + "orno": 46447, + "orns": 19942, + "oro": 16522, + "oros": 40877, + "orough": 7985, + "orous": 9610, + "orously": 24882, + "orp": 16300, + "orph": 13425, + "orpor": 31150, + "orporated": 40132, + "orr": 38890, + "orrect": 47315, + "orrow": 6254, + "orry": 5152, + "ors": 669, + "orsche": 26164, + "orse": 7615, + "orses": 11836, + "orset": 49590, + "orship": 11094, + "orsi": 35255, + "orst": 29422, + "ort": 419, + "ortal": 16906, + "ortality": 28337, + "orted": 9741, + "orter": 4337, + "orters": 3816, + "ortex": 26158, + "orth": 1506, + "orthern": 4824, + "orthodox": 42539, + "orthy": 18906, + "orting": 24707, + "ortion": 5817, + "ortium": 25182, + "ortment": 33920, + "ortmund": 34876, + "orts": 2096, + "ortun": 1922, + "ortunate": 13651, + "ortunately": 4690, + "oru": 27786, + "orum": 19220, + "orus": 15125, + "ory": 652, + "os": 418, + "osa": 8546, + "osal": 40725, + "osate": 33931, + "osaurs": 22344, + "osaurus": 47650, + "osc": 17500, + "oscope": 40326, + "oscopic": 48228, + "ose": 577, + "osed": 1335, + "osen": 5233, + "oser": 13416, + "oses": 4629, + "osexual": 8542, + "osh": 3768, + "oshenko": 43934, + "osher": 38321, + "oshi": 13704, + "oshop": 25444, + "osi": 21707, + "osing": 2752, + "osion": 18442, + "osis": 5958, + "osit": 7434, + "osite": 5971, + "osition": 3507, + "ositories": 35061, + "ository": 13264, + "osity": 16579, + "oslav": 26388, + "oslov": 50005, + "oso": 28213, + "osp": 2117, + "ospace": 24912, + "ospel": 13994, + "ospels": 41908, + "osph": 14222, + "osphere": 22829, + "ospital": 3531, + "ospons": 35952, + "osponsors": 39500, + "oss": 793, + "ossal": 33582, + "ossession": 49809, + "ossibility": 43691, + "ossible": 4733, + "ossibly": 20846, + "ossier": 30087, + "ossip": 26710, + "ossom": 25548, + "ossus": 36533, + "ost": 455, + "osta": 39818, + "oster": 6197, + "osterone": 16372, + "ostic": 15132, + "ostics": 34558, + "oston": 5744, + "osuke": 45914, + "osure": 4567, + "osures": 16091, + "ot": 313, + "ota": 4265, + "otal": 4997, + "otally": 38908, + "otation": 14221, + "otaur": 35269, + "ote": 1258, + "otech": 32469, + "otechnology": 31201, + "oted": 5191, + "otent": 33715, + "oter": 19543, + "oteric": 38571, + "oters": 26008, + "otes": 6421, + "oth": 849, + "othal": 42376, + "othe": 20388, + "other": 847, + "otherapy": 18952, + "othermal": 49723, + "othes": 31690, + "othing": 24834, + "oths": 27118, + "othy": 14863, + "oti": 5092, + "otiation": 21236, + "otic": 6210, + "otics": 23891, + "otide": 45608, + "otin": 41403, + "otine": 16174, + "oting": 10720, + "otion": 9650, + "otional": 25453, + "otions": 36083, + "otive": 19138, + "otle": 23556, + "oto": 2069, + "otom": 43125, + "otomy": 38385, + "oton": 18970, + "otonin": 29613, + "otor": 20965, + "otos": 14163, + "otrop": 34248, + "otropic": 46084, + "ots": 1747, + "ott": 1252, + "otta": 12375, + "ottage": 29480, + "otte": 11404, + "otted": 8426, + "otten": 4728, + "ottenham": 21889, + "ottest": 24879, + "ottesville": 23806, + "otti": 26380, + "otto": 17631, + "otton": 11324, + "otyp": 17183, + "otype": 8690, + "otypes": 13567, + "ou": 280, + "oub": 12944, + "ouble": 15270, + "oubt": 47675, + "oubted": 15973, + "oubtedly": 16423, + "ouch": 7673, + "ouched": 30075, + "oud": 2778, + "ouf": 37116, + "oufl": 28012, + "oug": 20805, + "ough": 619, + "ought": 2917, + "ouk": 38960, + "oul": 2852, + "ould": 426, + "oulder": 17601, + "oulos": 19537, + "ouls": 42033, + "oult": 25955, + "oultry": 30056, + "oun": 977, + "ounce": 8652, + "ounced": 8918, + "ounces": 45982, + "ouncing": 18155, + "ound": 633, + "ounded": 6302, + "ounding": 9969, + "ounds": 3733, + "ounge": 20891, + "ount": 608, + "ountain": 18635, + "ounter": 6828, + "ounters": 15044, + "ounty": 17705, + "oup": 10486, + "ouple": 43846, + "our": 454, + "ourage": 32885, + "ource": 1668, + "ourced": 30555, + "ources": 2203, + "ourcing": 29985, + "oured": 8167, + "ourge": 14501, + "ourgeois": 18924, + "ouri": 10300, + "ouring": 21823, + "ourke": 49003, + "ourmet": 39094, + "ourn": 1798, + "ournal": 2549, + "ournals": 18408, + "ournament": 5138, + "ournaments": 16950, + "ourney": 5604, + "ourning": 31626, + "ours": 4662, + "ourse": 9047, + "ourses": 39975, + "ourt": 15666, + "ous": 516, + "ousand": 29910, + "ousands": 19983, + "ouse": 1076, + "oused": 29997, + "ousel": 48355, + "ouses": 11370, + "ousing": 12752, + "ously": 3481, + "ousse": 28396, + "oust": 23968, + "oustic": 21618, + "ouston": 6526, + "ousy": 41808, + "out": 448, + "oute": 13192, + "outed": 18534, + "outer": 39605, + "outh": 1536, + "outheast": 14474, + "outheastern": 27873, + "outher": 44262, + "outhern": 4927, + "outine": 28399, + "outing": 13660, + "output": 22915, + "outs": 5269, + "outside": 43435, + "outube": 9762, + "ouver": 10166, + "oux": 22193, + "ov": 709, + "ova": 10071, + "ovable": 21985, + "oval": 8325, + "ovan": 22590, + "ovation": 17882, + "ove": 659, + "oved": 2668, + "ovember": 3239, + "oven": 16206, + "over": 2502, + "overe": 33518, + "overed": 2557, + "overs": 13801, + "overty": 24085, + "overy": 6560, + "oves": 5241, + "ovi": 47297, + "ovic": 17215, + "ovich": 18198, + "ovie": 10739, + "ovies": 20526, + "oving": 5165, + "ovo": 18768, + "ovsky": 29716, + "ovy": 27796, + "ovych": 40822, + "ow": 322, + "owa": 8455, + "owan": 45197, + "oward": 46138, + "oway": 41788, + "owder": 34656, + "owe": 47097, + "owed": 6972, + "owell": 32829, + "ower": 789, + "owered": 10387, + "owers": 3618, + "owicz": 47982, + "owing": 7855, + "owitz": 20951, + "owl": 4883, + "owler": 30014, + "owment": 36569, + "own": 593, + "owned": 11990, + "owner": 18403, + "owners": 15605, + "ownt": 6887, + "owntown": 22748, + "ows": 1666, + "owship": 23473, + "owski": 12079, + "owsky": 47223, + "ox": 1140, + "oxic": 18047, + "oxicity": 44086, + "oxide": 28885, + "oxin": 39366, + "oxy": 23536, + "oy": 726, + "oya": 23790, + "oyal": 4815, + "oyd": 12192, + "oyer": 35301, + "oyle": 19802, + "oys": 19417, + "oz": 8590, + "ozo": 45149, + "ozy": 31060, + "ozyg": 49834, + "oÄŁ": 45492, + "oÄŁan": 48030, + "p": 79, + "pa": 8957, + "pac": 33587, + "pace": 10223, + "paced": 32416, + "paces": 43076, + "pack": 8002, + "package": 26495, + "packages": 43789, + "packed": 34860, + "packing": 41291, + "packs": 32377, + "pad": 15636, + "padding": 39231, + "page": 7700, + "pages": 31126, + "pai": 49712, + "paid": 20333, + "pain": 35436, + "painted": 47351, + "paio": 43491, + "pair": 24874, + "pak": 41091, + "pal": 18596, + "pan": 6839, + "panel": 35330, + "panic": 35843, + "pants": 38895, + "paper": 20189, + "papers": 40491, + "par": 1845, + "parable": 37064, + "paragraph": 20360, + "paralle": 37083, + "paralleled": 37859, + "param": 17143, + "params": 37266, + "pard": 26037, + "pared": 29190, + "paren": 11730, + "parency": 11944, + "parent": 8000, + "parents": 23743, + "park": 20928, + "parse": 29572, + "parser": 48610, + "part": 3911, + "partial": 47172, + "particip": 48013, + "particularly": 31722, + "partisan": 28226, + "parts": 42632, + "party": 10608, + "pas": 44429, + "pass": 6603, + "password": 28712, + "past": 30119, + "paste": 34274, + "pat": 8071, + "patch": 17147, + "path": 6978, + "pathic": 38829, + "pathy": 16786, + "patient": 26029, + "patrick": 29615, + "pattern": 33279, + "pause": 32125, + "pay": 15577, + "payer": 34987, + "payers": 45773, + "paying": 32629, + "payment": 37301, + "pb": 40842, + "pc": 14751, + "pd": 30094, + "pdf": 12315, + "pe": 431, + "peace": 22988, + "peak": 36729, + "peat": 18267, + "pec": 43106, + "pecially": 2333, + "pect": 806, + "pected": 7254, + "pecting": 35570, + "pection": 14978, + "pects": 38046, + "ped": 9124, + "pedia": 50235, + "pee": 39463, + "peed": 39492, + "peer": 33350, + "pees": 42623, + "peg": 22071, + "pei": 33265, + "pel": 30242, + "pell": 23506, + "pelled": 15803, + "pelling": 35025, + "pen": 3617, + "pend": 37038, + "pent": 16923, + "penter": 26419, + "people": 15332, + "per": 525, + "perate": 30052, + "perature": 21069, + "percent": 25067, + "pered": 13653, + "perfect": 25833, + "performance": 26585, + "performing": 37440, + "perhaps": 28998, + "peria": 38032, + "perial": 7629, + "pering": 21255, + "period": 41007, + "perm": 16321, + "peror": 8723, + "perors": 49406, + "pers": 19276, + "perse": 38696, + "person": 6259, + "personal": 22682, + "pert": 11766, + "perties": 18200, + "perture": 27286, + "perty": 9287, + "pes": 12272, + "pet": 6449, + "pex": 24900, + "pez": 46057, + "pg": 6024, + "ph": 746, + "pha": 7566, + "phabet": 19557, + "phal": 27451, + "phalt": 41942, + "phan": 19080, + "phans": 44464, + "phant": 33959, + "phas": 5902, + "phase": 40715, + "phasis": 28432, + "phe": 36335, + "phen": 31024, + "pher": 17042, + "pherd": 23111, + "pheus": 46421, + "phi": 34846, + "phia": 8193, + "phies": 19380, + "phil": 28864, + "philis": 49613, + "phis": 18691, + "phone": 4862, + "phones": 9708, + "phony": 23021, + "phot": 38611, + "photo": 23074, + "photos": 24729, + "php": 10121, + "phrase": 34675, + "phrine": 47723, + "phthal": 48118, + "phy": 6883, + "phys": 34411, + "physical": 42854, + "pi": 14415, + "pic": 16564, + "pick": 27729, + "picked": 41891, + "picking": 48864, + "pict": 18847, + "picture": 34053, + "pictured": 28852, + "pid": 35317, + "pie": 21749, + "piece": 12239, + "pieces": 34154, + "pill": 27215, + "pillar": 41643, + "pin": 11635, + "pine": 23908, + "ping": 13886, + "pins": 49556, + "pipe": 34360, + "pir": 4063, + "piracy": 8703, + "piration": 10514, + "pire": 5111, + "pired": 6474, + "pires": 17833, + "piring": 12987, + "pit": 15544, + "pite": 2595, + "pixel": 32515, + "pkg": 35339, + "pl": 489, + "place": 5372, + "placed": 21820, + "places": 23625, + "plain": 25638, + "plan": 11578, + "plane": 14382, + "planes": 22587, + "planet": 47427, + "planned": 36800, + "plant": 15060, + "plate": 6816, + "plates": 17041, + "platform": 24254, + "play": 1759, + "played": 21542, + "player": 7829, + "players": 32399, + "playing": 17916, + "plays": 26024, + "ple": 1154, + "pleasant": 21109, + "please": 29688, + "pled": 10137, + "plement": 26908, + "plementation": 32851, + "pler": 20053, + "ples": 2374, + "pless": 14570, + "plet": 37069, + "plete": 6677, + "pleted": 16838, + "pleting": 47130, + "pletion": 24547, + "plets": 46916, + "plex": 11141, + "plin": 46982, + "pling": 11347, + "plings": 47093, + "pload": 7304, + "plom": 7302, + "ploma": 35728, + "plot": 29487, + "ploy": 1420, + "plug": 16875, + "plugin": 33803, + "plugins": 37390, + "plus": 9541, + "ply": 2145, + "pm": 4426, + "pmwiki": 45321, + "pn": 21999, + "png": 11134, + "po": 7501, + "pocket": 31991, + "pod": 33320, + "podcast": 46032, + "point": 4122, + "pointer": 29536, + "pointers": 47809, + "points": 13033, + "poke": 35924, + "pol": 16104, + "pole": 36869, + "police": 38191, + "policy": 30586, + "polit": 34470, + "political": 23149, + "politics": 34127, + "poll": 30393, + "poly": 35428, + "pool": 7742, + "poon": 26743, + "poons": 27575, + "poor": 36672, + "pop": 12924, + "popular": 47568, + "population": 39748, + "por": 1819, + "pora": 38851, + "poral": 35738, + "porary": 5551, + "porate": 38133, + "port": 634, + "portation": 10189, + "ported": 9213, + "porter": 26634, + "porting": 26527, + "portion": 16864, + "ports": 3742, + "pos": 1930, + "posal": 40007, + "pose": 3455, + "posed": 29813, + "poses": 4832, + "posing": 32927, + "position": 9150, + "positive": 24561, + "posium": 35864, + "possibly": 39363, + "post": 7353, + "posted": 40578, + "posts": 24875, + "posure": 26205, + "pot": 13059, + "potion": 49324, + "pots": 40793, + "pound": 19568, + "pour": 48681, + "powder": 45855, + "power": 6477, + "powered": 12293, + "powerful": 44548, + "powers": 30132, + "pox": 42557, + "pp": 381, + "ppa": 44989, + "ppard": 43988, + "ppe": 27768, + "pped": 1496, + "ppel": 46357, + "ppelin": 48425, + "pper": 2848, + "pperc": 39921, + "ppers": 11799, + "pping": 2105, + "ppings": 37840, + "ppo": 16634, + "pport": 4926, + "pps": 41799, + "ppy": 14097, + "pr": 1050, + "pract": 29152, + "practice": 39541, + "pre": 3866, + "pread": 9681, + "pred": 28764, + "prefix": 40290, + "prem": 31605, + "prep": 46012, + "pres": 18302, + "present": 25579, + "president": 22540, + "press": 8439, + "pressed": 45477, + "pressure": 36151, + "pret": 5310, + "pretty": 37784, + "prev": 47050, + "pri": 3448, + "price": 20888, + "priced": 30883, + "prim": 19795, + "primary": 39754, + "prime": 35505, + "pring": 12667, + "print": 4798, + "printed": 49695, + "printf": 37435, + "println": 35235, + "prints": 17190, + "priority": 49336, + "prise": 7919, + "prises": 18166, + "prising": 14619, + "prisingly": 20859, + "prison": 35156, + "priv": 13776, + "private": 19734, + "pro": 1676, + "probably": 26949, + "problem": 45573, + "proc": 36942, + "process": 14681, + "processing": 36948, + "processor": 41341, + "proclaimed": 39865, + "produ": 18230, + "produced": 32783, + "producing": 36866, + "product": 11167, + "production": 25493, + "productive": 27781, + "products": 29498, + "prof": 5577, + "professional": 33163, + "profile": 13317, + "profit": 9183, + "profits": 31504, + "program": 23065, + "progress": 33723, + "project": 16302, + "projects": 42068, + "prom": 16963, + "pron": 31186, + "prone": 46330, + "proof": 13288, + "prop": 22930, + "properties": 48310, + "property": 26745, + "prot": 11235, + "protect": 35499, + "protected": 24326, + "protection": 42846, + "protein": 48693, + "prototype": 38124, + "prov": 15234, + "proven": 42874, + "provided": 41279, + "proxy": 36436, + "prus": 26440, + "ps": 862, + "psc": 27566, + "pse": 7752, + "psey": 39070, + "pson": 8430, + "psons": 31410, + "psy": 13764, + "psych": 23947, + "pt": 457, + "pta": 32283, + "pter": 42104, + "ptic": 17459, + "ptin": 43217, + "ption": 1159, + "ptions": 8544, + "ptive": 21665, + "ptives": 43903, + "ptoms": 35533, + "pton": 10972, + "ptr": 20692, + "ptroller": 44913, + "pty": 5835, + "pu": 19944, + "pub": 12984, + "public": 11377, + "published": 30271, + "puff": 49357, + "pull": 31216, + "pun": 35512, + "punk": 30354, + "pur": 14225, + "pure": 37424, + "purpose": 29983, + "push": 14689, + "put": 1996, + "putable": 48840, + "puted": 17128, + "puter": 10549, + "puters": 41510, + "puting": 48074, + "px": 8416, + "py": 9078, + "python": 29412, + "q": 80, + "qa": 20402, + "qi": 40603, + "ql": 13976, + "qq": 38227, + "qqa": 28794, + "qs": 48382, + "qt": 39568, + "qu": 421, + "qua": 39566, + "quad": 47003, + "qual": 13255, + "qualified": 22557, + "quality": 13237, + "quant": 40972, + "quart": 36008, + "quarter": 24385, + "quartered": 42508, + "quarters": 8230, + "que": 4188, + "quel": 31735, + "quer": 10819, + "querade": 33357, + "querque": 36119, + "query": 22766, + "ques": 13281, + "quest": 6138, + "question": 25652, + "quet": 21108, + "queue": 36560, + "quez": 22281, + "quick": 24209, + "quickShip": 39752, + "quickShipAvailable": 39753, + "quiet": 39624, + "quila": 43652, + "quin": 21915, + "quire": 29782, + "quished": 39737, + "quist": 30062, + "quit": 47391, + "quite": 37121, + "quote": 22708, + "qus": 45260, + "qv": 44179, + "r": 81, + "ra": 430, + "rab": 25619, + "rac": 11510, + "race": 16740, + "racial": 33001, + "racist": 41131, + "rack": 39638, + "ract": 974, + "racted": 20216, + "ractical": 36112, + "raction": 7861, + "ractions": 37810, + "ractive": 35587, + "ractor": 40450, + "racuse": 28268, + "rad": 6335, + "rade": 27585, + "radical": 42325, + "radio": 37004, + "radius": 42172, + "rador": 40368, + "rael": 2510, + "raf": 32188, + "raft": 1617, + "rafted": 30235, + "rag": 22562, + "rage": 8394, + "raged": 18312, + "ragon": 25753, + "rah": 11392, + "raham": 13220, + "rahim": 26922, + "raid": 7086, + "rail": 30224, + "rain": 3201, + "raine": 23440, + "rained": 13363, + "raining": 24674, + "raint": 16947, + "raints": 15517, + "raise": 40225, + "raised": 49309, + "raising": 32741, + "rait": 12907, + "raits": 27554, + "rak": 17716, + "rake": 33788, + "ral": 1373, + "rals": 30691, + "raltar": 45662, + "ram": 859, + "rama": 20058, + "rame": 28073, + "rament": 15141, + "ramer": 29172, + "ramid": 20255, + "ramids": 43591, + "rams": 9474, + "ran": 2596, + "rance": 8132, + "ranch": 25642, + "rand": 25192, + "random": 25120, + "rane": 14579, + "ranean": 16474, + "rang": 36985, + "range": 9521, + "ranged": 34457, + "ranging": 32319, + "rank": 43027, + "ranked": 28282, + "ranking": 28405, + "rano": 35823, + "rans": 26084, + "rant": 5250, + "rants": 15087, + "rap": 2416, + "rape": 13484, + "raped": 31951, + "raper": 38545, + "raph": 1470, + "raphic": 22262, + "raphics": 11549, + "rapnel": 48766, + "raq": 3766, + "rar": 20040, + "rared": 25122, + "rarily": 39000, + "rary": 11619, + "ras": 8847, + "rase": 22789, + "rast": 5685, + "rastructure": 6410, + "rat": 10366, + "ratch": 36722, + "rate": 4873, + "rated": 4111, + "rates": 9700, + "rather": 34330, + "rating": 8821, + "ration": 1358, + "rational": 20310, + "rations": 9143, + "rative": 13260, + "ratom": 44616, + "rator": 12392, + "rators": 18942, + "rats": 46714, + "ratulations": 30167, + "raud": 22863, + "raught": 44451, + "rav": 4108, + "rave": 5758, + "raved": 28366, + "ravel": 25843, + "ravings": 42335, + "raviolet": 44223, + "ravis": 16956, + "ravity": 16995, + "raw": 1831, + "rawdownload": 30905, + "rawdownloadcloneembedreportprint": 30906, + "rawl": 13132, + "rawled": 49263, + "rawler": 39464, + "rawling": 18771, + "rawn": 5791, + "rax": 32040, + "ray": 2433, + "rays": 20477, + "raz": 3247, + "razen": 36409, + "razil": 7098, + "razy": 5918, + "rb": 26145, + "rc": 6015, + "rd": 4372, + "re": 260, + "rea": 21468, + "reach": 16250, + "reaching": 30771, + "react": 45018, + "read": 961, + "readable": 46155, + "reader": 46862, + "reading": 25782, + "reads": 40779, + "ready": 1493, + "real": 5305, + "realDonaldTrump": 28024, + "reality": 46290, + "really": 27485, + "ream": 1476, + "reason": 41181, + "reasonable": 42275, + "reat": 630, + "reated": 15978, + "reath": 19367, + "reating": 34567, + "reatment": 21731, + "reau": 43611, + "reb": 34806, + "rec": 8344, + "recated": 31023, + "received": 47844, + "recent": 49921, + "reci": 29102, + "reciation": 33950, + "reck": 11402, + "recogn": 26243, + "recomm": 47335, + "record": 22105, + "recorded": 47398, + "rect": 2554, + "rection": 8243, + "recy": 20568, + "red": 445, + "redd": 26504, + "reddit": 10748, + "reddits": 36581, + "redible": 26260, + "redibly": 45779, + "redict": 17407, + "redients": 23320, + "redit": 7470, + "reditary": 47333, + "reditation": 42845, + "redited": 19465, + "redits": 20696, + "redo": 48454, + "ree": 631, + "reed": 15977, + "reek": 10316, + "reement": 10237, + "reements": 28919, + "reen": 1361, + "reens": 5681, + "reenshot": 26892, + "reenshots": 39551, + "rees": 6037, + "reet": 2871, + "reetings": 46648, + "ref": 5420, + "reference": 35790, + "reflect": 35051, + "reg": 2301, + "regate": 49373, + "regation": 43068, + "region": 36996, + "register": 30238, + "registered": 33736, + "regn": 28321, + "regnancy": 39982, + "regon": 8285, + "regor": 32288, + "regular": 16338, + "regulated": 27739, + "regulation": 27727, + "rehend": 23979, + "rehens": 7345, + "rehensible": 34718, + "rehensive": 36321, + "rek": 37818, + "rel": 2411, + "related": 5363, + "relation": 49501, + "relations": 39468, + "relative": 43762, + "release": 20979, + "released": 30147, + "relevant": 49659, + "religious": 27626, + "rell": 11252, + "rella": 20481, + "rely": 38015, + "rem": 2787, + "reme": 2182, + "remember": 38947, + "remlin": 17244, + "remote": 47960, + "remove": 28956, + "ren": 918, + "rence": 6784, + "rences": 34303, + "rench": 3532, + "renched": 23437, + "renches": 33650, + "rencies": 14038, + "rency": 5227, + "rend": 10920, + "render": 13287, + "rendered": 26238, + "rene": 25924, + "renheit": 34032, + "rent": 1156, + "rentice": 20098, + "rentices": 34368, + "reon": 21833, + "rep": 7856, + "repair": 49932, + "repe": 45956, + "repeat": 44754, + "repl": 35666, + "replace": 33491, + "reply": 47768, + "report": 13116, + "reported": 26263, + "reporting": 49914, + "reportprint": 30897, + "reports": 48922, + "repre": 10353, + "reprene": 10406, + "represent": 15603, + "represented": 33469, + "req": 42180, + "requ": 8897, + "requency": 28707, + "requent": 46018, + "requently": 37971, + "request": 25927, + "require": 46115, + "required": 35827, + "requires": 47911, + "requisite": 27614, + "requisites": 34075, + "rer": 11751, + "rera": 24420, + "rero": 34785, + "rers": 27736, + "res": 411, + "resa": 14625, + "rescent": 26505, + "research": 34033, + "resent": 2028, + "resents": 6629, + "reset": 42503, + "resh": 3447, + "reshold": 10126, + "resident": 8154, + "resist": 35119, + "resistant": 26128, + "resolution": 29268, + "resource": 31092, + "resources": 37540, + "resp": 4363, + "respect": 15008, + "respected": 48268, + "respective": 36990, + "respond": 5546, + "respons": 16733, + "response": 26209, + "responsible": 24358, + "responsive": 39772, + "ress": 601, + "ressed": 2790, + "resses": 16746, + "ressing": 11697, + "ression": 2234, + "ressive": 3314, + "resso": 33852, + "ressor": 44292, + "rest": 2118, + "restling": 48839, + "restrial": 23522, + "restricted": 49343, + "result": 20274, + "results": 43420, + "resy": 33000, + "ret": 1186, + "retch": 22592, + "retched": 27528, + "rete": 8374, + "reth": 40978, + "retion": 12307, + "rets": 8004, + "rett": 11489, + "rette": 42908, + "retty": 16100, + "return": 7783, + "rev": 18218, + "reve": 36955, + "reverse": 50188, + "review": 19023, + "reviewed": 32974, + "revolution": 32243, + "rew": 1809, + "rex": 21510, + "rey": 4364, + "reys": 46703, + "rez": 21107, + "rf": 41871, + "rg": 41345, + "rh": 17179, + "rha": 30268, + "ri": 380, + "ria": 7496, + "riad": 21244, + "riage": 4087, + "riages": 16451, + "rial": 4454, + "rian": 4484, + "rians": 19151, + "rib": 822, + "ribe": 4892, + "ribed": 8725, + "riber": 24735, + "ribes": 22090, + "ribing": 23098, + "rible": 5547, + "ribly": 16358, + "ribune": 44130, + "ribut": 2455, + "ribute": 4163, + "ributed": 6169, + "ributes": 7657, + "ribution": 3890, + "ric": 1173, + "rica": 30997, + "rical": 8143, + "rican": 37189, + "ricane": 11551, + "ricanes": 24881, + "rice": 20970, + "rices": 45977, + "rich": 7527, + "riched": 30486, + "ricia": 26654, + "rick": 5557, + "ricks": 23706, + "rics": 10466, + "rict": 2012, + "ricted": 20941, + "ricting": 42870, + "riction": 46214, + "ricular": 41001, + "rid": 6058, + "ridden": 40372, + "ride": 13154, + "rider": 49449, + "ridge": 12818, + "ridges": 32124, + "ridor": 44425, + "rie": 5034, + "ried": 2228, + "rief": 3796, + "rieg": 48429, + "riel": 11719, + "rien": 15355, + "riend": 1289, + "rient": 8289, + "rients": 18491, + "rier": 5277, + "riers": 8910, + "ries": 1678, + "riet": 42098, + "rieve": 30227, + "rieved": 28130, + "rieving": 37418, + "rification": 38763, + "rifice": 31932, + "rified": 41301, + "rift": 35357, + "rig": 4359, + "rigan": 35631, + "riger": 18096, + "right": 3506, + "righteous": 49955, + "rights": 28046, + "rik": 12602, + "rika": 28716, + "rike": 8760, + "rikes": 18445, + "riks": 39370, + "ril": 22379, + "rill": 20190, + "rils": 41408, + "rily": 28904, + "rim": 3036, + "riminal": 22157, + "rimination": 22550, + "rimp": 23750, + "rin": 12769, + "rina": 22267, + "rine": 7640, + "ring": 1806, + "ringe": 38229, + "rings": 33173, + "rington": 24833, + "rint": 22272, + "rio": 27250, + "rior": 7701, + "riors": 8657, + "riot": 36671, + "riots": 44447, + "riott": 43517, + "rious": 32527, + "rip": 5528, + "ripp": 14602, + "ript": 1968, + "ription": 2918, + "rique": 33865, + "rir": 29283, + "ris": 2442, + "rise": 17163, + "rises": 26064, + "rish": 37518, + "rising": 22610, + "risis": 42841, + "risk": 19121, + "risome": 47400, + "rison": 7426, + "rist": 1585, + "rists": 37326, + "rit": 799, + "ritch": 46510, + "rite": 6525, + "riter": 43407, + "rites": 23156, + "ritic": 46015, + "ritical": 36487, + "rities": 19491, + "rition": 10168, + "ritional": 21297, + "ritis": 27398, + "rito": 39834, + "ritten": 9108, + "rity": 10138, + "ritz": 29574, + "rium": 19172, + "rius": 48969, + "riv": 15104, + "rival": 43171, + "rive": 11590, + "rived": 36207, + "river": 38291, + "rix": 8609, + "riz": 47847, + "rl": 45895, + "rm": 26224, + "rn": 35906, + "ro": 305, + "roach": 28562, + "road": 6344, + "roads": 21372, + "rob": 22609, + "robat": 40655, + "robe": 25481, + "roc": 12204, + "rocal": 43270, + "rock": 10823, + "rocket": 30431, + "rod": 14892, + "rodu": 2076, + "roe": 20646, + "rog": 3828, + "rogen": 8648, + "rogens": 48686, + "rogram": 39529, + "roid": 3882, + "roit": 7775, + "rol": 3225, + "role": 18090, + "rolet": 33087, + "roleum": 21945, + "roll": 2487, + "rolled": 8375, + "roller": 10646, + "rollers": 36667, + "rolley": 42639, + "rolling": 18886, + "rollment": 48108, + "rolog": 40329, + "rology": 31142, + "rom": 398, + "roma": 42902, + "roman": 47119, + "romancer": 38211, + "rome": 5998, + "romeda": 32291, + "romising": 47112, + "rompt": 45700, + "romptu": 49255, + "romy": 50228, + "ron": 1313, + "rone": 33171, + "rones": 9821, + "rongh": 36670, + "ronic": 4565, + "ronics": 20844, + "rons": 12212, + "ront": 4298, + "rontal": 39321, + "roo": 42407, + "room": 3823, + "rooms": 9649, + "root": 15763, + "roots": 19150, + "rop": 1773, + "roph": 10051, + "rophe": 22599, + "rophic": 18191, + "ropolis": 25986, + "ropolitan": 14823, + "ropri": 9219, + "ropy": 28338, + "ror": 1472, + "rored": 34640, + "rors": 5965, + "ros": 4951, + "rosc": 45943, + "rose": 13698, + "rosis": 37172, + "ross": 1214, + "rosse": 39314, + "rosso": 21074, + "rossover": 23954, + "rost": 23341, + "rot": 10599, + "rote": 2519, + "rotein": 35574, + "roth": 33640, + "rots": 24744, + "rou": 472, + "rouch": 48626, + "roud": 5493, + "rough": 740, + "rought": 2909, + "round": 744, + "rounded": 39262, + "rounder": 45788, + "roup": 3233, + "roups": 14459, + "rous": 7596, + "rouse": 46494, + "route": 38629, + "rov": 18657, + "rovers": 31257, + "roversial": 46927, + "row": 808, + "rowd": 3986, + "rower": 46992, + "rowing": 11577, + "rown": 2053, + "rows": 8516, + "rowth": 13046, + "rox": 13907, + "roximately": 24378, + "roxy": 42059, + "roy": 3287, + "roying": 38295, + "rozen": 42005, + "rpm": 48235, + "rr": 21062, + "rs": 3808, + "rss": 42216, + "rt": 17034, + "ru": 622, + "ruary": 3728, + "rub": 25089, + "ruby": 49137, + "ruce": 26524, + "ruciating": 48404, + "ruck": 30915, + "ruct": 1356, + "ruction": 2762, + "ructose": 32275, + "ructure": 5620, + "rue": 24508, + "rued": 21556, + "ruff": 30622, + "rug": 2143, + "rugged": 21901, + "ruit": 4872, + "ruits": 50187, + "rule": 25135, + "rules": 38785, + "ruly": 34715, + "rum": 6582, + "rums": 45241, + "run": 5143, + "runner": 16737, + "runners": 36740, + "running": 20270, + "runs": 48381, + "runtime": 43282, + "rup": 12618, + "rupal": 34585, + "rupt": 3622, + "rupted": 31590, + "ruption": 6417, + "rupulous": 46272, + "rus": 14932, + "rush": 37357, + "rust": 11469, + "rw": 31653, + "rx": 40914, + "ry": 563, + "ryan": 29038, + "ryce": 28169, + "rying": 14992, + "rylic": 34554, + "ryn": 29441, + "rypt": 6012, + "rypted": 15109, + "ryption": 13168, + "rys": 19753, + "ryu": 49056, + "ré": 29350, + "s": 82, + "sa": 11400, + "sac": 30584, + "saf": 49585, + "safe": 21230, + "safety": 44708, + "said": 30079, + "sal": 21680, + "sale": 21378, + "sam": 37687, + "sama": 33843, + "same": 31642, + "sample": 39873, + "san": 12807, + "sand": 38142, + "sat": 49720, + "sav": 39308, + "save": 21928, + "saving": 29336, + "saw": 43439, + "say": 16706, + "sb": 36299, + "sbm": 32310, + "sburg": 30359, + "sburgh": 11931, + "sc": 1416, + "scale": 9888, + "scan": 35836, + "scape": 6794, + "scar": 13034, + "scene": 29734, + "scenes": 28123, + "sch": 20601, + "sche": 15952, + "schild": 35058, + "school": 14347, + "sci": 36216, + "science": 16801, + "scient": 25346, + "scientific": 41355, + "scill": 22360, + "scl": 38528, + "scope": 29982, + "score": 26675, + "scoring": 46536, + "screen": 9612, + "scrib": 40075, + "scribe": 12522, + "scribed": 47495, + "script": 12048, + "scription": 33584, + "scripts": 46521, + "scroll": 48728, + "sd": 21282, + "se": 325, + "sea": 8583, + "search": 12947, + "season": 6230, + "seat": 24073, + "sec": 2363, + "second": 12227, + "secondary": 38238, + "seconds": 43012, + "secret": 21078, + "sect": 8831, + "section": 5458, + "sectional": 44330, + "sections": 23946, + "sector": 34914, + "secure": 22390, + "security": 12961, + "secut": 4552, + "secution": 9534, + "sed": 36622, + "see": 3826, + "seed": 28826, + "seeing": 42041, + "seek": 36163, + "seekers": 47971, + "seeking": 38515, + "seen": 15898, + "sei": 36455, + "sein": 20719, + "sel": 741, + "selage": 45217, + "select": 19738, + "selected": 34213, + "selection": 49283, + "seless": 10950, + "self": 944, + "sell": 7255, + "seller": 32932, + "selling": 16473, + "sels": 14002, + "selves": 2020, + "sem": 43616, + "semb": 4428, + "semble": 15140, + "sembly": 5997, + "sen": 6248, + "senal": 10298, + "send": 21280, + "sense": 33819, + "sensitive": 30176, + "sent": 34086, + "separ": 25512, + "seq": 41068, + "sequ": 3107, + "sequence": 43167, + "sequent": 44399, + "sequently": 20415, + "ser": 2655, + "serial": 46911, + "series": 25076, + "serious": 34009, + "sers": 17720, + "serv": 3168, + "served": 45852, + "server": 15388, + "service": 15271, + "services": 30416, + "serving": 31293, + "ses": 8448, + "session": 29891, + "set": 2617, + "sets": 28709, + "sett": 17744, + "setting": 33990, + "settings": 33692, + "setup": 40406, + "seven": 26548, + "sever": 28116, + "severe": 43070, + "sex": 8044, + "sexual": 18338, + "sey": 4397, + "seys": 27717, + "sf": 28202, + "sg": 45213, + "sh": 1477, + "sha": 26270, + "shadow": 19106, + "shake": 32431, + "shall": 49271, + "shape": 43358, + "shaped": 16760, + "shapeshifter": 33929, + "share": 20077, + "shared": 28710, + "sharing": 21987, + "sharp": 48554, + "shaw": 32832, + "she": 7091, + "shed": 35762, + "sheet": 21760, + "sheets": 42011, + "shell": 29149, + "shi": 44019, + "shield": 26662, + "shift": 30846, + "shine": 19489, + "ship": 6720, + "ships": 26313, + "shire": 10932, + "shirt": 15600, + "shirts": 23231, + "shit": 16211, + "shock": 39563, + "shoot": 30408, + "shop": 24643, + "shore": 14640, + "short": 19509, + "shot": 9442, + "shots": 20910, + "should": 21754, + "show": 12860, + "shown": 42579, + "shows": 49596, + "shr": 36007, + "shut": 49625, + "si": 13396, + "sic": 21383, + "sid": 30255, + "side": 1589, + "sided": 22339, + "sie": 44524, + "sight": 18627, + "sighted": 44068, + "sign": 12683, + "signed": 32696, + "significant": 36591, + "sil": 18217, + "silver": 40503, + "sim": 14323, + "similar": 38610, + "simple": 36439, + "sin": 31369, + "since": 20777, + "sing": 12215, + "single": 29762, + "sis": 13429, + "sit": 48937, + "site": 15654, + "sites": 49315, + "six": 19412, + "size": 7857, + "sized": 13982, + "sk": 8135, + "ski": 20545, + "skill": 42401, + "skilled": 44885, + "skin": 20407, + "skinned": 41412, + "skip": 48267, + "skirts": 28383, + "sky": 15688, + "sl": 6649, + "slaught": 30929, + "slave": 36341, + "sle": 26738, + "sleep": 42832, + "slice": 48369, + "slot": 43384, + "slow": 38246, + "sm": 5796, + "small": 17470, + "smanship": 49820, + "smart": 27004, + "smith": 21453, + "smoking": 48783, + "sn": 16184, + "snap": 45380, + "so": 568, + "soDeliveryDate": 39811, + "soType": 39803, + "soc": 35634, + "social": 14557, + "socket": 44971, + "soever": 15485, + "sofar": 38649, + "soft": 4215, + "software": 43776, + "sol": 34453, + "sold": 24120, + "sole": 6753, + "solete": 23869, + "solid": 39390, + "some": 11246, + "someone": 46248, + "something": 18927, + "sometimes": 29810, + "son": 1559, + "song": 34050, + "sonian": 35202, + "soon": 36194, + "sorry": 41599, + "sort": 30619, + "sound": 23661, + "sounding": 39686, + "source": 10459, + "south": 35782, + "sov": 47272, + "sp": 2777, + "space": 13200, + "span": 12626, + "spawn": 48183, + "spe": 4125, + "speak": 47350, + "speaking": 25159, + "spec": 16684, + "special": 20887, + "species": 35448, + "specific": 11423, + "specified": 23599, + "spect": 4443, + "spection": 31308, + "spective": 49540, + "speech": 45862, + "speed": 12287, + "spell": 46143, + "spin": 39706, + "spir": 45564, + "spirit": 38685, + "spl": 22018, + "split": 35312, + "spoken": 19842, + "spons": 20587, + "sponsored": 25427, + "sports": 32945, + "spot": 20485, + "spr": 34975, + "spread": 43639, + "spring": 16469, + "sq": 31166, + "sql": 25410, + "squ": 16485, + "square": 23415, + "sr": 27891, + "src": 10677, + "ss": 824, + "ssh": 45824, + "ssl": 45163, + "sson": 16528, + "st": 301, + "sta": 38031, + "stab": 39029, + "stable": 31284, + "stack": 25558, + "stad": 24107, + "stadt": 38863, + "staff": 28120, + "stage": 14247, + "stained": 44279, + "stairs": 17617, + "stakes": 32540, + "staking": 40031, + "stal": 7757, + "stall": 32989, + "stals": 41076, + "stan": 14192, + "stanbul": 24179, + "stand": 1481, + "standard": 20307, + "standing": 5646, + "stant": 18797, + "stantial": 41321, + "star": 7364, + "stars": 30783, + "start": 9688, + "started": 46981, + "starter": 12339, + "starting": 38690, + "stasy": 31695, + "stat": 14269, + "state": 5219, + "stated": 21989, + "statement": 26090, + "states": 27219, + "static": 12708, + "station": 17529, + "stats": 34242, + "status": 13376, + "stay": 31712, + "std": 19282, + "ste": 4169, + "stead": 28044, + "steam": 21465, + "steamapps": 31881, + "sted": 30679, + "steel": 44822, + "steen": 42580, + "stein": 5714, + "stellar": 28732, + "stem": 927, + "sten": 26400, + "step": 9662, + "steps": 20214, + "ster": 1706, + "sterdam": 22506, + "sters": 5937, + "stery": 41991, + "sth": 48476, + "stic": 11268, + "stice": 43788, + "stick": 13915, + "sticks": 34810, + "still": 24219, + "stim": 42003, + "stitial": 18167, + "stock": 13578, + "stocks": 29522, + "ston": 3743, + "stone": 6440, + "stones": 28750, + "stood": 6501, + "stop": 11338, + "storage": 35350, + "store": 8095, + "stores": 43409, + "stories": 50164, + "storm": 12135, + "storms": 38563, + "story": 13571, + "stown": 27928, + "str": 2536, + "stra": 12044, + "stract": 8709, + "straight": 42729, + "strap": 26418, + "strate": 23104, + "stration": 12401, + "stre": 22853, + "stream": 5532, + "street": 25662, + "strength": 41402, + "stress": 41494, + "stretched": 49729, + "stri": 33565, + "strike": 33069, + "string": 8841, + "strings": 37336, + "strip": 36311, + "stro": 20661, + "stroke": 30757, + "strom": 20282, + "strong": 11576, + "stros": 48288, + "strous": 22501, + "stru": 19554, + "struct": 7249, + "structed": 16242, + "struction": 15019, + "strument": 43872, + "sts": 6448, + "stud": 19149, + "student": 50139, + "study": 44517, + "stuff": 41094, + "sty": 34365, + "style": 7635, + "styles": 47720, + "su": 2385, + "sub": 7266, + "subject": 32796, + "submit": 46002, + "success": 13138, + "successful": 17212, + "successfully": 37351, + "such": 10508, + "sudo": 24032, + "suff": 37333, + "sufficient": 46790, + "suggest": 47811, + "suit": 6063, + "suits": 16554, + "sum": 16345, + "summary": 49736, + "sun": 19155, + "sung": 9854, + "sup": 37330, + "super": 16668, + "supp": 18608, + "support": 11284, + "supported": 15999, + "sur": 11793, + "sure": 19532, + "surface": 42029, + "surprisingly": 41199, + "surv": 48846, + "susp": 40409, + "sv": 21370, + "sw": 2032, + "swe": 46280, + "sweet": 34751, + "swer": 17845, + "swers": 37848, + "swick": 30961, + "swing": 46737, + "switch": 31943, + "sword": 30553, + "sworth": 30567, + "sy": 1837, + "sych": 2924, + "sylv": 9163, + "sylvania": 9270, + "sym": 37047, + "syn": 28869, + "sync": 27261, + "sys": 17597, + "system": 10057, + "t": 83, + "ta": 8326, + "tab": 8658, + "table": 11487, + "taboola": 10658, + "tackle": 36346, + "tag": 12985, + "tags": 31499, + "tail": 13199, + "tailed": 34966, + "tails": 26404, + "tain": 3153, + "tained": 4644, + "taining": 7339, + "tainment": 10738, + "tains": 12143, + "take": 20657, + "taker": 30157, + "taking": 26103, + "tal": 39240, + "tale": 29429, + "talk": 16620, + "talking": 48186, + "tall": 35429, + "tan": 38006, + "tank": 28451, + "tap": 44335, + "tar": 18870, + "target": 16793, + "tarian": 14012, + "tarians": 28266, + "task": 35943, + "tax": 19290, + "tc": 23047, + "tch": 38664, + "td": 8671, + "te": 660, + "team": 15097, + "tec": 36281, + "tech": 13670, + "techn": 23873, + "technical": 47944, + "technology": 45503, + "ted": 1513, + "teen": 7821, + "teenth": 20283, + "tein": 22006, + "tek": 35424, + "tel": 37524, + "tele": 46813, + "tell": 33331, + "telling": 18072, + "tem": 11498, + "temp": 29510, + "template": 28243, + "ten": 1452, + "tenance": 8219, + "teness": 43205, + "ter": 353, + "tera": 49600, + "terday": 6432, + "tered": 4400, + "tering": 20212, + "terior": 14172, + "term": 4354, + "termin": 23705, + "termination": 41382, + "terms": 38707, + "tern": 759, + "ternal": 4358, + "ternally": 30262, + "terness": 34697, + "ternity": 19682, + "terror": 14007, + "terrorism": 19541, + "terrorist": 42002, + "ters": 1010, + "terson": 23192, + "tery": 11471, + "tes": 4879, + "tesque": 37422, + "test": 9288, + "tested": 39612, + "testers": 27205, + "testing": 33407, + "tests": 41989, + "tesy": 27090, + "tex": 16886, + "text": 5239, + "texture": 41293, + "tf": 27110, + "tg": 25297, + "th": 400, + "tha": 12898, + "thal": 11669, + "than": 14813, + "thank": 40716, + "thanks": 27547, + "that": 5562, + "the": 1169, + "their": 24571, + "thel": 37274, + "theless": 9603, + "them": 18855, + "theme": 43810, + "themed": 26966, + "then": 8524, + "thening": 20563, + "thens": 43895, + "ther": 490, + "there": 8117, + "thereal": 37827, + "thereum": 17733, + "these": 27218, + "they": 9930, + "thia": 31079, + "thin": 40871, + "thing": 1197, + "things": 27971, + "think": 14925, + "thinkable": 37510, + "thinking": 28973, + "third": 17089, + "thirds": 17936, + "thirst": 48832, + "this": 5661, + "thodox": 12836, + "thood": 12951, + "thora": 34261, + "those": 25591, + "though": 2016, + "thought": 28895, + "thouse": 23931, + "thread": 16663, + "threat": 19971, + "threatening": 26159, + "three": 15542, + "thren": 25941, + "thritis": 34043, + "thro": 26110, + "throp": 11360, + "through": 9579, + "throw": 16939, + "ths": 9998, + "thumbnails": 18670, + "thur": 11098, + "thus": 26239, + "thy": 20057, + "ti": 20259, + "tic": 13370, + "tical": 22869, + "tick": 42298, + "ticket": 43350, + "tics": 14094, + "tie": 36224, + "tier": 24948, + "ties": 4278, + "tif": 49929, + "tight": 33464, + "til": 47163, + "tile": 40927, + "tim": 16514, + "time": 2435, + "timeout": 48678, + "timer": 45016, + "times": 22355, + "tin": 43701, + "ting": 889, + "tiny": 44152, + "tion": 5378, + "tions": 45240, + "tip": 22504, + "tips": 41315, + "tis": 48010, + "title": 7839, + "tk": 30488, + "tl": 28781, + "tle": 7100, + "tm": 17209, + "tml": 20369, + "tmp": 22065, + "tn": 34106, + "tnc": 26642, + "to": 1462, + "toc": 40301, + "today": 40838, + "toe": 44579, + "together": 45525, + "toggle": 44256, + "token": 30001, + "told": 44040, + "tom": 39532, + "ton": 1122, + "tone": 41527, + "tones": 36257, + "tons": 27288, + "too": 18820, + "tool": 25981, + "tools": 31391, + "top": 4852, + "topia": 46575, + "topic": 26652, + "tops": 35011, + "tor": 13165, + "torn": 45910, + "total": 23350, + "touch": 29332, + "tower": 36170, + "town": 12735, + "tp": 34788, + "tr": 2213, + "tra": 9535, + "trace": 40546, + "track": 11659, + "tracking": 36280, + "tracks": 46074, + "trade": 25351, + "traditional": 36380, + "train": 27432, + "trained": 35311, + "training": 34409, + "trak": 44195, + "trans": 7645, + "transfer": 39437, + "transform": 35636, + "translation": 41519, + "trap": 46670, + "traumatic": 41521, + "travel": 35927, + "tre": 33945, + "treated": 37182, + "treatment": 42487, + "tree": 21048, + "tri": 28461, + "trial": 45994, + "trigger": 46284, + "trip": 39813, + "trl": 14859, + "tro": 23528, + "trop": 48385, + "true": 7942, + "trump": 40954, + "trust": 38087, + "truth": 35310, + "try": 28311, + "ts": 912, + "tsky": 30394, + "tsy": 34293, + "tt": 926, + "tta": 25854, + "tted": 28734, + "tten": 32407, + "ttes": 13036, + "tti": 35671, + "ttle": 23296, + "tto": 33955, + "ttp": 29281, + "tty": 42852, + "tu": 28047, + "tub": 37995, + "tube": 29302, + "tumblr": 45364, + "tun": 28286, + "tur": 36590, + "turn": 15344, + "turned": 33886, + "tv": 14981, + "tw": 4246, + "twitch": 31844, + "twitter": 6956, + "two": 11545, + "tx": 17602, + "txt": 14116, + "ty": 774, + "tyard": 30308, + "tymology": 43408, + "typ": 28004, + "type": 4906, + "types": 19199, + "typically": 48126, + "tz": 22877, + "u": 84, + "ua": 6413, + "uable": 7153, + "uably": 14632, + "uador": 24201, + "ual": 723, + "uala": 41944, + "uality": 25775, + "ually": 935, + "uan": 7258, + "uana": 5020, + "uania": 29743, + "uart": 19986, + "uary": 2838, + "uate": 4985, + "uated": 6605, + "uates": 12632, + "uating": 11927, + "uation": 2288, + "uations": 6055, + "uay": 30106, + "ub": 549, + "uba": 22013, + "ubb": 33670, + "ubby": 38393, + "ube": 3266, + "uben": 44636, + "uber": 18478, + "uberty": 34237, + "ubes": 29080, + "ubi": 29603, + "ubis": 46676, + "uble": 26664, + "ublic": 841, + "ublished": 33286, + "ubric": 29812, + "ubs": 23161, + "ubuntu": 32230, + "uc": 1229, + "uca": 43120, + "ucc": 18863, + "ucci": 27501, + "uce": 7234, + "uced": 19513, + "ucer": 48915, + "uces": 26873, + "uch": 794, + "ucha": 48022, + "uchi": 22200, + "uchin": 43416, + "uchs": 37533, + "uci": 42008, + "ucing": 25648, + "uck": 1347, + "ucked": 17758, + "ucker": 12603, + "ucket": 38811, + "ucking": 19296, + "uckland": 28789, + "uckle": 29687, + "uckles": 34083, + "ucks": 6238, + "ucky": 5309, + "ucl": 36616, + "ucle": 14913, + "uclear": 4016, + "uct": 4782, + "uction": 8110, + "uctions": 20847, + "uctive": 45857, + "uctor": 33029, + "ud": 463, + "uda": 15339, + "udd": 4185, + "udden": 16557, + "uddenly": 18865, + "udder": 41686, + "uddin": 44008, + "udding": 33926, + "uddle": 24500, + "uddled": 32745, + "uddy": 21584, + "ude": 2507, + "udeau": 16229, + "udeb": 46092, + "uded": 19289, + "uden": 44452, + "udence": 42581, + "uder": 26651, + "uders": 48739, + "udes": 8401, + "udge": 12587, + "udget": 29427, + "udging": 38840, + "udi": 47928, + "udic": 28673, + "udicrous": 33784, + "uding": 26570, + "udo": 12003, + "udos": 42418, + "uds": 24786, + "ue": 518, + "uebl": 45749, + "ued": 1739, + "uel": 2731, + "ueless": 38835, + "ueller": 16466, + "uer": 15573, + "uers": 42178, + "ues": 947, + "uesday": 3322, + "uese": 20506, + "uez": 14870, + "uf": 3046, + "ufact": 3603, + "uff": 1648, + "uffed": 18339, + "uffer": 13712, + "ufficient": 15267, + "uffle": 18137, + "uffs": 18058, + "uffy": 15352, + "ug": 1018, + "uga": 30302, + "ugal": 43778, + "ugar": 35652, + "uge": 2217, + "ugen": 42740, + "ugg": 6837, + "uggage": 29672, + "uggest": 29212, + "uggets": 26550, + "uggish": 36295, + "uggle": 33498, + "ugh": 6724, + "ught": 8951, + "ugi": 45659, + "ugs": 10339, + "ugu": 45284, + "uh": 7456, + "ui": 9019, + "uid": 27112, + "uild": 3547, + "uilding": 6963, + "uilt": 21955, + "uin": 48441, + "uine": 8327, + "uing": 4250, + "uint": 28611, + "uish": 32091, + "uit": 5013, + "uitive": 33740, + "uitous": 42412, + "uits": 15379, + "uity": 14834, + "uj": 23577, + "ujah": 46024, + "uk": 2724, + "uka": 14852, + "uke": 4649, + "uked": 48809, + "ukemia": 43505, + "ukes": 31469, + "uki": 11308, + "uko": 29794, + "ukong": 46654, + "uku": 33263, + "ul": 377, + "ula": 4712, + "ular": 934, + "ularity": 33737, + "ulas": 25283, + "ulate": 5039, + "ulated": 4817, + "ulates": 15968, + "ulating": 8306, + "ulation": 1741, + "ulations": 5768, + "ulative": 13628, + "ulator": 8927, + "ulators": 24325, + "ulatory": 21386, + "uld": 32926, + "ule": 2261, + "uled": 6309, + "ulence": 32401, + "ulent": 15288, + "uler": 18173, + "ules": 5028, + "ulet": 25132, + "ulf": 4754, + "ulhu": 36828, + "uli": 32176, + "ulia": 43640, + "ulic": 28575, + "uliffe": 45228, + "ulin": 11599, + "uling": 16619, + "ulk": 12171, + "ulkan": 31263, + "ull": 724, + "ulla": 47972, + "ullah": 38665, + "ullivan": 16040, + "ully": 2132, + "ulner": 5697, + "ulnerability": 40920, + "ulnerable": 38828, + "ulo": 43348, + "ulous": 6985, + "ulously": 18117, + "ulp": 29528, + "ulpt": 13327, + "uls": 5753, + "ulse": 9615, + "ulsion": 15204, + "ulsive": 22220, + "ult": 586, + "ultan": 30454, + "ultane": 9560, + "ultimate": 44818, + "ulton": 37944, + "ults": 8376, + "ultural": 8596, + "ulture": 6456, + "ulty": 10672, + "ultz": 22150, + "ulu": 15712, + "ulum": 14452, + "ulus": 23515, + "uly": 2062, + "ulz": 37314, + "um": 388, + "uma": 7487, + "umably": 31303, + "uman": 3778, + "umann": 40062, + "umar": 44844, + "umat": 27798, + "umatic": 16735, + "umb": 2178, + "umbai": 21645, + "umber": 4494, + "umbered": 26584, + "umbers": 17024, + "umbing": 28149, + "umble": 10344, + "umbled": 11137, + "umbledore": 25549, + "umbles": 25329, + "umbling": 14739, + "umblr": 15566, + "umbn": 10269, + "umbnail": 20566, + "umbnails": 13668, + "umbo": 29309, + "umbs": 18146, + "ume": 2454, + "umed": 18940, + "umen": 20080, + "ument": 1713, + "umenthal": 42300, + "uments": 2886, + "umer": 6975, + "umerable": 30831, + "umeric": 39223, + "umerous": 31385, + "umers": 31260, + "umes": 8139, + "umi": 12994, + "umin": 7230, + "uminati": 37200, + "uming": 12595, + "uminium": 35241, + "uminum": 13074, + "umm": 13929, + "ummer": 31647, + "ummies": 39578, + "ummy": 13513, + "umn": 4182, + "umni": 25402, + "umo": 43712, + "ump": 931, + "umped": 27073, + "umper": 15829, + "umph": 12875, + "umping": 25218, + "umps": 8142, + "umption": 24098, + "umpy": 32152, + "ums": 5700, + "umsy": 37133, + "un": 403, + "una": 9613, + "unal": 18835, + "unc": 19524, + "unch": 3316, + "unci": 49652, + "unciation": 24978, + "uncle": 29942, + "unct": 16260, + "unction": 4575, + "unctions": 46797, + "uncture": 39187, + "und": 917, + "unda": 46535, + "undai": 44591, + "under": 4625, + "unders": 41116, + "undle": 31249, + "undo": 41204, + "undown": 41609, + "undred": 3229, + "undreds": 20960, + "undrum": 46859, + "undy": 45459, + "une": 1726, + "uned": 40881, + "uner": 38886, + "unes": 4015, + "ung": 2150, + "ungle": 13687, + "uni": 35657, + "unia": 39934, + "unic": 46903, + "unicip": 9462, + "unin": 38453, + "uning": 46493, + "union": 24592, + "unique": 34642, + "unit": 20850, + "united": 41187, + "units": 41667, + "unity": 9531, + "universal": 40082, + "unk": 2954, + "unker": 21705, + "unknown": 34680, + "unks": 14125, + "unky": 28898, + "unless": 25252, + "unn": 20935, + "unning": 16596, + "unny": 16948, + "uno": 36909, + "uns": 13271, + "unsigned": 43375, + "unt": 2797, + "unta": 44424, + "untarily": 49605, + "untary": 26468, + "unte": 6311, + "until": 28446, + "untled": 46343, + "unts": 34115, + "untu": 11157, + "uo": 20895, + "uous": 5623, + "uously": 24987, + "up": 929, + "update": 19119, + "updated": 43162, + "upe": 48722, + "uper": 48568, + "uph": 25689, + "uphem": 45640, + "upid": 7658, + "upiter": 21251, + "uple": 29291, + "upload": 25850, + "uploads": 39920, + "upon": 27287, + "upp": 7211, + "upper": 45828, + "uppet": 44933, + "ups": 4739, + "upt": 37623, + "upuncture": 42223, + "ur": 333, + "ura": 5330, + "urable": 11970, + "uracy": 23843, + "urai": 16998, + "ural": 1523, + "urally": 20221, + "uran": 42211, + "urance": 3874, + "urances": 31741, + "uras": 17786, + "urat": 39928, + "urate": 15537, + "urated": 49293, + "uration": 3924, + "urations": 20074, + "urb": 5945, + "urban": 32679, + "urbed": 37694, + "urch": 2575, + "urchase": 18737, + "urches": 12730, + "urd": 2799, + "urden": 42568, + "urdue": 30345, + "urdy": 22876, + "ure": 495, + "ureau": 6262, + "ured": 1522, + "ureen": 49851, + "uren": 23532, + "urer": 15051, + "urers": 17496, + "ures": 942, + "urg": 3686, + "urga": 45098, + "urger": 32650, + "urgical": 31839, + "urgy": 38140, + "uri": 9900, + "uria": 34484, + "uries": 4740, + "uring": 870, + "urion": 40956, + "urious": 16421, + "uristic": 27915, + "urities": 10886, + "urity": 1684, + "urized": 44796, + "url": 6371, + "urn": 700, + "urnal": 35735, + "urned": 44866, + "uro": 1434, + "uron": 44372, + "urous": 29277, + "urrection": 21384, + "urred": 12808, + "urrence": 33928, + "urrencies": 28018, + "urrency": 13382, + "urrent": 6657, + "urring": 14924, + "urry": 16682, + "urs": 1834, + "ursday": 3479, + "urse": 12321, + "ursed": 17539, + "urses": 46998, + "ursion": 24197, + "ursions": 42394, + "ursive": 30753, + "ursor": 21471, + "urst": 24962, + "urt": 3325, + "urther": 1914, + "urtle": 17964, + "urtles": 25195, + "uru": 14717, + "urus": 31891, + "ury": 1601, + "us": 385, + "usa": 22064, + "usable": 31979, + "usage": 26060, + "usal": 6775, + "usalem": 10555, + "usat": 37937, + "usb": 43319, + "usc": 16241, + "uscript": 15817, + "use": 1904, + "used": 1484, + "user": 7220, + "userc": 43298, + "usercontent": 43667, + "username": 29460, + "users": 18417, + "uses": 2664, + "useum": 6744, + "ush": 1530, + "usha": 46213, + "ushed": 7474, + "usher": 34055, + "ushes": 17237, + "ushi": 17731, + "ushima": 30474, + "ushing": 8023, + "using": 3500, + "usion": 4241, + "usional": 41780, + "usions": 15880, + "usive": 11350, + "usk": 17990, + "usky": 42431, + "usp": 17723, + "usr": 14629, + "usra": 28352, + "uss": 1046, + "ussed": 29569, + "ussen": 35951, + "ussia": 31269, + "ussian": 31562, + "ussie": 43480, + "ussion": 11956, + "ussions": 21585, + "ussy": 14650, + "ust": 436, + "ustain": 19542, + "ustainable": 24196, + "usted": 8459, + "uster": 5819, + "usterity": 20761, + "usters": 13654, + "usting": 32620, + "ustom": 1824, + "ustomed": 22646, + "ustration": 44027, + "usual": 37850, + "usually": 23073, + "ut": 315, + "uta": 29822, + "utable": 18187, + "utan": 37878, + "utation": 7094, + "utations": 32855, + "utch": 7140, + "ute": 1133, + "uted": 7241, + "uten": 7809, + "utenant": 15340, + "utenberg": 19028, + "uter": 11894, + "uters": 5843, + "uterte": 23314, + "utes": 1769, + "utf": 40477, + "uth": 1071, + "uther": 12866, + "utherford": 46923, + "utherland": 45384, + "uthor": 1457, + "uti": 47966, + "utic": 18089, + "utical": 14224, + "utics": 48063, + "uties": 8249, + "util": 22602, + "utils": 26791, + "uting": 15129, + "ution": 1009, + "utions": 3508, + "utive": 8827, + "utm": 26841, + "uto": 9390, + "uton": 32894, + "utonium": 43078, + "utor": 38409, + "utorial": 44917, + "utory": 17957, + "utra": 35076, + "utral": 6815, + "uts": 5500, + "utsch": 40768, + "utsche": 30433, + "utsu": 36567, + "utt": 15318, + "utter": 10381, + "uttered": 46322, + "uttering": 33598, + "utters": 46973, + "utterstock": 28819, + "utton": 21115, + "uture": 1832, + "uty": 3935, + "utz": 27839, + "uu": 12303, + "uum": 13814, + "uv": 14795, + "uve": 45177, + "uvian": 50013, + "ux": 2821, + "uxe": 18095, + "uy": 4669, + "uyomi": 40012, + "uz": 10277, + "uzz": 4715, + "uzzle": 9625, + "v": 85, + "vP": 47322, + "va": 6862, + "vable": 23765, + "vacc": 37839, + "vae": 33353, + "vag": 29821, + "val": 2100, + "vale": 41161, + "valid": 12102, + "vals": 12786, + "value": 8367, + "valued": 39728, + "values": 27160, + "van": 10438, + "vana": 33175, + "vance": 19259, + "vant": 4520, + "vantage": 38815, + "var": 7785, + "vard": 10187, + "vari": 25641, + "variable": 45286, + "vas": 11017, + "vasive": 23747, + "vati": 36868, + "vation": 10473, + "vc": 28435, + "vd": 20306, + "ve": 303, + "vec": 35138, + "vector": 31364, + "ved": 1079, + "veh": 33892, + "vel": 626, + "veland": 9731, + "velength": 26623, + "vell": 29333, + "velop": 1091, + "velt": 18065, + "ven": 574, + "venant": 15330, + "venants": 43773, + "venge": 18674, + "venient": 48109, + "vent": 1151, + "venth": 20987, + "vention": 4018, + "ventional": 20405, + "ventions": 16593, + "ventory": 17158, + "venture": 5388, + "ventures": 10065, + "ventus": 35648, + "venue": 4080, + "ver": 332, + "verage": 1857, + "verages": 23118, + "verb": 19011, + "verbal": 46953, + "verbs": 46211, + "vere": 4119, + "vered": 21917, + "verend": 37713, + "verett": 33395, + "verified": 47684, + "vern": 933, + "vernight": 47443, + "verning": 13974, + "vernment": 11355, + "vers": 690, + "verse": 4399, + "versely": 21243, + "versible": 37393, + "version": 9641, + "versions": 47178, + "versive": 40099, + "verson": 49589, + "vert": 1851, + "verted": 13658, + "verting": 48820, + "vertis": 3346, + "vertisement": 4060, + "vertisements": 11371, + "vertising": 31809, + "verts": 24040, + "verty": 8077, + "very": 548, + "ves": 1158, + "vest": 4223, + "vet": 16809, + "vette": 33573, + "vey": 3304, + "veyard": 21563, + "vez": 33425, + "vg": 45119, + "vi": 8903, + "via": 8869, + "viation": 47625, + "vic": 25531, + "vice": 28281, + "vich": 49547, + "vict": 32433, + "vid": 16921, + "video": 15588, + "videos": 32861, + "vidia": 21744, + "vier": 49663, + "view": 1177, + "views": 33571, + "vik": 28930, + "viks": 45901, + "vil": 2991, + "vill": 41082, + "ville": 4244, + "vim": 31124, + "vin": 7114, + "vind": 50172, + "vine": 26818, + "ving": 1075, + "viol": 17069, + "violence": 37502, + "violent": 24498, + "vious": 1442, + "viously": 8647, + "vir": 37040, + "viron": 2268, + "vironment": 2468, + "vironments": 12103, + "virt": 48940, + "virtual": 32844, + "vis": 4703, + "vised": 16149, + "visible": 23504, + "vision": 10178, + "visor": 13131, + "visors": 27681, + "visory": 41783, + "visual": 41464, + "vity": 21319, + "vl": 19279, + "vm": 14761, + "vo": 13038, + "voc": 18893, + "voice": 38888, + "void": 19382, + "vol": 10396, + "volent": 29078, + "volt": 37764, + "volume": 29048, + "von": 26982, + "vor": 20867, + "vote": 27257, + "votes": 29307, + "vous": 31222, + "voy": 40024, + "vp": 36133, + "vr": 37020, + "vre": 43933, + "vs": 14259, + "vt": 36540, + "vu": 40939, + "vv": 25093, + "vy": 7670, + "w": 86, + "wa": 10247, + "wage": 21482, + "wagen": 29160, + "wagon": 41127, + "wait": 17077, + "wake": 48530, + "wal": 16783, + "wald": 21667, + "walk": 11152, + "walker": 20783, + "walking": 44065, + "wall": 11930, + "wallet": 44623, + "wan": 8149, + "wana": 49484, + "wang": 47562, + "want": 42949, + "war": 5767, + "ward": 904, + "wards": 2017, + "ware": 1574, + "wark": 48542, + "warm": 31975, + "warming": 48133, + "warn": 40539, + "warning": 43917, + "wart": 24657, + "warts": 26586, + "was": 9776, + "wash": 34670, + "washed": 45462, + "washer": 45146, + "washing": 38524, + "wat": 47261, + "watch": 8340, + "watching": 50042, + "water": 7050, + "waters": 41555, + "waukee": 15428, + "wav": 45137, + "wave": 19204, + "waves": 32569, + "way": 1014, + "wayne": 43932, + "ways": 1322, + "wb": 39346, + "wcs": 12712, + "wcsstore": 12781, + "wd": 16993, + "we": 732, + "weak": 38695, + "wealth": 14298, + "weapon": 28741, + "weapons": 33999, + "wear": 13927, + "weather": 23563, + "web": 12384, + "webkit": 43648, + "wed": 19103, + "weed": 39054, + "week": 10464, + "weekly": 45291, + "ween": 975, + "weeney": 41681, + "weet": 7277, + "wegian": 20684, + "wei": 42990, + "weight": 6551, + "weights": 43775, + "well": 4053, + "wen": 21006, + "went": 19963, + "wer": 15448, + "were": 22474, + "wered": 8279, + "west": 7038, + "western": 14197, + "wh": 1929, + "what": 10919, + "whatever": 39664, + "whe": 12491, + "wheel": 22001, + "whel": 30613, + "whelming": 36433, + "when": 12518, + "where": 3003, + "whether": 25356, + "which": 4758, + "while": 4514, + "white": 11186, + "who": 8727, + "whose": 38159, + "why": 22850, + "wi": 37686, + "wic": 22664, + "wich": 11451, + "wick": 16239, + "wid": 28029, + "wide": 4421, + "widget": 42655, + "width": 10394, + "wife": 22095, + "wig": 28033, + "wik": 20763, + "wiki": 15466, + "wikipedia": 31266, + "wild": 21992, + "will": 10594, + "win": 5404, + "wind": 7972, + "window": 17497, + "windows": 28457, + "wine": 39002, + "wing": 5469, + "wings": 48819, + "winner": 39791, + "winning": 14463, + "winter": 40078, + "wire": 21809, + "wired": 44236, + "wise": 3083, + "wit": 39289, + "witch": 42248, + "with": 4480, + "within": 33479, + "without": 19419, + "withstanding": 20701, + "witz": 28155, + "wives": 35234, + "wk": 43021, + "wl": 40989, + "wm": 26377, + "wn": 675, + "wo": 21638, + "wolf": 18829, + "wolves": 29664, + "woman": 8580, + "women": 25878, + "won": 26502, + "wood": 3822, + "woods": 39493, + "word": 4775, + "wordpress": 40346, + "words": 10879, + "work": 1818, + "worked": 32931, + "worker": 28816, + "workers": 22896, + "working": 16090, + "works": 5225, + "workshop": 38067, + "world": 6894, + "worldly": 49366, + "worm": 25323, + "worms": 49617, + "worn": 34565, + "worst": 41430, + "worth": 9268, + "worthiness": 48756, + "worthy": 18275, + "would": 19188, + "wow": 42773, + "wp": 24142, + "wr": 18351, + "wra": 29988, + "wrap": 37150, + "wrapper": 48553, + "wreck": 39238, + "wright": 29995, + "writ": 8933, + "write": 13564, + "writer": 16002, + "writers": 34422, + "writing": 16502, + "written": 15266, + "wrong": 36460, + "wrote": 42910, + "ws": 18504, + "wt": 46569, + "wu": 43812, + "ww": 1383, + "www": 2503, + "wx": 49345, + "wy": 21768, + "wyn": 27612, + "x": 87, + "xa": 27865, + "xb": 30894, + "xc": 25306, + "xd": 24954, + "xe": 27705, + "xes": 48169, + "xf": 26152, + "xff": 47596, + "xi": 29992, + "xia": 36072, + "xiety": 35753, + "xious": 48392, + "xit": 10198, + "xml": 19875, + "xon": 23813, + "xp": 42372, + "xs": 34223, + "xt": 742, + "xtap": 42915, + "xton": 22874, + "xual": 5541, + "xus": 40832, + "xx": 5324, + "xxx": 31811, + "xxxx": 12343, + "xxxxxxxx": 24223, + "xy": 5431, + "y": 88, + "ya": 3972, + "yah": 46848, + "yahoo": 40774, + "yan": 4121, + "yang": 17859, + "yard": 9413, + "yards": 33750, + "ycle": 39297, + "yd": 5173, + "yden": 43955, + "ydia": 30708, + "ye": 5948, + "yeah": 43669, + "year": 1941, + "years": 19002, + "yellow": 36022, + "yer": 9860, + "yers": 21200, + "yes": 8505, + "yet": 25907, + "yg": 35641, + "yi": 48111, + "ying": 1112, + "yip": 39666, + "yk": 48361, + "yl": 2645, + "ylan": 18554, + "yle": 2349, + "ylene": 37880, + "yles": 24327, + "yll": 25727, + "ylon": 15158, + "ylum": 11183, + "ym": 4948, + "ymes": 22009, + "ymm": 26621, + "ymph": 20896, + "yn": 2047, + "yna": 46434, + "ynam": 4989, + "ynamic": 28995, + "ynasty": 19488, + "ync": 13361, + "ynchron": 24871, + "ynchronous": 31301, + "yne": 39547, + "ynes": 25337, + "ynski": 40008, + "ynt": 33567, + "ynthesis": 44411, + "yo": 8226, + "yon": 19181, + "yond": 3243, + "you": 5832, + "young": 35465, + "your": 14108, + "yout": 32015, + "youtu": 32594, + "youtube": 11604, + "yp": 4464, + "ype": 2981, + "ypes": 9497, + "yr": 2417, + "yre": 35759, + "yrics": 14279, + "yright": 4766, + "yrights": 49158, + "yrim": 17302, + "yrinth": 21324, + "yrs": 48489, + "yrus": 21180, + "ys": 893, + "ysc": 28349, + "ysical": 15380, + "ysics": 23154, + "ysis": 3097, + "yson": 19699, + "yss": 33968, + "yssey": 23784, + "ystem": 6781, + "yt": 20760, + "yth": 5272, + "ythm": 34853, + "ython": 7535, + "yton": 31616, + "yu": 24767, + "yx": 28391, + "yy": 22556, + "yz": 45579, + "z": 89, + "za": 4496, + "zac": 49897, + "zag": 50183, + "zai": 35142, + "zan": 15201, + "zanne": 38395, + "zar": 41046, + "zb": 14969, + "zbek": 40413, + "zbollah": 21677, + "ze": 2736, + "zeb": 38130, + "zech": 15356, + "zed": 8863, + "zee": 42871, + "zees": 43727, + "zek": 43130, + "zel": 17396, + "zen": 4801, + "zens": 8247, + "zer": 9107, + "zero": 22570, + "zers": 47031, + "zes": 12271, + "zh": 23548, + "zhen": 46732, + "zhou": 38536, + "zi": 17027, + "zie": 49746, + "zig": 38262, + "zik": 47303, + "zilla": 16496, + "zin": 42140, + "zing": 9510, + "zinski": 46394, + "zip": 13344, + "zl": 48274, + "zman": 32054, + "zn": 47347, + "zo": 10872, + "zon": 26361, + "zona": 7551, + "zone": 11340, + "zos": 37925, + "zsche": 37467, + "zu": 27624, + "zx": 42592, + "zy": 7357, + "zyk": 46355, + "zyme": 24266, + "zynski": 47143, + "zz": 3019, + "zza": 34443, + "zzi": 46218, + "zzle": 26413, + "zzo": 47802, + "zzy": 31570, + "{": 90, + "{\"": 4895, + "{\\": 31478, + "{{": 27007, + "|": 91, + "||": 15886, + "||||": 42210, + "}": 92, + "}\"": 36786, + "})": 30072, + "});": 22133, + "},": 5512, + "},\"": 9063, + "},{\"": 8762, + "}.": 27422, + "}:": 38362, + "};": 19629, + "}\\": 32239, + "}{": 18477, + "}}": 11709, + "}}}": 42535, + "~": 93, + "~~": 4907, + "~~~~": 8728, + "~~~~~~~~": 15116, + "~~~~~~~~~~~~~~~~": 27156, + "¡": 94, + "¢": 95, + "£": 96, + "£ı": 6408, + "¤": 97, + "¥": 98, + "¥µ": 35069, + "¥ŀ": 13945, + "¦": 99, + "§": 100, + "¨": 101, + "©": 102, + "©¶æ": 47490, + "©¶æ¥µ": 47703, + "ª": 103, + "«": 104, + "«ĺ": 45865, + "¬": 105, + "¬¼": 45539, + "®": 106, + "¯": 107, + "°": 108, + "±": 109, + "²": 110, + "²¾": 39333, + "³": 111, + "´": 112, + "µ": 113, + "¶": 114, + "¶æ": 35050, + "¶ħ": 41678, + "·": 115, + "¸": 116, + "¹": 117, + "º": 118, + "»": 119, + "»Ĵ": 36596, + "¼": 120, + "½": 121, + "¾": 122, + "¿": 123, + "¿½": 4204, + "À": 124, + "Á": 125, + "Â": 126, + "¢": 44359, + "£": 14988, + "§": 16273, + "¨": 37102, + "©": 16224, + "«": 24328, + "®": 7461, + "®,": 45088, + "¯": 5196, + "¯¯": 5367, + "¯¯¯¯": 8980, + "¯¯¯¯¯¯¯¯": 15243, + "¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯": 27006, + "°": 7200, + "±": 22519, + "²": 31185, + "´": 18265, + "¶": 26604, + "·": 9129, + "··": 35147, + "º": 36165, + "»": 17730, + "½": 23141, + "Âł": 1849, + "³³": 4603, + "³³³": 33477, + "³³³³": 8828, + "³³³³³³³³": 17811, + "³³³³³³³³³³³³³³³³": 39172, + "ÂŃ": 3907, + "Ã": 127, + "á": 6557, + "án": 21162, + "ás": 40138, + "â": 22940, + "ã": 26102, + "ão": 28749, + "ä": 11033, + "Ã¥": 29090, + "æ": 21241, + "ç": 16175, + "ça": 50041, + "è": 14064, + "ère": 35979, + "é": 2634, + "ée": 22161, + "én": 35942, + "ér": 42445, + "és": 20954, + "ét": 25125, + "ê": 25792, + "ë": 26689, + "î": 34803, + "ï": 26884, + "ïve": 38776, + "ð": 27214, + "ñ": 12654, + "ña": 30644, + "ño": 31329, + "ó": 10205, + "ón": 18840, + "ô": 27083, + "ö": 9101, + "ön": 48863, + "ör": 30570, + "ø": 24172, + "ú": 21356, + "û": 42324, + "ü": 9116, + "ür": 25151, + "ÃĤ": 5523, + "Ãĥ": 5746, + "ÃĥÃĤ": 5808, + "ÃĥÃĤÃĥÃĤ": 5815, + "ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ": 9364, + "ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ": 14827, + "ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ": 23090, + "ÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤÃĥÃĤ": 35496, + "Ãī": 38351, + "Ãį": 38638, + "ÃįÃį": 43569, + "ÃĹ": 12906, + "ÃĽ": 34543, + "ÃĽÃĽ": 48396, + "ÃŁ": 39683, + "Ãł": 24247, + "ÃŃ": 8836, + "ÃŃa": 29690, + "ÃŃn": 39588, + "ÃŃs": 41200, + "Ä": 128, + "Ä«": 18962, + "ı": 30102, + "Äģ": 10235, + "Äĩ": 38325, + "Äį": 46195, + "Äĵ": 27092, + "ÄŁ": 33133, + "Å": 129, + "Å¡": 32790, + "Å«": 20317, + "ÅĤ": 41615, + "Åį": 13090, + "ÅŁ": 46481, + "Æ": 130, + "Ç": 131, + "È": 132, + "É": 133, + "Ê": 134, + "Ë": 135, + "ËĪ": 45990, + "Ëľ": 41185, + "Ì": 136, + "̶": 48869, + "Í": 137, + "Î": 138, + "α": 17394, + "β": 26638, + "γ": 42063, + "ε": 30950, + "ι": 29945, + "κ": 43000, + "λ": 39377, + "μ": 34703, + "ν": 26180, + "ο": 26517, + "Ï": 139, + "ÏĢ": 46582, + "Ïģ": 33643, + "ÏĤ": 35558, + "Ïĥ": 38392, + "ÏĦ": 32830, + "Ïī": 49535, + "Ð": 140, + "а": 16142, + "в": 38857, + "д": 43666, + "е": 16843, + "и": 18849, + "к": 31583, + "л": 30143, + "м": 43108, + "н": 22177, + "о": 15166, + "оÐ": 25443, + "Ñ": 141, + "ÑĢ": 21169, + "Ñģ": 21727, + "ÑĤ": 20375, + "Ñĥ": 35072, + "Ñĭ": 45035, + "ÑĮ": 45367, + "Ñı": 40623, + "Ò": 142, + "Ó": 143, + "Ô": 144, + "Õ": 145, + "Ö": 146, + "Ö¼": 47903, + "×": 147, + "ר": 37778, + "ש": 50227, + "ת": 42064, + "×IJ": 42973, + "×ij": 49603, + "×Ķ": 38269, + "×ķ": 27072, + "×Ļ": 25529, + "×Ļ×": 33951, + "׾": 40010, + "×ŀ": 49168, + "Ø": 148, + "ا": 12919, + "اØ": 34247, + "اÙĦ": 23525, + "ب": 39848, + "Ø©": 45632, + "ت": 41486, + "د": 38843, + "ر": 26897, + "س": 45692, + "ع": 44690, + "Ù": 149, + "ÙĦ": 13862, + "Ùħ": 25405, + "ÙĨ": 23338, + "Ùĩ": 29519, + "ÙĪ": 30335, + "ÙĬ": 22654, + "Ùİ": 24333, + "ÙIJ": 44208, + "ÙĴ": 48763, + "Ú": 150, + "Û": 151, + "Ü": 152, + "Ý": 153, + "Þ": 154, + "ß": 155, + "à": 156, + "à¤": 11976, + "ा": 48077, + "à¥": 24231, + "à¦": 48071, + "à¨": 19469, + "à©": 43297, + "à¸": 19567, + "à¹": 31479, + "à¼": 41340, + "á": 157, + "áµ": 39611, + "á¸": 41585, + "á¹": 26292, + "á½": 45495, + "â": 158, + "âĢ": 447, + "âĢ¢": 3581, + "âĢ¢âĢ¢": 22838, + "âĢ¢âĢ¢âĢ¢âĢ¢": 39967, + "âĢ¦": 1399, + "âĢ¦\"": 9962, + "âĢ¦)": 38418, + "âĢ¦.": 11580, + "âĢ¦.\"": 50248, + "âĢ¦..": 30864, + "âĢ¦]": 21476, + "âĢ¦âĢ¦": 7398, + "âĢ¦âĢ¦âĢ¦âĢ¦": 15864, + "âĢ¦âĢ¦âĢ¦âĢ¦âĢ¦âĢ¦âĢ¦âĢ¦": 29146, + "âĢ²": 17478, + "âĢ³": 12237, + "âĢĭ": 9525, + "âĢĭâĢĭ": 39009, + "âĢİ": 48261, + "âĢIJ": 9333, + "âĢij": 20977, + "âĢĵ": 1906, + "âĢĵâĢĵ": 25608, + "âĢĶ": 960, + "âĢĶ\"": 19056, + "âĢĶ-": 44839, + "âĢĶâĢĶ": 4500, + "âĢĶâĢĶâĢĶâĢĶ": 8184, + "âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ": 14950, + "âĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶâĢĶ": 30542, + "âĢķ": 31857, + "âĢł": 33912, + "âģ": 46256, + "âĤ¬": 26391, + "âĦ¢": 8151, + "âĦ¢:": 41333, + "âĨ": 29705, + "âĨij": 48541, + "âĨĴ": 39310, + "âĪ": 24861, + "âĪĴ": 14095, + "âī": 35705, + "âĵĺ": 45563, + "âĶ": 6552, + "âĶĢ": 7280, + "âĶĢâĶĢ": 8418, + "âĶĢâĶĢâĶĢâĶĢ": 16068, + "âĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢ": 28542, + "âĶģ": 47486, + "âķ": 22880, + "âķIJ": 28670, + "âķIJâķIJ": 31732, + "âĸ": 5008, + "âĸ¬": 47530, + "âĸ¬âĸ¬": 49843, + "âĸº": 45717, + "âĸĢ": 44033, + "âĸĦ": 45786, + "âĸĪ": 8115, + "âĸĪâĸĪ": 9968, + "âĸĪâĸĪâĸĪâĸĪ": 20503, + "âĸĪâĸĪâĸĪâĸĪâĸĪâĸĪâĸĪâĸĪ": 49527, + "âĸij": 22110, + "âĸijâĸij": 27534, + "âĸĴ": 40516, + "âĸĵ": 38626, + "âĸł": 29316, + "âĹ": 15926, + "âĹ¼": 48366, + "âĹı": 28133, + "âĺ": 24583, + "âĺħ": 15583, + "âĺħâĺħ": 28353, + "âĺĨ": 35283, + "âĻ": 17992, + "âĻ¥": 39908, + "âĻ¦": 41298, + "âľ": 26486, + "âĿ": 32391, + "ã": 159, + "ãĢ": 5099, + "ãĢģ": 23513, + "ãĢĤ": 16764, + "ãĢĮ": 13697, + "ãĢį": 13700, + "ãĢİ": 40493, + "ãĢı": 40549, + "ãĢIJ": 31854, + "ãĢij": 31817, + "ãģ": 2515, + "ãģ£": 33180, + "ãģ¦": 28134, + "ãģ§": 30640, + "ãģ¨": 30201, + "ãģª": 26945, + "ãģ«": 28618, + "ãģ®": 5641, + "ãģ®å": 15474, + "ãģ®å®": 49149, + "ãģ®æ": 27032, + "ãģ®ç": 17683, + "ãģ®é": 33426, + "ãģ®éŃĶ": 34633, + "ãģ¯": 31676, + "ãģ¾": 30159, + "ãģĤ": 40948, + "ãģĦ": 18566, + "ãģĨ": 29557, + "ãģĭ": 27370, + "ãģĮ": 35585, + "ãģį": 33778, + "ãģı": 31917, + "ãģĵ": 46036, + "ãģķ": 43357, + "ãģĹ": 22180, + "ãģĻ": 33623, + "ãģŁ": 25224, + "ãģł": 46777, + "ãĤ": 1792, + "ãĤ¡": 25362, + "ãĤ¢": 11839, + "ãĤ¢ãĥ«": 47794, + "ãĤ£": 16646, + "ãĤ¤": 11482, + "ãĤ¤ãĥĪ": 42396, + "ãĤ¦": 16165, + "ãĤ¦ãĤ¹": 34103, + "ãĤ§": 24806, + "ãĤ¨": 23544, + "ãĤ¨ãĥ«": 46948, + "ãĤ©": 37662, + "ãĤª": 20513, + "ãĤ«": 21763, + "ãĤ¬": 23728, + "ãĤ®": 43899, + "ãĤ¯": 14099, + "ãĤ°": 26095, + "ãĤ±": 41658, + "ãĤ³": 24679, + "ãĤ´": 17933, + "ãĤ´ãĥ³": 22997, + "ãĤµ": 26503, + "ãĤ¶": 48458, + "ãĤ·": 15661, + "ãĤ·ãĥ£": 39467, + "ãĤ¸": 21091, + "ãĤ¹": 8943, + "ãĤ¹ãĥĪ": 43302, + "ãĤº": 37426, + "ãĤ»": 47271, + "ãĤ¼": 30432, + "ãĤ¼ãĤ¦ãĤ¹": 43361, + "ãĤ½": 47559, + "ãĤ¿": 23376, + "ãĤĤ": 43266, + "ãĤī": 36853, + "ãĤĬ": 28255, + "ãĤĭ": 25748, + "ãĤĮ": 39258, + "ãĤĴ": 31758, + "ãĤĵ": 22174, + "ãĤŃ": 25084, + "ãĥ": 1209, + "ãĥ¡": 26998, + "ãĥ¢": 40361, + "ãĥ£": 23131, + "ãĥ¤": 37858, + "ãĥ¥": 24440, + "ãĥ©": 9263, + "ãĥ©ãĥ³": 48204, + "ãĥª": 12675, + "ãĥ«": 9202, + "ãĥ¬": 24186, + "ãĥ¯": 25589, + "ãĥ¯ãĥ³": 42983, + "ãĥ³": 6527, + "ãĥ³ãĤ¸": 45823, + "ãĥ´": 29752, + "ãĥ´ãĤ¡": 44444, + "ãĥ»": 4707, + "ãĥ¼": 6312, + "ãĥ¼ãĤ¯": 42869, + "ãĥ¼ãĥ": 12045, + "ãĥ¼ãĥ«": 43353, + "ãĥ¼ãĥ³": 31708, + "ãĥ¼ãĥĨ": 44326, + "ãĥ¼ãĥĨãĤ£": 44686, + "ãĥĢ": 27852, + "ãĥģ": 31090, + "ãĥĥ": 14777, + "ãĥĥãĤ¯": 35702, + "ãĥĥãĥĪ": 35799, + "ãĥĥãĥī": 45435, + "ãĥĦ": 41115, + "ãĥĨ": 24336, + "ãĥĨãĤ£": 44431, + "ãĥĩ": 21959, + "ãĥĩãĤ£": 40629, + "ãĥĪ": 13298, + "ãĥī": 13765, + "ãĥīãĥ©": 19073, + "ãĥīãĥ©ãĤ´ãĥ³": 24731, + "ãĥĬ": 26229, + "ãĥĭ": 30165, + "ãĥį": 44916, + "ãĥİ": 25053, + "ãĥı": 37412, + "ãĥIJ": 29659, + "ãĥij": 32546, + "ãĥĵ": 36922, + "ãĥķ": 17681, + "ãĥķãĤ¡": 41939, + "ãĥķãĤ©": 48457, + "ãĥĸ": 24001, + "ãĥĹ": 30965, + "ãĥĺ": 23363, + "ãĥĺãĥ©": 34473, + "ãĥĻ": 35604, + "ãĥŀ": 20115, + "ãĥŁ": 27542, + "ãĥł": 25795, + "ãĥŃ": 16253, + "ãħĭ": 35098, + "ãħĭãħĭ": 40345, + "ä": 160, + "ä¸": 10310, + "ä¸Ģ": 31660, + "ä¸ī": 49011, + "ä¸Ĭ": 41468, + "ä¸į": 38834, + "ä¸Ń": 40792, + "ä¹": 20046, + "ä¹ĭ": 45298, + "äº": 12859, + "人": 21689, + "äºĶ": 49390, + "ä»": 20015, + "代": 47987, + "ä¼": 27670, + "ä½": 19526, + "使": 45635, + "ä½ľ": 43291, + "ä¿": 46479, + "å": 161, + "å£": 18004, + "士": 18803, + "å¤": 13783, + "大": 32014, + "天": 25465, + "å¥": 25001, + "女": 42637, + "å¦": 36685, + "å§": 34650, + "姫": 40235, + "å®": 22522, + "å¯": 43380, + "å°": 22887, + "å°Ĩ": 49546, + "å·": 32432, + "å¸": 30585, + "å¹": 33176, + "åº": 41753, + "å¼": 28156, + "å½": 37605, + "å¾": 36181, + "å¿": 33232, + "åĤ": 43636, + "åħ": 17739, + "åħī": 46268, + "åĨ": 37863, + "åĩ": 49035, + "åĪ": 26344, + "åī": 30298, + "åĬ": 27950, + "åĭ": 47947, + "åĮ": 44293, + "åį": 39355, + "åİ": 43889, + "åı": 20998, + "åIJ": 28938, + "åij": 37772, + "åĽ": 32368, + "åľ": 28839, + "åŃ": 27764, + "åŃIJ": 36310, + "æ": 162, + "æ©": 43897, + "æ©Ł": 49960, + "æ°": 36365, + "æ³": 37345, + "æµ": 38184, + "æĢ": 45250, + "æĥ": 46349, + "æĦ": 35707, + "æĪ": 22755, + "æĪ¦": 36704, + "æī": 33699, + "æķ": 46763, + "æĸ": 23877, + "æĸ¹": 43095, + "æĹ": 33768, + "æĺ": 23626, + "æĺ¯": 42468, + "æľ": 17312, + "æĿ": 30266, + "æł": 43718, + "æŃ": 29826, + "æѦ": 49476, + "ç": 163, + "ç¥ŀ": 15351, + "ç«": 44165, + "ç·": 45784, + "çĦ": 47078, + "çī": 31965, + "çīĪ": 48304, + "çĭ": 45379, + "çİĭ": 25581, + "çIJ": 49426, + "çĶ": 18796, + "çĶ°": 35572, + "çĶŁ": 37955, + "çķ": 45911, + "çļ": 19021, + "çļĦ": 21410, + "çĽ": 33566, + "çľ": 40367, + "è": 164, + "è¡": 26193, + "è£": 32518, + "è£ħ": 35318, + "è¦": 17358, + "è¦ļéĨĴ": 23614, + "èª": 45739, + "è¯": 46237, + "è»": 43102, + "è¿": 32573, + "èĢ": 32003, + "èĢħ": 38519, + "èĥ": 47797, + "èĪ": 48958, + "é": 165, + "é£": 45617, + "é»Ĵ": 44112, + "é¾": 11737, + "é¾į": 11885, + "é¾įå": 19049, + "é¾įå¥": 39820, + "é¾įå¥ij士": 39821, + "é¾įåĸļ士": 33454, + "éĢ": 34460, + "éģ": 34402, + "éĥ": 32849, + "éĩ": 34932, + "éĸ": 38461, + "éĹ": 29785, + "éĹĺ": 42234, + "éļ": 49694, + "éĽ": 37239, + "éŃĶ": 20804, + "ê": 166, + "ë": 167, + "ëĭ": 46695, + "ì": 168, + "ìĿ": 35975, + "í": 169, + "íķ": 47991, + "î": 170, + "îĢ": 29773, + "ï": 171, + "ï¸": 35266, + "ï¸ı": 37929, + "�": 4210, + "��": 6353, + "���": 48585, + "����": 12100, + "ð": 172, + "ðĿ": 47728, + "ðŁ": 8582, + "ðŁij": 41840, + "ðŁĺ": 47249, + "ñ": 173, + "ò": 174, + "ó": 175, + "ô": 176, + "õ": 177, + "ö": 178, + "÷": 179, + "ø": 180, + "ù": 181, + "ú": 182, + "û": 183, + "ü": 184, + "ý": 185, + "þ": 186, + "ÿ": 187, + "Ā": 188, + "ā": 189, + "Ă": 190, + "ă": 191, + "Ą": 192, + "ą": 193, + "Ć": 194, + "ć": 195, + "Ĉ": 196, + "ĉ": 197, + "Ċ": 198, + "ĊÂł": 44320, + "ĊĊ": 628, + "ċ": 199, + "Č": 200, + "č": 201, + "Ď": 202, + "ď": 203, + "Đ": 204, + "đ": 205, + "Ē": 206, + "ē": 207, + "Ĕ": 208, + "ĕ": 209, + "Ė": 210, + "ė": 211, + "Ę": 212, + "ę": 213, + "Ě": 214, + "ě": 215, + "Ĝ": 216, + "ĝ": 217, + "Ğ": 218, + "ğ": 219, + "Ġ": 220, + "Ġ!": 5145, + "Ġ!!": 37867, + "Ġ!=": 14512, + "Ġ\"": 366, + "Ġ\"\"": 13538, + "Ġ\"\"\"": 37227, + "Ġ\"#": 25113, + "Ġ\"$": 17971, + "Ġ\"$:/": 32047, + "Ġ\"%": 36521, + "Ġ\"'": 24018, + "Ġ\"(": 30629, + "Ġ\"+": 43825, + "Ġ\",": 33172, + "Ġ\"-": 27444, + "Ġ\".": 27071, + "Ġ\"...": 27896, + "Ġ\"/": 12813, + "Ġ\"<": 33490, + "Ġ\"@": 44212, + "Ġ\"[": 12878, + "Ġ\"\\": 37082, + "Ġ\"_": 45434, + "Ġ\"{": 45144, + "Ġ\"âĢ¦": 29368, + "Ġ#": 1303, + "Ġ##": 22492, + "Ġ###": 44386, + "Ġ#####": 46424, + "Ġ$": 720, + "Ġ$$": 32382, + "Ġ$(": 29568, + "Ġ$\\": 39280, + "Ġ$_": 40111, + "Ġ${": 25597, + "Ġ%": 4064, + "Ġ%%": 43313, + "Ġ&": 1222, + "Ġ&&": 11405, + "Ġ'": 705, + "Ġ''": 10148, + "Ġ'(": 29513, + "Ġ',": 46083, + "Ġ'.": 45302, + "Ġ'/": 31051, + "Ġ'[": 44438, + "Ġ(": 357, + "Ġ(!": 22759, + "Ġ(\"": 5855, + "Ġ(#": 17426, + "Ġ($": 7198, + "Ġ($)": 45491, + "Ġ(%": 37633, + "Ġ(%)": 11509, + "Ġ(&": 35494, + "Ġ('": 19203, + "Ġ((": 14808, + "Ġ()": 7499, + "Ġ())": 32865, + "Ġ());": 38377, + "Ġ(),": 29994, + "Ġ().": 27972, + "Ġ();": 13979, + "Ġ(*": 20789, + "Ġ(+": 11502, + "Ġ(-": 13841, + "Ġ(.": 20262, + "Ġ(/": 50247, + "Ġ(<": 38155, + "Ġ(=": 46121, + "Ġ(>": 45160, + "Ġ(?,": 32843, + "Ġ(@": 4275, + "Ġ([": 29565, + "Ġ(_": 44104, + "Ġ({": 37913, + "Ġ(~": 31034, + "Ġ(£": 23068, + "Ġ(âĪĴ": 35508, + "Ġ)": 1267, + "Ġ))": 15306, + "Ġ)))": 47282, + "Ġ));": 29226, + "Ġ),": 10612, + "Ġ).": 6739, + "Ġ):": 15179, + "Ġ);": 5619, + "Ġ)]": 48600, + "Ġ*": 1635, + "Ġ*)": 31936, + "Ġ**": 12429, + "Ġ***": 17202, + "Ġ****": 25998, + "Ġ********************************": 41906, + "Ġ*.": 46866, + "Ġ*/": 9466, + "Ġ+": 1343, + "Ġ+#": 43053, + "Ġ++": 19969, + "Ġ+++": 49954, + "Ġ+---": 40703, + "Ġ+/-": 29694, + "Ġ+=": 15853, + "Ġ,": 837, + "Ġ,\"": 42911, + "Ġ-": 532, + "Ġ--": 1377, + "Ġ---": 11420, + "Ġ----": 13498, + "Ġ-----": 37404, + "Ġ------": 40103, + "Ġ-------": 35656, + "Ġ--------": 24200, + "Ġ---------": 45337, + "Ġ----------------": 34400, + "Ġ--------------------": 41436, + "Ġ--------------------------------": 20368, + "Ġ----------------------------------------------------------------": 16529, + "Ġ-->": 14610, + "Ġ-=": 48185, + "Ġ->": 4613, + "Ġ.": 764, + "Ġ.\"": 22135, + "Ġ.)": 46328, + "Ġ..": 11485, + "Ġ...": 2644, + "Ġ...\"": 35713, + "Ġ....": 19424, + "Ġ......": 47082, + "Ġ........": 20004, + "Ġ..........": 39864, + "Ġ..............": 44912, + "Ġ................": 44713, + "Ġ./": 24457, + "Ġ._": 47540, + "Ġ/": 1220, + "Ġ/*": 11900, + "Ġ/**": 42638, + "Ġ//": 3373, + "Ġ///": 34013, + "Ġ//[": 31161, + "Ġ/>": 11037, + "Ġ0": 657, + "Ġ00": 3571, + "Ġ000": 12877, + "Ġ0000": 17643, + "Ġ000000": 41853, + "Ġ00000000": 27551, + "Ġ0004": 38326, + "Ġ01": 5534, + "Ġ02": 7816, + "Ġ03": 7643, + "Ġ04": 8702, + "Ġ05": 8870, + "Ġ06": 9130, + "Ġ07": 8753, + "Ġ08": 8487, + "Ġ09": 7769, + "Ġ1": 352, + "Ġ10": 838, + "Ġ100": 1802, + "Ġ1000": 8576, + "Ġ10000": 33028, + "Ġ101": 8949, + "Ġ102": 15143, + "Ġ1024": 28119, + "Ġ103": 15349, + "Ġ104": 14436, + "Ġ105": 13343, + "Ġ1050": 47235, + "Ġ106": 15696, + "Ġ107": 16226, + "Ġ1070": 49616, + "Ġ108": 15495, + "Ġ1080": 17729, + "Ġ109": 16003, + "Ġ11": 1367, + "Ġ110": 9796, + "Ġ1100": 36566, + "Ġ111": 13374, + "Ġ112": 13539, + "Ġ113": 17318, + "Ġ114": 17342, + "Ġ115": 12279, + "Ġ116": 18693, + "Ġ117": 19048, + "Ġ118": 19035, + "Ġ119": 15136, + "Ġ12": 1105, + "Ġ120": 7982, + "Ġ1200": 24938, + "Ġ121": 20416, + "Ġ122": 19409, + "Ġ123": 17031, + "Ġ124": 19755, + "Ġ125": 13151, + "Ġ126": 19710, + "Ġ127": 18112, + "Ġ128": 13108, + "Ġ1280": 37674, + "Ġ129": 20248, + "Ġ13": 1511, + "Ġ130": 11323, + "Ġ1300": 36058, + "Ġ131": 23134, + "Ġ132": 21761, + "Ġ133": 22169, + "Ġ134": 22352, + "Ġ135": 17501, + "Ġ136": 21056, + "Ġ137": 21643, + "Ġ138": 21503, + "Ġ139": 23666, + "Ġ14": 1478, + "Ġ140": 12713, + "Ġ1400": 36641, + "Ġ141": 25500, + "Ġ142": 25181, + "Ġ143": 24356, + "Ġ144": 20224, + "Ġ1440": 49557, + "Ġ145": 20299, + "Ġ146": 22986, + "Ġ147": 22909, + "Ġ148": 22613, + "Ġ149": 24041, + "Ġ15": 1315, + "Ġ150": 6640, + "Ġ1500": 20007, + "Ġ151": 25326, + "Ġ152": 24848, + "Ġ153": 24652, + "Ġ154": 24235, + "Ġ155": 20708, + "Ġ156": 23871, + "Ġ157": 23313, + "Ġ158": 24063, + "Ġ159": 26422, + "Ġ16": 1467, + "Ġ160": 13454, + "Ġ1600": 26143, + "Ġ161": 27829, + "Ġ162": 25090, + "Ġ163": 26826, + "Ġ164": 25307, + "Ġ165": 21409, + "Ġ166": 26753, + "Ġ167": 26118, + "Ġ168": 23378, + "Ġ169": 27191, + "Ġ17": 1596, + "Ġ170": 16677, + "Ġ1700": 35665, + "Ġ171": 28369, + "Ġ172": 23120, + "Ġ173": 28174, + "Ġ174": 27621, + "Ġ175": 19038, + "Ġ176": 26937, + "Ġ177": 26607, + "Ġ178": 27368, + "Ġ179": 27228, + "Ġ18": 1248, + "Ġ180": 11546, + "Ġ1800": 21431, + "Ġ181": 30110, + "Ġ182": 28581, + "Ġ183": 28551, + "Ġ1830": 45440, + "Ġ184": 28598, + "Ġ1840": 47784, + "Ġ185": 22855, + "Ġ1850": 35745, + "Ġ186": 28481, + "Ġ1860": 37637, + "Ġ1861": 45278, + "Ġ1862": 49658, + "Ġ1863": 47072, + "Ġ1865": 47801, + "Ġ187": 27649, + "Ġ1870": 37667, + "Ġ188": 27778, + "Ġ1880": 34865, + "Ġ1886": 49539, + "Ġ1888": 49584, + "Ġ1889": 49545, + "Ġ189": 27230, + "Ġ1890": 31982, + "Ġ1893": 48889, + "Ġ1895": 46425, + "Ġ1896": 46723, + "Ġ1897": 49429, + "Ġ1898": 46244, + "Ġ1899": 47465, + "Ġ19": 678, + "Ġ190": 19884, + "Ġ1900": 21489, + "Ġ1901": 39923, + "Ġ1902": 45611, + "Ġ1903": 41625, + "Ġ1904": 43785, + "Ġ1905": 37166, + "Ġ1906": 40538, + "Ġ1907": 41435, + "Ġ1908": 40417, + "Ġ1909": 41507, + "Ġ191": 31009, + "Ġ1910": 31953, + "Ġ1911": 32216, + "Ġ1912": 34463, + "Ġ1913": 35145, + "Ġ1914": 26833, + "Ġ1915": 32062, + "Ġ1916": 32811, + "Ġ1917": 24168, + "Ġ1918": 25859, + "Ġ1919": 30992, + "Ġ192": 17817, + "Ġ1920": 14062, + "Ġ1921": 35369, + "Ġ1922": 36094, + "Ġ1923": 37272, + "Ġ1924": 37547, + "Ġ1925": 36864, + "Ġ1926": 38525, + "Ġ1927": 36565, + "Ġ1928": 35768, + "Ġ1929": 31883, + "Ġ193": 29691, + "Ġ1930": 15533, + "Ġ1931": 34625, + "Ġ1932": 32471, + "Ġ1933": 26539, + "Ġ1934": 29300, + "Ġ1935": 30704, + "Ġ1936": 27653, + "Ġ1937": 28684, + "Ġ1938": 28017, + "Ġ1939": 24414, + "Ġ194": 30483, + "Ġ1940": 16236, + "Ġ1941": 23234, + "Ġ1942": 22458, + "Ġ1943": 21577, + "Ġ1944": 16994, + "Ġ1945": 15761, + "Ġ1946": 22717, + "Ġ1947": 21709, + "Ġ1948": 21794, + "Ġ1949": 24977, + "Ġ195": 24793, + "Ġ1950": 11445, + "Ġ1951": 27937, + "Ġ1952": 26352, + "Ġ1953": 24217, + "Ġ1954": 24718, + "Ġ1955": 25325, + "Ġ1956": 25190, + "Ġ1957": 25177, + "Ġ1958": 24648, + "Ġ1959": 23859, + "Ġ196": 28817, + "Ġ1960": 9507, + "Ġ1961": 20510, + "Ġ1962": 20033, + "Ġ1963": 19342, + "Ġ1964": 17575, + "Ġ1965": 17672, + "Ġ1966": 19322, + "Ġ1967": 15904, + "Ġ1968": 15963, + "Ġ1969": 16450, + "Ġ197": 29903, + "Ġ1970": 8069, + "Ġ1971": 16382, + "Ġ1972": 16101, + "Ġ1973": 15674, + "Ġ1974": 16489, + "Ġ1975": 15231, + "Ġ1976": 15408, + "Ġ1977": 15589, + "Ġ1978": 15524, + "Ġ1979": 13521, + "Ġ198": 2757, + "Ġ1980": 7169, + "Ġ1981": 14745, + "Ġ1982": 14489, + "Ġ1983": 13540, + "Ġ1984": 12844, + "Ġ1985": 12863, + "Ġ1986": 12113, + "Ġ1987": 12923, + "Ġ1988": 12122, + "Ġ1989": 11104, + "Ġ199": 1594, + "Ġ1990": 6303, + "Ġ1991": 10249, + "Ġ1992": 9768, + "Ġ1993": 9656, + "Ġ1994": 9162, + "Ġ1995": 8735, + "Ġ1996": 8235, + "Ġ1997": 8309, + "Ġ1998": 7795, + "Ġ1999": 7358, + "Ġ2": 362, + "Ġ20": 1160, + "Ġ200": 939, + "Ġ2000": 4751, + "Ġ2001": 5878, + "Ġ2002": 6244, + "Ġ2003": 5816, + "Ġ2004": 5472, + "Ġ2005": 5075, + "Ġ2006": 4793, + "Ġ2007": 4343, + "Ġ2008": 3648, + "Ġ2009": 3717, + "Ġ201": 580, + "Ġ2010": 3050, + "Ġ2011": 2813, + "Ġ2012": 2321, + "Ġ2013": 2211, + "Ġ2014": 1946, + "Ġ2015": 1853, + "Ġ2016": 1584, + "Ġ2017": 2177, + "Ġ2018": 2864, + "Ġ2019": 13130, + "Ġ202": 22131, + "Ġ2020": 12131, + "Ġ2021": 33448, + "Ġ2022": 33160, + "Ġ2024": 48609, + "Ġ2025": 32190, + "Ġ203": 27408, + "Ġ2030": 25054, + "Ġ204": 26956, + "Ġ2048": 36117, + "Ġ205": 22538, + "Ġ2050": 32215, + "Ġ206": 27253, + "Ġ207": 27791, + "Ġ208": 27121, + "Ġ209": 28815, + "Ġ21": 2310, + "Ġ210": 20064, + "Ġ2100": 38123, + "Ġ211": 28714, + "Ġ212": 23679, + "Ġ213": 28658, + "Ġ214": 28277, + "Ġ215": 22951, + "Ġ216": 26881, + "Ġ217": 24894, + "Ġ218": 29217, + "Ġ219": 30453, + "Ġ22": 2534, + "Ġ220": 15629, + "Ġ221": 31566, + "Ġ222": 27795, + "Ġ223": 30299, + "Ġ224": 26063, + "Ġ225": 18500, + "Ġ226": 31510, + "Ġ227": 30989, + "Ġ228": 29041, + "Ġ229": 31064, + "Ġ23": 2242, + "Ġ230": 18395, + "Ġ231": 34598, + "Ġ232": 31773, + "Ġ233": 30435, + "Ġ234": 34323, + "Ġ235": 28878, + "Ġ236": 34044, + "Ġ237": 34385, + "Ġ238": 32544, + "Ġ239": 32817, + "Ġ24": 1987, + "Ġ240": 14956, + "Ġ2400": 48548, + "Ġ241": 35150, + "Ġ242": 34353, + "Ġ243": 35989, + "Ġ244": 35264, + "Ġ245": 29637, + "Ġ246": 34951, + "Ġ247": 30179, + "Ġ248": 32996, + "Ġ249": 34620, + "Ġ25": 1679, + "Ġ250": 8646, + "Ġ2500": 33507, + "Ġ251": 34489, + "Ġ252": 25264, + "Ġ253": 32056, + "Ġ254": 35360, + "Ġ255": 14280, + "Ġ256": 17759, + "Ġ257": 36100, + "Ġ258": 37528, + "Ġ259": 37831, + "Ġ26": 2608, + "Ġ260": 21148, + "Ġ2600": 47197, + "Ġ261": 39166, + "Ġ262": 35404, + "Ġ263": 39135, + "Ġ264": 32158, + "Ġ265": 32090, + "Ġ266": 37737, + "Ġ267": 37364, + "Ġ268": 36678, + "Ġ269": 38249, + "Ġ27": 2681, + "Ġ270": 20479, + "Ġ271": 33797, + "Ġ272": 38107, + "Ġ273": 38549, + "Ġ274": 39768, + "Ġ275": 25829, + "Ġ276": 38147, + "Ġ277": 38703, + "Ġ278": 39174, + "Ġ279": 39466, + "Ġ28": 2579, + "Ġ280": 21355, + "Ġ281": 39882, + "Ġ282": 41810, + "Ġ283": 42032, + "Ġ284": 40654, + "Ġ285": 33015, + "Ġ286": 39697, + "Ġ287": 38721, + "Ġ288": 35419, + "Ġ289": 38902, + "Ġ29": 2808, + "Ġ290": 26481, + "Ġ291": 43336, + "Ġ292": 41569, + "Ġ293": 37224, + "Ġ294": 41235, + "Ġ295": 34772, + "Ġ296": 41922, + "Ġ297": 41103, + "Ġ298": 37576, + "Ġ299": 31011, + "Ġ3": 513, + "Ġ30": 1542, + "Ġ300": 5867, + "Ġ3000": 20343, + "Ġ301": 25643, + "Ġ302": 32591, + "Ġ303": 30727, + "Ġ304": 31672, + "Ġ305": 32747, + "Ġ306": 37255, + "Ġ307": 38369, + "Ġ308": 35617, + "Ġ309": 40286, + "Ġ31": 3261, + "Ġ310": 28947, + "Ġ311": 35592, + "Ġ312": 34465, + "Ġ313": 35897, + "Ġ314": 34085, + "Ġ315": 32647, + "Ġ316": 34131, + "Ġ317": 37563, + "Ġ318": 39320, + "Ġ319": 40385, + "Ġ32": 3933, + "Ġ320": 20959, + "Ġ321": 39595, + "Ġ322": 38831, + "Ġ323": 38446, + "Ġ324": 38595, + "Ġ325": 29524, + "Ġ326": 40660, + "Ġ327": 36203, + "Ġ328": 39093, + "Ġ329": 42141, + "Ġ33": 4747, + "Ġ330": 25508, + "Ġ331": 43722, + "Ġ332": 41423, + "Ġ333": 23460, + "Ġ334": 42819, + "Ġ335": 37144, + "Ġ336": 38867, + "Ġ337": 42294, + "Ġ338": 40736, + "Ġ339": 42489, + "Ġ34": 4974, + "Ġ340": 28560, + "Ġ341": 43155, + "Ġ342": 44341, + "Ġ343": 37290, + "Ġ344": 43686, + "Ġ345": 39937, + "Ġ346": 44729, + "Ġ347": 43292, + "Ġ348": 44084, + "Ġ349": 44367, + "Ġ35": 3439, + "Ġ350": 13803, + "Ġ351": 44417, + "Ġ352": 44063, + "Ġ353": 47567, + "Ġ354": 46752, + "Ġ355": 36561, + "Ġ356": 44552, + "Ġ357": 45210, + "Ġ358": 41761, + "Ġ359": 41934, + "Ġ36": 4570, + "Ġ360": 11470, + "Ġ361": 47744, + "Ġ363": 49327, + "Ġ364": 44969, + "Ġ365": 21268, + "Ġ366": 44856, + "Ġ367": 40884, + "Ġ368": 43019, + "Ġ369": 45620, + "Ġ37": 5214, + "Ġ370": 28687, + "Ġ371": 47343, + "Ġ372": 46633, + "Ġ373": 47946, + "Ġ374": 49020, + "Ġ375": 29414, + "Ġ376": 44622, + "Ġ377": 42163, + "Ġ378": 45473, + "Ġ379": 45937, + "Ġ38": 4353, + "Ġ380": 29101, + "Ġ383": 49814, + "Ġ384": 40400, + "Ġ385": 44826, + "Ġ386": 48340, + "Ġ387": 49689, + "Ġ388": 43550, + "Ġ389": 49633, + "Ġ39": 5014, + "Ġ390": 33882, + "Ġ392": 48207, + "Ġ395": 42321, + "Ġ396": 48758, + "Ġ398": 39260, + "Ġ399": 43927, + "Ġ4": 604, + "Ġ40": 2319, + "Ġ400": 7337, + "Ġ4000": 30123, + "Ġ401": 22219, + "Ġ402": 42622, + "Ġ403": 38210, + "Ġ404": 32320, + "Ġ405": 36966, + "Ġ406": 45439, + "Ġ407": 41879, + "Ġ408": 41247, + "Ġ409": 48132, + "Ġ4090": 48908, + "Ġ4096": 42479, + "Ġ41": 6073, + "Ġ410": 32921, + "Ġ411": 43184, + "Ġ412": 42215, + "Ġ413": 46618, + "Ġ414": 45900, + "Ġ415": 40643, + "Ġ416": 38158, + "Ġ417": 47580, + "Ġ418": 45959, + "Ġ419": 48475, + "Ġ42": 5433, + "Ġ420": 28262, + "Ġ421": 49294, + "Ġ422": 46588, + "Ġ423": 49125, + "Ġ424": 48252, + "Ġ425": 36959, + "Ġ426": 48065, + "Ġ427": 45345, + "Ġ428": 45063, + "Ġ429": 42313, + "Ġ43": 5946, + "Ġ430": 35090, + "Ġ432": 46393, + "Ġ433": 47407, + "Ġ435": 42671, + "Ġ436": 50038, + "Ġ44": 5846, + "Ġ440": 33879, + "Ġ443": 40384, + "Ġ444": 45095, + "Ġ445": 48655, + "Ġ448": 49989, + "Ġ45": 4153, + "Ġ450": 18523, + "Ġ451": 49356, + "Ġ455": 46839, + "Ġ457": 47996, + "Ġ458": 50154, + "Ġ46": 6337, + "Ġ460": 34091, + "Ġ465": 49669, + "Ġ47": 6298, + "Ġ470": 38634, + "Ġ475": 45881, + "Ġ48": 4764, + "Ġ480": 23487, + "Ġ49": 5125, + "Ġ490": 45601, + "Ġ499": 48391, + "Ġ5": 642, + "Ġ50": 2026, + "Ġ500": 5323, + "Ġ5000": 23336, + "Ġ501": 24555, + "Ġ502": 47233, + "Ġ503": 44541, + "Ġ504": 41612, + "Ġ505": 43367, + "Ġ51": 6885, + "Ġ510": 35148, + "Ġ512": 22243, + "Ġ52": 6740, + "Ġ520": 36141, + "Ġ525": 45719, + "Ġ529": 49888, + "Ġ53": 7192, + "Ġ530": 40585, + "Ġ54": 7175, + "Ġ540": 38190, + "Ġ55": 5996, + "Ġ550": 25240, + "Ġ555": 44717, + "Ġ56": 7265, + "Ġ560": 38089, + "Ġ57": 7632, + "Ġ570": 44626, + "Ġ58": 7618, + "Ġ580": 41234, + "Ġ59": 7863, + "Ġ6": 718, + "Ġ60": 3126, + "Ġ600": 10053, + "Ġ6000": 39064, + "Ġ601": 49231, + "Ġ608": 39084, + "Ġ61": 8454, + "Ġ610": 44300, + "Ġ62": 8190, + "Ġ620": 45469, + "Ġ625": 48868, + "Ġ63": 8093, + "Ġ630": 44505, + "Ġ64": 5598, + "Ġ640": 33759, + "Ġ65": 6135, + "Ġ650": 22626, + "Ġ655": 45021, + "Ġ66": 7930, + "Ġ660": 41717, + "Ġ666": 43364, + "Ġ67": 8275, + "Ġ670": 48136, + "Ġ68": 8257, + "Ġ680": 40554, + "Ġ69": 8644, + "Ġ698": 39861, + "Ġ7": 767, + "Ġ70": 4317, + "Ġ700": 13037, + "Ġ7000": 50205, + "Ġ701": 48173, + "Ġ702": 43379, + "Ġ71": 9166, + "Ġ72": 7724, + "Ġ720": 26250, + "Ġ73": 8854, + "Ġ737": 37517, + "Ġ74": 8915, + "Ġ747": 45600, + "Ġ75": 5441, + "Ġ750": 19683, + "Ġ76": 8684, + "Ġ760": 48284, + "Ġ768": 46720, + "Ġ77": 8541, + "Ġ770": 44586, + "Ġ777": 35534, + "Ġ78": 8699, + "Ġ780": 41287, + "Ġ79": 9225, + "Ġ8": 807, + "Ġ80": 4019, + "Ġ800": 10460, + "Ġ8000": 38055, + "Ġ802": 33121, + "Ġ808": 41241, + "Ġ81": 9773, + "Ġ82": 9415, + "Ġ820": 48964, + "Ġ83": 9698, + "Ġ84": 9508, + "Ġ840": 48777, + "Ġ85": 7600, + "Ġ850": 30607, + "Ġ86": 9849, + "Ġ87": 10083, + "Ġ88": 9193, + "Ġ89": 9919, + "Ġ9": 860, + "Ġ90": 4101, + "Ġ900": 15897, + "Ġ9000": 50138, + "Ġ91": 10495, + "Ġ911": 16679, + "Ġ92": 10190, + "Ġ920": 47679, + "Ġ93": 10261, + "Ġ94": 10048, + "Ġ95": 6957, + "Ġ950": 38384, + "Ġ96": 9907, + "Ġ960": 41263, + "Ġ97": 10111, + "Ġ970": 40463, + "Ġ978": 41417, + "Ġ98": 9661, + "Ġ980": 32614, + "Ġ99": 7388, + "Ġ999": 36006, + "Ġ:": 1058, + "Ġ:(": 36147, + "Ġ:)": 14373, + "Ġ:-)": 47226, + "Ġ::": 7904, + "Ġ:=": 19039, + "Ġ;": 2162, + "Ġ;)": 35540, + "Ġ;;": 36792, + "Ġ<": 1279, + "Ġ