这是indexloc提供的服务,不要输入任何密码
Skip to content

feat: Talker Chopper logger #355

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 87 commits into from
Jul 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
af28509
:tada: initial commit
techouse Apr 17, 2025
b1f6aa9
:white_check_mark: add tests
techouse Apr 17, 2025
52a757f
:page_facing_up: add license
techouse Apr 17, 2025
ef0b8da
:construction_worker: add GitHub Actions workflow for talker_chopper_…
techouse Apr 17, 2025
b965475
:white_check_mark: replace string HTTP methods with HttpMethod enum i…
techouse Apr 18, 2025
ee2193f
:technologist: add example web app
techouse Apr 18, 2025
5be0de6
:technologist: update example
techouse Apr 18, 2025
39f1898
:hammer: update example analysis options
techouse Apr 18, 2025
8eacd18
:technologist: add android and ios example
techouse Apr 18, 2025
f3e6339
:see_no_evil: ignore Podfile.lock in ios example
techouse Apr 18, 2025
607a46c
:technologist: add Makefile
techouse Apr 18, 2025
7d41851
:memo: update README with project details and usage instructions
techouse Apr 18, 2025
7ec5170
:memo: update README description
techouse Apr 18, 2025
ae24731
:bug: make sure to always stop stopwatch
techouse Apr 18, 2025
dd3cbda
:memo: update main README
techouse Apr 18, 2025
9bea09f
:memo: fix links in main README
techouse Apr 18, 2025
3c46a17
:zap: increase test coverage
techouse Apr 18, 2025
2528d62
:bug: fix typo in JSON content type interceptor filename
techouse Apr 18, 2025
0339f7e
:art: implement EquatableMixin for TalkerChopperLoggerSettings class
techouse Apr 18, 2025
76fab62
:white_check_mark: increase coverage
techouse Apr 18, 2025
a784b6f
:white_check_mark: increase coverage
techouse Apr 18, 2025
29a7d83
:fire: remove unused constant for Chopper logger timestamp
techouse Apr 18, 2025
fdc5fd0
:white_check_mark: update tests
techouse Apr 18, 2025
347ca04
:recycle: replace function type definitions with typedefs for request…
techouse Apr 18, 2025
0686a61
:art: simplify header replacement logic in _replaceHiddenHeaders method
techouse Apr 18, 2025
c1b087d
:sparkles: add logLevel property to TalkerChopperLogger and settings …
techouse Apr 18, 2025
7ae739c
:white_check_mark: add tests for logLevel in Chopper log classes and …
techouse Apr 18, 2025
54235db
:memo: update README to include Talker Chopper Logger customization o…
techouse Apr 18, 2025
4f1e077
:book: update README to enhance customization options for TalkerDioLo…
techouse Apr 18, 2025
b7b34b1
:sparkles: add support for talker_chopper_logger in pub get, publish,…
techouse Apr 18, 2025
325c88b
:bookmark: update pubspec.yaml to enhance package description and add…
techouse Apr 18, 2025
7bd8ff9
:memo: update README to correct image path for Chopper Logger preview
techouse Apr 18, 2025
0c53003
:white_check_mark: fix test
techouse Apr 19, 2025
a0685fd
:white_check_mark: remove print in test
techouse Apr 19, 2025
2d22d38
:sparkles: add cURL request logging support and enhance request data …
techouse Apr 19, 2025
4e4d8f1
:white_check_mark: enhance ChopperRequestLog tests to include detaile…
techouse Apr 19, 2025
9a68007
:art: refactor logging message generation to improve readability and …
techouse Apr 19, 2025
c99a4bd
:white_check_mark: add tests for logging HTTP responses and errors wi…
techouse Apr 19, 2025
59f1699
:bug: fix ChopperErrorLog to correctly log request URLs from exceptions
techouse Apr 19, 2025
13821de
:bug: fix error logging to include HTTP status code and message for b…
techouse Apr 19, 2025
c90540c
:white_check_mark: fix tests
techouse Apr 19, 2025
97ea2d8
:rotating_light: fix linter warning
techouse Apr 19, 2025
ce7c2f4
:construction_worker: update CI workflow to use Dart SDK and improve …
techouse Apr 19, 2025
027d5f1
:green_heart: fix CI
techouse Apr 19, 2025
4f14f51
:construction_worker: update CI workflow to run tests on multiple pla…
techouse Apr 19, 2025
600f924
:bug: remove duplicate _replaceHiddenHeaders call
techouse Apr 20, 2025
932426d
:zap: fix constructor call and improve log message formatting
techouse Apr 20, 2025
4e78577
:white_check_mark: simplify error log messages by removing redundant …
techouse Apr 20, 2025
da14174
:loud_sound: add stack trace to ChopperException handling for improve…
techouse Apr 20, 2025
c452af3
:safety_vest: enhance error handling in request/response logging for …
techouse Apr 20, 2025
a190665
:zap: streamline logging by removing redundant try-catch blocks
techouse Apr 20, 2025
59bee0c
:bug: fix regex pattern in error log message for accurate matching
techouse Apr 20, 2025
61580b1
:art: fix error variable naming in logging for consistency
techouse Apr 20, 2025
8d5a135
:art: enhance logging in tests to include stack traces for better err…
techouse Apr 20, 2025
a005e3a
:white_check_mark: fix tests
techouse Apr 20, 2025
6b3e04a
:white_check_mark: fix tests
techouse Apr 20, 2025
01e5677
:white_check_mark: fix tests
techouse Apr 20, 2025
e753320
:white_check_mark: add test for logging http 5xx response errors in l…
techouse Apr 20, 2025
9de2786
:recycle: refactor logging to improve error handling and data output …
techouse Apr 20, 2025
35ac5f2
:white_check_mark: add tests for logging various HTTP request methods…
techouse Apr 20, 2025
d493789
:memo: update example readme
techouse Apr 20, 2025
4c52fc8
:memo: update readme
techouse Apr 20, 2025
d5e8043
:memo: update main readme
techouse Apr 20, 2025
a0c9f2a
:memo: update main readme links
techouse Apr 20, 2025
f7710e5
:safety_vest: refactor error logging to handle ChopperHttpException a…
techouse Apr 24, 2025
657703f
:white_check_mark: update logger tests to include headers in error lo…
techouse Apr 24, 2025
48648d9
:art: refactor error handling in Chopper logger interceptor to use pa…
techouse Apr 24, 2025
70b3b55
:art: refactor response logging to use switch-case for status code ha…
techouse Apr 24, 2025
947b28b
:safety_vest: add 'avoid_print' rule to analysis options for improved…
techouse Apr 24, 2025
6a616bf
:goal_net: refactor logging to use a dedicated convert method for imp…
techouse Apr 24, 2025
5235203
:white_check_mark: add tests to handle forced exceptions in ChopperRe…
techouse Apr 24, 2025
76a68b6
:recycle: split chopper_logs into ChopperErrorLog, ChopperRequestLog,…
techouse Apr 24, 2025
125be16
:recycle: update imports to use ChopperErrorLog, ChopperRequestLog, a…
techouse Apr 24, 2025
53546b5
:white_check_mark: update imports in logger_test.dart and logs_test.d…
techouse Apr 24, 2025
3ce1513
:bento: update example preview
techouse Apr 24, 2025
cf9104b
:art: change _talker to be a late final variable for improved immutab…
techouse May 3, 2025
d8a8341
:memo: refine documentation for Talker addon functionality in talker_…
techouse May 3, 2025
4fe7cf4
Merge branch 'master' into feat/talker-chopper-logger
techouse May 3, 2025
9152909
:construction_worker: refactor GitHub Actions workflow for talker_cho…
techouse May 3, 2025
d649956
Merge branch 'master' into feat/talker-chopper-logger
techouse May 21, 2025
92a3eb8
Merge branch 'master' into feat/talker-chopper-logger
techouse May 25, 2025
7d5f3fd
Merge branch 'master' into feat/talker-chopper-logger
techouse Jun 5, 2025
59481d3
Merge branch 'master' into feat/talker-chopper-logger
techouse Jun 10, 2025
2ed2799
Merge branch 'master' into feat/talker-chopper-logger
techouse Jun 13, 2025
b8ba403
Merge branch 'master' into pr/355
Frezyx Jul 27, 2025
2e7379f
Update Readme.md
Frezyx Jul 27, 2025
651757a
Replace TalkerLogType with TalkerKey
Frezyx Jul 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .github/workflows/talker_chopper_logger.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: talker_chopper_logger

on:
push:
paths:
- "packages/talker_chopper_logger/**"
- ".github/workflows/talker_chopper_logger.yaml"
pull_request:
paths:
- "packages/talker_chopper_logger/**"
- ".github/workflows/talker_chopper_logger.yaml"
permissions:
contents: read

jobs:
test:
uses: ./.github/workflows/test.yaml
with:
package: talker_chopper_logger
sdk: dart
208 changes: 194 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,25 @@ Web Demo</a> page</p>
✅ &nbsp;Allows sharing and saving logs history and error crash reports <br>
✅ &nbsp;Displays alerts for UI exceptions. <br>
✅ &nbsp;Built-in support for dio [HTTP logs](#talker-dio-logger) <br>
✅ &nbsp;Built-in support for [http logs](#talker-http-logger) <br>
✅ &nbsp;Built-in support for [BLoC logs](#talker-bloc-logger) <br>
✅ &nbsp;Built-in support for [Riverpod logs](#talker-riverpod-logger) <br>
✅ &nbsp;Built-in support for Chopper [HTTP logs](#talker-chopper-logger) <br>
✅ &nbsp;[Check all features](#features-list)

## Packages
Talker is designed for any level of customization. <br>

| Package | Version | Description |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| [talker](https://github.com/Frezyx/talker/tree/master/packages/talker) | [![Pub](https://img.shields.io/pub/v/talker.svg?style=flat-square)](https://pub.dev/packages/talker) | Main dart package for logging and error handling |
| [talker_flutter](https://github.com/Frezyx/talker/tree/master/packages/talker_flutter) | [![Pub](https://img.shields.io/pub/v/talker_flutter.svg?style=flat-square)](https://pub.dev/packages/talker_flutter) | Flutter extensions for talker <br>Colored Flutter app logs (iOS and Android), logs list screen, showing error messages at UI out of the box, route observer, etc |
| [talker_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_logger) | [![Pub](https://img.shields.io/pub/v/talker_logger.svg?style=flat-square)](https://pub.dev/packages/talker_logger) | Customizable pretty logger for dart/flutter apps |
| [talker_dio_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_dio_logger) | [![Pub](https://img.shields.io/pub/v/talker_dio_logger.svg?style=flat-square)](https://pub.dev/packages/talker_dio_logger) | Best logger for [dio](https://pub.dev/packages/dio) http calls |
| [talker_bloc_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_bloc_logger) | [![Pub](https://img.shields.io/pub/v/talker_bloc_logger.svg?style=flat-square)](https://pub.dev/packages/talker_bloc_logger) | Best logger for [BLoC](https://pub.dev/packages/bloc) state management library |
| [talker_riverpod_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_riverpod_logger) | [![Pub](https://img.shields.io/pub/v/talker_riverpod_logger.svg?style=flat-square)](https://pub.dev/packages/talker_riverpod_logger) | Best logger for [Riverpod](https://pub.dev/packages/riverpod) state management library |
| [talker_http_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_http_logger) | [![Pub](https://img.shields.io/pub/v/talker_http_logger.svg?style=flat-square)](https://pub.dev/packages/talker_http_logger) | Best logger for [http](https://pub.dev/packages/http) package |
| Package | Version | Description |
|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [talker](https://github.com/Frezyx/talker/tree/master/packages/talker) | [![Pub](https://img.shields.io/pub/v/talker.svg?style=flat-square)](https://pub.dev/packages/talker) | Main dart package for logging and error handling |
| [talker_flutter](https://github.com/Frezyx/talker/tree/master/packages/talker_flutter) | [![Pub](https://img.shields.io/pub/v/talker_flutter.svg?style=flat-square)](https://pub.dev/packages/talker_flutter) | Flutter extensions for talker <br>Colored Flutter app logs (iOS and Android), logs list screen, showing error messages at UI out of the box, route observer, etc |
| [talker_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_logger) | [![Pub](https://img.shields.io/pub/v/talker_logger.svg?style=flat-square)](https://pub.dev/packages/talker_logger) | Customizable pretty logger for dart/flutter apps |
| [talker_dio_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_dio_logger) | [![Pub](https://img.shields.io/pub/v/talker_dio_logger.svg?style=flat-square)](https://pub.dev/packages/talker_dio_logger) | Best logger for [dio](https://pub.dev/packages/dio) http calls | |
| [talker_bloc_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_bloc_logger) | [![Pub](https://img.shields.io/pub/v/talker_bloc_logger.svg?style=flat-square)](https://pub.dev/packages/talker_bloc_logger) | Best logger for [BLoC](https://pub.dev/packages/bloc) state management library |
| [talker_riverpod_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_riverpod_logger) | [![Pub](https://img.shields.io/pub/v/talker_riverpod_logger.svg?style=flat-square)](https://pub.dev/packages/talker_riverpod_logger) | Best logger for [Riverpod](https://pub.dev/packages/riverpod) state management library
| [talker_chopper_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_chopper_logger) | [![Pub](https://img.shields.io/pub/v/talker_chopper_logger.svg?style=flat-square)](https://pub.dev/packages/talker_chopper_logger) | Best logger for [Chopper](https://pub.dev/packages/chopper) http calls |
| [talker_http_logger](https://github.com/Frezyx/talker/tree/master/packages/talker_http_logger) | [![Pub](https://img.shields.io/pub/v/talker_http_logger.svg?style=flat-square)](https://pub.dev/packages/talker_http_logger) | Best logger for [http](https://pub.dev/packages/http) package |

## Table of contents

Expand Down Expand Up @@ -90,11 +93,11 @@ Talker is designed for any level of customization. <br>
- [More Features And Examples](#more-features-and-examples)
- [Integrations](#integrations)
- [Talker Dio Logger](#talker-dio-logger)
- [Customization](#customization-1)
- [Off/On http request or reposnse logs](#offon-http-request-or-reposnse-logs)
- [Change http logs colors](#change-http-logs-colors)
- [Filter http logs](#filter-http-logs)
- [Using with Talker](#using-with-talker)
- [Customization](#customization-dio)
- [Off/On http request or reposnse logs](#offon-http-request-or-reposnse-logs-dio)
- [Change http logs colors](#change-http-log-colors-dio)
- [Filter http logs](#filter-http-logs-dio)
- [Using with Talker](#using-with-talker-dio)
- [Talker BLoC Logger](#talker-bloc-logger)
- [Customization](#customization-2)
- [Off/on events, transitions, changes, creation, close](#offon-events-transitions-changes-creation-close)
Expand All @@ -107,6 +110,14 @@ Talker is designed for any level of customization. <br>
- [Full/truncated state data](#fulltruncated-state-data)
- [Filter riverpod logs](#filter-riverpod-logs)
- [Using with Talker](#using-with-talker-2)
- [Talker Chopper Logger](#talker-chopper-logger)
- [Customization](#customization-chopper)
- [Enable or disable HTTP request or response logs](#change-http-log-colors-chopper)
- [Print HTTP request curl command](#print-http-request-curl-command-chopper)
- [Hide sensitive HTTP request headers](#hide-sensitive-http-request-headers-chopper)
- [Change HTTP logs colors](#change-http-log-colors-chopper)
- [Filter HTTP logs](#filter-http-logs-chopper)
- [Using with existing Talker instance](#using-with-existing-talker-instance-chopper)
- [Crashlytics integration](#crashlytics-integration)
- [Features list](#features-list)
- [Coverage](#coverage)
Expand Down Expand Up @@ -599,10 +610,12 @@ dio.interceptors.add(
);
```

<a id="customization-dio"></a>
## Customization

To provide hight usage exp here are a lot of settings and customization fields in TalkerDioLoggerSettings. You can setup all wat you want. For example:

<a id="offon-http-request-or-reposnse-logs-dio"></a>
### Off/on http request or reposnse logs

You can toggle reponse / request printing and headers including
Expand All @@ -625,6 +638,7 @@ dio.interceptors.add(
);
```

<a id="change-http-log-colors-dio"></a>
### Change http logs colors

Setup your custom http-log colors. You can set color for requests, responses and errors in TalkerDioLoggerSettings
Expand All @@ -640,6 +654,7 @@ TalkerDioLoggerSettings(
);
```

<a id="filter-http-logs-dio"></a>
### Filter http logs

For example if your app has a private functionality and you don't need to store this functionality logs in talker - you can use filters
Expand All @@ -653,6 +668,7 @@ TalkerDioLoggerSettings(
)
```

<a id="using-with-talker-dio"></a>
## Using with Talker
You can add your talker instance for TalkerDioLogger if your app already uses Talker.
In this case, all logs and errors will fall into your unified tracking system
Expand Down Expand Up @@ -880,6 +896,170 @@ final container = ProviderContainer(
);
```

# Talker Chopper Logger

A lightweight, straightforward, and visually appealing logging solution for apps that use
[Chopper](https://pub.dev/packages/chopper) as an HTTP client.

This is how the logs of your http requests will look in the console
![](docs/assets/talker_chopper_logger/preview.png?raw=true)

### Add dependency
```yaml
dependencies:
talker_chopper_logger: ^1.0.0
```

### Usage
Simply include the **TalkerChopperLogger** in your Chopper client’s interceptors list to enable it.

```dart
final client = ChopperClient(
/// ... other chopper settings
interceptors: [
TalkerChopperLogger(
settings: const TalkerChopperLoggerSettings(
printRequestHeaders: true,
printResponseHeaders: true,
printResponseMessage: true,
),
),
],
);
```

<a id="customization-chopper"></a>
## Customization

To offer extensive functionality, [TalkerChopperLoggerSettings](packages/talker_chopper_logger/lib/talker_chopper_logger_settings.dart) provides
numerous configuration settings and customization options. You can adjust everything to suit your needs. For example:

### Enable or disable HTTP request or response logs

You can toggle response / request printing and headers including

```dart
final client = ChopperClient(
/// ... other chopper settings
interceptors: [
TalkerChopperLogger(
talker: _talker,
settings: const TalkerChopperLoggerSettings(
// All HTTP responses enabled for console logging
printResponseData: true,
// All HTTP requests disabled for console logging
printRequestData: false,
// Response logs including HTTP - headers
printResponseHeaders: true,
// Request logs without HTTP - headers
printRequestHeaders: false,
),
),
],
);
```

<a id="print-http-request-curl-command-chopper"></a>
### Print HTTP request curl command

You can print the curl command for the HTTP request in the console.
This is useful for debugging and testing purposes.

```dart
final client = ChopperClient(
/// ... other chopper settings
interceptors: [
TalkerChopperLogger(
talker: _talker,
settings: const TalkerChopperLoggerSettings(
// Print curl command for HTTP request
printRequestCurl: true,
),
),
],
);
```

<a id="hide-sensitive-http-request-headers-chopper"></a>
### Hiding sensitive HTTP request headers

You can hide sensitive HTTP request headers such as `Authorization` or `Cookie` in the console logs.
This is useful for security purposes.

```dart
final client = ChopperClient(
/// ... other chopper settings
interceptors: [
TalkerChopperLogger(
talker: _talker,
settings: const TalkerChopperLoggerSettings(
printRequestHeaders: true,
printResponseHeaders: true,
// Hide sensitive HTTP request headers
hiddenHeaders: {
'authorization',
'cookie',
},
),
),
],
);
```

<a id="change-http-log-colors-chopper"></a>
### Change HTTP logs colors

Customize your HTTP log colors by defining specific colors for requests, responses, and errors in
[TalkerChopperLoggerSettings](packages/talker_chopper_logger/lib/talker_chopper_logger_settings.dart)

```dart
TalkerChopperLoggerSettings(
// Blue HTTP requests logs in console
requestPen: AnsiPen()..blue(),
// Green HTTP responses logs in console
responsePen: AnsiPen()..green(),
// Error HTTP logs in console
errorPen: AnsiPen()..red(),
);
```

<a id="filter-http-logs-chopper"></a>
### Filter HTTP logs

For instance, if your app includes private functionality that you prefer not to log with talker, you can apply filters.

```dart
TalkerChopperLoggerSettings(
// All http request without "/secure" in path will be printed in console
requestFilter: (Request request) => !request.url.path.contains('/secure'),
// All http responses with status codes different than 301 will be printed in console
responseFilter: (Response response) => response.statusCode != 301,
)
```

<a id="using-with-existing-talker-instance-chopper"></a>
## Using with existing Talker instance

If your application already uses Talker, simply inject your Talker instance into TalkerChopperLogger so that all logs
and errors integrate into your centralized tracking system.

```dart
final talker = Talker();
final client = ChopperClient(
/// ... other chopper settings
interceptors: [
TalkerChopperLogger(
talker: talker,
settings: const TalkerChopperLoggerSettings(
printRequestHeaders: true,
printResponseHeaders: true,
printResponseMessage: true,
),
),
],
);
```

## Crashlytics integration

If you add CrashlyticsTalkerObserver to your application, you will receive notifications about all application errors in the Crashlytics dashboard. <br>
Expand Down
Binary file added docs/assets/talker_chopper_logger/preview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 31 additions & 0 deletions packages/talker_chopper_logger/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
/pubspec.lock
**/doc/api/
.dart_tool/
.packages
build/
.flutter-plugins
.flutter-plugins-dependencies
3 changes: 3 additions & 0 deletions packages/talker_chopper_logger/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## 1.0.0

- Initial version.
21 changes: 21 additions & 0 deletions packages/talker_chopper_logger/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2025 Klemen Tusar

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading