From bc0772989083811a18c8a876f3ebcf5053ef19c1 Mon Sep 17 00:00:00 2001 From: haraldh Date: Tue, 3 Mar 2020 14:08:09 +0000 Subject: [PATCH] deploy: 903f245278258f95bf1aeba5914ee6ab7682bc63 --- ayu-highlight.css | 8 + clipboard.min.js | 6 +- css/chrome.css | 108 +- css/general.css | 35 +- css/variables.css | 43 + end.html | 38 +- highlight.css | 10 + highlight.js | 4 +- index.html | 50 +- print.html | 11600 ++----------------------------------------- searchindex.js | 2 +- searchindex.json | 2 +- tomorrow-night.css | 8 + tutorial1.html | 49 +- tutorial10.html | 975 +--- tutorial11.html | 971 +--- tutorial12.html | 971 +--- tutorial13.html | 987 +--- tutorial14.html | 440 ++ tutorial2.html | 979 +--- tutorial3.html | 973 +--- tutorial4.html | 973 +--- tutorial5.html | 975 +--- tutorial6.html | 977 +--- tutorial7.html | 975 +--- tutorial8.html | 973 +--- tutorial9.html | 975 +--- 27 files changed, 1540 insertions(+), 22567 deletions(-) create mode 100644 tutorial14.html diff --git a/ayu-highlight.css b/ayu-highlight.css index 786063f..128e016 100644 --- a/ayu-highlight.css +++ b/ayu-highlight.css @@ -69,3 +69,11 @@ Original by Dempfi (https://github.com/dempfi/ayu) .hljs-strong { font-weight: bold; } + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/clipboard.min.js b/clipboard.min.js index 1993676..02c549e 100644 --- a/clipboard.min.js +++ b/clipboard.min.js @@ -1,7 +1,7 @@ /*! - * clipboard.js v1.6.1 + * clipboard.js v2.0.4 * https://zenorocha.github.io/clipboard.js - * + * * Licensed MIT © Zeno Rocha */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Clipboard=e()}}(function(){var e,t,n;return function e(t,n,o){function i(a,c){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!c&&l)return l(a,!0);if(r)return r(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var s=n[a]={exports:{}};t[a][0].call(s.exports,function(e){var n=t[a][1][e];return i(n?n:e)},s,s.exports,e,t,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function e(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function e(){var t=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=document.body.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=o+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function e(){this.fakeHandler&&(document.body.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function e(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function e(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function e(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function e(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function e(){this.removeFake()}},{key:"action",set:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function e(){return this._action}},{key:"target",set:function e(t){if(void 0!==t){if(!t||"object"!==("undefined"==typeof t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function e(){return this._target}}]),e}();e.exports=c})},{select:5}],8:[function(t,n,o){!function(i,r){if("function"==typeof e&&e.amd)e(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if("undefined"!=typeof o)r(n,t("./clipboard-action"),t("tiny-emitter"),t("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(e,t,n,o){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(e,t){var n="data-clipboard-"+e;if(t.hasAttribute(n))return t.getAttribute(n)}var u=i(t),s=i(n),f=i(o),d=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText}},{key:"listenClick",value:function e(t){var n=this;this.listener=(0,f.default)(t,"click",function(e){return n.onClick(e)})}},{key:"onClick",value:function e(t){var n=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new u.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})}},{key:"defaultAction",value:function e(t){return l("action",t)}},{key:"defaultTarget",value:function e(t){var n=l("target",t);if(n)return document.querySelector(n)}},{key:"defaultText",value:function e(t){return l("text",t)}},{key:"destroy",value:function e(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],n="string"==typeof t?[t]:t,o=!!document.queryCommandSupported;return n.forEach(function(e){o=o&&!!document.queryCommandSupported(e)}),o}}]),t}(s.default);e.exports=h})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)}); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n .hljs { position: relative; padding: 0 8px; z-index: 10; - line-height: 50px; + line-height: var(--menu-bar-height); cursor: pointer; transition: color 0.5s; } @@ -71,22 +73,22 @@ a > .hljs { } html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-container { - transform: translateY(-60px); + transform: translateY(calc(-10px - var(--menu-bar-height))); } .left-buttons { display: flex; margin: 0 5px; } -.no-js .left-buttons { +.no-js .left-buttons { display: none; } .menu-title { display: inline-block; font-weight: 200; - font-size: 20px; - line-height: 50px; + font-size: 2rem; + line-height: var(--menu-bar-height); text-align: center; margin: 0; flex: 1; @@ -124,7 +126,7 @@ html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-conta text-decoration: none; position: fixed; - top: 50px; /* Height of menu-bar */ + top: 0; bottom: 0; margin: 0; max-width: 150px; @@ -135,17 +137,21 @@ html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-conta align-content: center; flex-direction: column; - transition: color 0.5s; + transition: color 0.5s, background-color 0.5s; } -.nav-chapters:hover { text-decoration: none; } +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} .nav-wrapper { margin-top: 50px; display: none; } -.mobile-nav-chapters { +.mobile-nav-chapters { font-size: 2.5em; text-align: center; text-decoration: none; @@ -176,11 +182,14 @@ html:not(.sidebar-visible) #menu-bar:not(:hover).folded > #menu-bar-sticky-conta /* Inline code */ :not(pre) > .hljs { - display: inline-block; - vertical-align: middle; + display: inline; padding: 0.1em 0.3em; border-radius: 3px; +} + +:not(pre):not(a) > .hljs { color: var(--inline-code-color); + overflow-x: initial; } a:hover > .hljs { @@ -301,8 +310,6 @@ ul#searchresults span.teaser em { top: 0; bottom: 0; width: var(--sidebar-width); - overflow-y: auto; - padding: 10px 10px; font-size: 0.875em; box-sizing: border-box; -webkit-overflow-scrolling: touch; @@ -310,12 +317,39 @@ ul#searchresults span.teaser em { background-color: var(--sidebar-bg); color: var(--sidebar-fg); } -.js .sidebar { +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.js:not(.sidebar-resizing) .sidebar { transition: transform 0.3s; /* Animation: slide away */ } .sidebar code { line-height: 2em; } +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; +} .sidebar-hidden .sidebar { transform: translateX(calc(0px - var(--sidebar-width))); } @@ -341,22 +375,52 @@ ul#searchresults span.teaser em { padding-left: 0; line-height: 2.2em; } + +.chapter ol { + width: 100%; +} + .chapter li { + display: flex; color: var(--sidebar-non-existant); } .chapter li a { - color: var(--sidebar-fg); display: block; padding: 0; text-decoration: none; + color: var(--sidebar-fg); } -.chapter li a:hover { text-decoration: none } -.chapter li .active, -a:hover { - /* Animate color change */ + +.chapter li a:hover { color: var(--sidebar-active); } +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-left: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + .spacer { width: 100%; height: 3px; @@ -366,7 +430,7 @@ a:hover { background-color: var(--sidebar-spacer); } -@media (-moz-touch-enabled: 1), (pointer: coarse) { +@media (-moz-touch-enabled: 1), (pointer: coarse) { .chapter li a { padding: 5px 0; } .spacer { margin: 10px 0; } } @@ -382,7 +446,7 @@ a:hover { .theme-popup { position: absolute; left: 10px; - top: 50px; + top: var(--menu-bar-height); z-index: 1000; border-radius: 4px; font-size: 0.7em; diff --git a/css/general.css b/css/general.css index aedfb33..e0bb851 100644 --- a/css/general.css +++ b/css/general.css @@ -2,6 +2,11 @@ @import 'variables.css'; +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; +} + html { font-family: "Open Sans", sans-serif; color: var(--fg); @@ -11,39 +16,47 @@ html { body { margin: 0; - font-size: 1rem; + font-size: 1.6rem; overflow-x: hidden; } code { - font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */ } .left { float: left; } .right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } .hidden { display: none; } -.play-button.hidden { display: none; } h2, h3 { margin-top: 2.5em; } h4, h5 { margin-top: 2em; } .header + .header h3, .header + .header h4, -.header + .header h5 { +.header + .header h5 { margin-top: 1em; } -a.header:target h1:before, -a.header:target h2:before, -a.header:target h3:before, -a.header:target h4:before { +h1 a.header:target::before, +h2 a.header:target::before, +h3 a.header:target::before, +h4 a.header:target::before { display: inline-block; content: "»"; margin-left: -30px; width: 30px; } +h1 a.header:target, +h2 a.header:target, +h3 a.header:target, +h4 a.header:target { + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + .page { outline: 0; padding: 0 var(--page-padding); @@ -51,7 +64,7 @@ a.header:target h4:before { .page-wrapper { box-sizing: border-box; } -.js .page-wrapper { +.js:not(.sidebar-resizing) .page-wrapper { transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ } @@ -92,6 +105,9 @@ table thead td { font-weight: 700; border: none; } +table thead th { + padding: 3px 20px; +} table thead tr { border: 1px var(--table-header-bg) solid; } @@ -141,4 +157,3 @@ blockquote { .tooltipped .tooltiptext { visibility: visible; } - \ No newline at end of file diff --git a/css/variables.css b/css/variables.css index 29daa07..9534ec8 100644 --- a/css/variables.css +++ b/css/variables.css @@ -5,6 +5,7 @@ --sidebar-width: 300px; --page-padding: 15px; --content-max-width: 750px; + --menu-bar-height: 50px; } /* Themes */ @@ -208,3 +209,45 @@ --searchresults-li-bg: #dec2a2; --search-mark-bg: #e69f67; } + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6;; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/end.html b/end.html index 88cf02d..11fbd8f 100644 --- a/end.html +++ b/end.html @@ -1,9 +1,11 @@ - + The End - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

The End

+

The End

That's it for now…

Happy error handling!

To report issues, submit pull request or for the source code, examples and the book source, visit @@ -151,7 +159,7 @@ the Git Repo.

@@ -280,6 +296,14 @@ fn main() { + + + + + + diff --git a/print.html b/print.html index c2e891c..e8b8f62 100644 --- a/print.html +++ b/print.html @@ -1,9 +1,13 @@ - + chainerror + + + + @@ -30,11 +34,11 @@ - + @@ -56,10 +60,13 @@ @@ -75,7 +82,10 @@
@@ -105,7 +115,7 @@
-

chainerror

+

chainerror

@@ -140,7 +150,7 @@
-

chainerror

+

chainerror

Build Status Crate Rust Documentation

@@ -153,7 +163,7 @@ It encapsulates all types, which have Display + Debug and can store

Debug information is worth it!

Now continue reading the Tutorial

-

Example:

+

Example:

Output:

$ cargo run -q --example example
 Main Error Report: func1 error calling func2
@@ -178,12 +188,12 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
-fn func3() -> Result<(), Box<Error>> {
+fn func3() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
     Ok(())
@@ -246,24 +256,24 @@ fn main() {
 }
 
 
-

Features

+

Features

no-fileline : completely turn off storing filename and line

display-cause : turn on printing a backtrace of the errors in Display

no-debug-cause : turn off printing a backtrace of the errors in Debug

-

Simple String Errors

+

Simple String Errors

An easy way of doing error handling in rust is by returning String as a Box<std::error::Error>.

If the rust main function returns an Err(), this Err() will be displayed with std::fmt::Debug.

-

As you can see by running the example (by pressing the "Play" button in upper right of the code block), -this only +

As you can see by running the example (by pressing the "Play" button in upper right of the code block), +this only prints out the last Error.

Error: StringError("func1 error")
 

The next chapters of this tutorial show how chainerror adds more information and improves inspecting the sources of an error.

-

You can also run the tutorial examples in the checked out +

You can also run the tutorial examples in the checked out chainerror git repo.

$ cargo run -q --example tutorial1
 
@@ -271,31 +281,30 @@ and improves inspecting the sources of an error.

use std::io; use std::result::Result; -fn do_some_io() -> Result<(), Box<Error>> { +fn do_some_io() -> Result<(), Box<Error + Send + Sync>> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } -fn func2() -> Result<(), Box<Error>> { +fn func2() -> Result<(), Box<Error + Send + Sync>> { if let Err(_) = do_some_io() { Err("func2 error")?; } Ok(()) } -fn func1() -> Result<(), Box<Error>> { +fn func1() -> Result<(), Box<Error + Send + Sync>> { if let Err(_) = func2() { Err("func1 error")?; } Ok(()) } -fn main() -> Result<(), Box<Error>> { +fn main() -> Result<(), Box<Error + Send + Sync>> { func1() } - -

Simple Chained String Errors

+

Simple Chained String Errors

With relatively small changes and the help of the cherr! macro of the chainerror crate the String errors are now chained together.

Press the play button in the upper right corner and see the nice debug output.

@@ -305,968 +314,47 @@ use std::error::Error; use std::io; use std::result::Result; -fn do_some_io() -> Result<(), Box<Error>> { +fn do_some_io() -> Result<(), Box<Error + Send + Sync>> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } -fn func2() -> Result<(), Box<Error>> { +fn func2() -> Result<(), Box<Error + Send + Sync>> { if let Err(e) = do_some_io() { Err(cherr!(e, "func2 error"))?; } Ok(()) } -fn func1() -> Result<(), Box<Error>> { +fn func1() -> Result<(), Box<Error + Send + Sync>> { if let Err(e) = func2() { Err(cherr!(e, "func1 error"))?; } Ok(()) } -fn main() -> Result<(), Box<Error>> { +fn main() -> Result<(), Box<Error + Send + Sync>> { func1() } - -# #[allow(dead_code)] -# mod chainerror { -# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your -# //! binaries, you still have the error backtrace. -# //! -# //! `chainerror` has no dependencies! -# //! -# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace. -# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally. -# //! -# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing. -# //! -# //! ## Features -# //! -# //! `no-fileline` -# //! : completely turn off storing filename and line -# //! -# //! `display-cause` -# //! : turn on printing a backtrace of the errors in `Display` -# //! -# //! `no-debug-cause` -# //! : turn off printing a backtrace of the errors in `Debug` -# //! -# //! -# //! # Tutorial -# //! -# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html) -# //! -# //! # Examples -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func2() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! fn func1() -> Result<(), Box<Error>> { -# //! func2().map_err(mstrerr!("func1 error"))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:20: func1 error -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# //! -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func3() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! derive_str_cherr!(Func2Error); -# //! -# //! fn func2() -> ChainResult<(), Func2Error> { -# //! func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?; -# //! Ok(()) -# //! } -# //! -# //! enum Func1Error { -# //! Func2, -# //! IO(String), -# //! } -# //! -# //! impl ::std::fmt::Display for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! match self { -# //! Func1Error::Func2 => write!(f, "func1 error calling func2"), -# //! Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename), -# //! } -# //! } -# //! } -# //! -# //! impl ::std::fmt::Debug for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! write!(f, "{}", self) -# //! } -# //! } -# //! -# //! fn func1() -> ChainResult<(), Func1Error> { -# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?; -# //! let filename = String::from("bar.txt"); -# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! assert!( -# //! match e.kind() { -# //! Func1Error::Func2 => { -# //! eprintln!("Main Error Report: func1 error calling func2"); -# //! true -# //! } -# //! Func1Error::IO(filename) => { -# //! eprintln!("Main Error Report: func1 error reading '{}'", filename); -# //! false -# //! } -# //! } -# //! ); -# //! -# //! assert!(e.find_chain_cause::<Func2Error>().is_some()); -# //! -# //! if let Some(e) = e.find_chain_cause::<Func2Error>() { -# //! eprintln!("\nError reported by Func2Error: {}", e) -# //! } -# //! -# //! -# //! assert!(e.root_cause().is_some()); -# //! -# //! if let Some(e) = e.root_cause() { -# //! let ioerror = e.downcast_ref::<io::Error>().unwrap(); -# //! eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror); -# //! } -# //! -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:47: func1 error calling func2 -# //! Caused by: -# //! src/lib.rs:22: Func2Error(func2 error: calling func3) -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# -# use std::any::TypeId; -# use std::error::Error; -# use std::fmt::{Debug, Display, Formatter, Result}; -# -# /// chains an inner error kind `T` with a causing error -# pub struct ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# occurrence: Option<(u32, &'static str)>, -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# } -# -# /// convenience type alias -# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>; -# -# impl<T: 'static + Display + Debug> ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { -# occurrence, -# kind, -# error_cause, -# } -# } -# -# #[cfg(feature = "no-fileline")] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# _occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { kind, error_cause } -# } -# -# /// return the root cause of the error chain, if any exists -# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> { -# self.iter().last() -# } -# -# /// Find the first error cause of type U, if any exists -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// -# /// assert!(f1err.find_cause::<io::Error>().is_some()); -# /// -# /// assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// } -# /// # else { -# /// # panic!(); -# /// # } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter().filter_map(Error::downcast_ref::<U>).next() -# } -# -# /// Find the first error cause of type `ChainError<U>`, if any exists -# /// -# /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooError>>(); -# /// -# /// // leave out the ChainError<FooError> implementation detail -# /// err.find_chain_cause::<FooError>(); -# /// ~~~ -# pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> { -# self.iter() -# .filter_map(Error::downcast_ref::<ChainError<U>>) -# .next() -# } -# -# /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U` -# /// -# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooErrorKind>>(); -# /// // and/or -# /// err.find_chain_cause::<FooErrorKind>(); -# /// // and/or -# /// err.find_cause::<FooErrorKind>(); -# /// -# /// // leave out the ChainError<FooErrorKind> implementation detail -# /// err.find_chain_or_kind::<FooErrorKind>(); -# /// ~~~ -# pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter() -# .filter_map(|e| { -# e.downcast_ref::<ChainError<U>>() -# .map(|e| e.kind()) -# .or_else(|| e.downcast_ref::<U>()) -# }) -# .next() -# } -# -# /// Return a reference to T of `ChainError<T>` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// #[derive(Debug)] -# /// enum Func1ErrorKind { -# /// Func2, -# /// IO(String), -# /// } -# /// -# /// /// impl ::std::fmt::Display for Func1ErrorKind {…} -# /// # impl ::std::fmt::Display for Func1ErrorKind { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"), -# /// # Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename), -# /// # } -# /// # } -# /// # } -# /// -# /// fn func1() -> ChainResult<(), Func1ErrorKind> { -# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; -# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// match e.kind() { -# /// Func1ErrorKind::Func2 => {}, -# /// Func1ErrorKind::IO(filename) => panic!(), -# /// } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn kind(&self) -> &T { -# &self.kind -# } -# -# /// Returns an Iterator over all error causes/sources -# /// -# /// # Example -# /// -# /// -# pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> { -# ErrorIter { -# current: Some(self), -# } -# } -# } -# -# struct ErrorIter<'a> { -# current: Option<&'a (dyn Error + 'static)>, -# } -# -# impl<'a> Iterator for ErrorIter<'a> { -# type Item = &'a (dyn Error + 'static); -# -# fn next(&mut self) -> Option<Self::Item> { -# let current = self.current; -# self.current = self.current.and_then(Error::source); -# current -# } -# } -# -# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> { -# type Target = T; -# -# fn deref(&self) -> &Self::Target { -# &self.kind -# } -# } -# -# /// Convenience trait to hide the `ChainError<T>` implementation internals -# pub trait ChainErrorDown { -# /// Test if of type `ChainError<T>` -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool; -# /// Downcast to a reference of `ChainError<T>` -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>; -# /// Downcast to a mutable reference of `ChainError<T>` -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>; -# } -# -# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# TypeId::of::<T>() == TypeId::of::<U>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&*(self as *const dyn Error as *const &ChainError<T>)) -# } -# } else { -# None -# } -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>)) -# } -# } else { -# None -# } -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send + Sync { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl<T: 'static + Display + Debug> Error for ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Display for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# write!(f, "{}", self.kind)?; -# -# #[cfg(feature = "display-cause")] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Display::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# impl<T: 'static + Display + Debug> Debug for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# #[cfg(not(feature = "no-fileline"))] -# { -# if let Some(o) = self.occurrence { -# write!(f, "{}:{}: ", o.1, o.0)?; -# } -# } -# -# if self.is_chain::<String>() { -# Display::fmt(&self.kind, f)?; -# } else { -# Debug::fmt(&self.kind, f)?; -# } -# -# #[cfg(not(feature = "no-debug-cause"))] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Debug::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# pub trait ChainErrorFrom<T>: Sized { -# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>; -# } -# -# pub trait IntoChainError<T>: Sized { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>; -# } -# -# impl<T, U> IntoChainError<U> for T -# where -# U: ChainErrorFrom<T>, -# { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> { -# U::chain_error_from(self, line_filename) -# } -# } -# -# impl<T, U> ChainErrorFrom<T> for U -# where -# T: Into<U>, -# U: 'static + Display + Debug, -# { -# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> { -# let e: U = t.into(); -# ChainError::<_>::new(e, None, line_filename) -# } -# } -# -# #[macro_export] -# macro_rules! minto_cherr { -# ( ) => { -# |e| e.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# #[macro_export] -# macro_rules! into_cherr { -# ( $t:expr ) => { -# $t.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# /// Creates a new `ChainError<T>` -# /// -# /// # Examples -# /// -# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`. -# /// ~~~rust -# /// # use chainerror::*; -# /// # -# /// # #[derive(Debug)] -# /// enum FooError { -# /// Bar, -# /// Baz(&'static str), -# /// } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// -# /// // impl ::std::fmt::Display for FooError -# /// -# /// fn do_some_stuff() -> bool { -# /// false -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// if ! do_some_stuff() { -# /// Err(cherr!(FooError::Baz("Error")))?; -# /// } -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# /// -# /// Additionally an error cause can be added. -# /// -# /// ~~~rust -# /// # use chainerror::*; -# /// # use std::io; -# /// # use std::error::Error; -# /// # -# /// # #[derive(Debug)] -# /// # enum FooError { -# /// # Bar, -# /// # Baz(&'static str), -# /// # } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// # -# /// fn do_some_stuff() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// do_some_stuff().map_err( -# /// |e| cherr!(e, FooError::Baz("Error")) -# /// )?; -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! cherr { -# ( $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( $e:path, $k:expr ) => ({ -# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!()))) -# }); -# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($e, format!($fmt, $($arg)+ )) -# }); -# -# } -# -# /// Convenience macro for `|e| cherr!(e, format!(…))` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!("func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # #[cfg(not(windows))] -# /// # assert_eq!( -# /// # format!("\n{:?}\n", e), r#" -# /// # src/lib.rs:20: func1 error -# /// # Caused by: -# /// # src/lib.rs:15: Error reading 'foo.txt' -# /// # Caused by: -# /// # Kind(NotFound) -# /// # "# -# /// # ); -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# /// -# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with -# /// `derive_str_cherr!(T)` -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! mstrerr { -# ( $t:path, $msg:expr ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# |e| cherr!(e, $t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# |e| cherr!(e, format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::result::Result; -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// Err(strerr!(Func2Error, "Error reading '{}'", filename)) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! strerr { -# ( $t:path, $msg:expr ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# cherr!($msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# cherr!($msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# cherr!(format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! derive_str_cherr { -# ($e:ident) => { -# pub struct $e(pub String); -# impl ::std::fmt::Display for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}", self.0) -# } -# } -# impl ::std::fmt::Debug for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}({})", stringify!($e), self.0) -# } -# } -# impl ::std::error::Error for $e {} -# }; -# } -# } - -

What did we do here?

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

What did we do here?

    if let Err(e) = do_some_io() {
         Err(cherr!(e, "func2 error"))?;
     }
 
-

The macro cherr!(olderror, newerror) stores olderror as the source/cause of newerror +

The macro cherr!(olderror, newerror) stores olderror as the source/cause of newerror along with the filename (file!()) and line number (line!()) and returns newerror.

Err()? then returns the inner error applying .into(), so that we -again have a Err(Box<Error>) as a result.

+again have a Err(Box<Error + Send + Sync>) as a result.

The Debug implementation of ChainError<T> (which is returned by cherr!()) prints the Debug of T prefixed with the stored filename and line number.

ChainError<T> in our case is ChainError<String>.

-

Mapping Errors

+

Mapping Errors

Now let's get more rust idiomatic by using .map_err().

use chainerror::*;
 
@@ -1274,953 +362,32 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     do_some_io().map_err(|e| cherr!(e, "func2 error"))?;
     Ok(())
 }
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     func2().map_err(|e| cherr!(e, "func1 error"))?;
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         eprintln!("{:?}", e);
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +

If you compare the output to the previous example, you will see, that:

Error: src/main.rs:19: "func1 error"
@@ -2231,7 +398,7 @@ that:

This is, because we caught the error of func1() in main() and print it out ourselves.

We can now control, whether to output in Debug or Display mode. Maybe depending on --debug as a CLI argument.

-

Saving coding chars

+

Saving coding chars

Because decorating an error with more information should not let you jump through hoops, chainerror has a quick macro for that.

mstrerror!() fits right into .map_err() letting you quickly add @@ -2242,955 +409,34 @@ use std::error::Error; use std::io; use std::result::Result; -fn do_some_io() -> Result<(), Box<Error>> { +fn do_some_io() -> Result<(), Box<Error + Send + Sync>> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } -fn func2() -> Result<(), Box<Error>> { +fn func2() -> Result<(), Box<Error + Send + Sync>> { let filename = "foo.txt"; do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; Ok(()) } -fn func1() -> Result<(), Box<Error>> { +fn func1() -> Result<(), Box<Error + Send + Sync>> { func2().map_err(mstrerr!("func1 error"))?; Ok(()) } -fn main() -> Result<(), Box<Error>> { +fn main() -> Result<(), Box<Error + Send + Sync>> { if let Err(e) = func1() { eprintln!("{:?}", e); } Ok(()) } - -# #[allow(dead_code)] -# mod chainerror { -# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your -# //! binaries, you still have the error backtrace. -# //! -# //! `chainerror` has no dependencies! -# //! -# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace. -# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally. -# //! -# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing. -# //! -# //! ## Features -# //! -# //! `no-fileline` -# //! : completely turn off storing filename and line -# //! -# //! `display-cause` -# //! : turn on printing a backtrace of the errors in `Display` -# //! -# //! `no-debug-cause` -# //! : turn off printing a backtrace of the errors in `Debug` -# //! -# //! -# //! # Tutorial -# //! -# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html) -# //! -# //! # Examples -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func2() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! fn func1() -> Result<(), Box<Error>> { -# //! func2().map_err(mstrerr!("func1 error"))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:20: func1 error -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# //! -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func3() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! derive_str_cherr!(Func2Error); -# //! -# //! fn func2() -> ChainResult<(), Func2Error> { -# //! func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?; -# //! Ok(()) -# //! } -# //! -# //! enum Func1Error { -# //! Func2, -# //! IO(String), -# //! } -# //! -# //! impl ::std::fmt::Display for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! match self { -# //! Func1Error::Func2 => write!(f, "func1 error calling func2"), -# //! Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename), -# //! } -# //! } -# //! } -# //! -# //! impl ::std::fmt::Debug for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! write!(f, "{}", self) -# //! } -# //! } -# //! -# //! fn func1() -> ChainResult<(), Func1Error> { -# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?; -# //! let filename = String::from("bar.txt"); -# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! assert!( -# //! match e.kind() { -# //! Func1Error::Func2 => { -# //! eprintln!("Main Error Report: func1 error calling func2"); -# //! true -# //! } -# //! Func1Error::IO(filename) => { -# //! eprintln!("Main Error Report: func1 error reading '{}'", filename); -# //! false -# //! } -# //! } -# //! ); -# //! -# //! assert!(e.find_chain_cause::<Func2Error>().is_some()); -# //! -# //! if let Some(e) = e.find_chain_cause::<Func2Error>() { -# //! eprintln!("\nError reported by Func2Error: {}", e) -# //! } -# //! -# //! -# //! assert!(e.root_cause().is_some()); -# //! -# //! if let Some(e) = e.root_cause() { -# //! let ioerror = e.downcast_ref::<io::Error>().unwrap(); -# //! eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror); -# //! } -# //! -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:47: func1 error calling func2 -# //! Caused by: -# //! src/lib.rs:22: Func2Error(func2 error: calling func3) -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# -# use std::any::TypeId; -# use std::error::Error; -# use std::fmt::{Debug, Display, Formatter, Result}; -# -# /// chains an inner error kind `T` with a causing error -# pub struct ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# occurrence: Option<(u32, &'static str)>, -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# } -# -# /// convenience type alias -# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>; -# -# impl<T: 'static + Display + Debug> ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { -# occurrence, -# kind, -# error_cause, -# } -# } -# -# #[cfg(feature = "no-fileline")] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# _occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { kind, error_cause } -# } -# -# /// return the root cause of the error chain, if any exists -# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> { -# self.iter().last() -# } -# -# /// Find the first error cause of type U, if any exists -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// -# /// assert!(f1err.find_cause::<io::Error>().is_some()); -# /// -# /// assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// } -# /// # else { -# /// # panic!(); -# /// # } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter().filter_map(Error::downcast_ref::<U>).next() -# } -# -# /// Find the first error cause of type `ChainError<U>`, if any exists -# /// -# /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooError>>(); -# /// -# /// // leave out the ChainError<FooError> implementation detail -# /// err.find_chain_cause::<FooError>(); -# /// ~~~ -# pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> { -# self.iter() -# .filter_map(Error::downcast_ref::<ChainError<U>>) -# .next() -# } -# -# /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U` -# /// -# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooErrorKind>>(); -# /// // and/or -# /// err.find_chain_cause::<FooErrorKind>(); -# /// // and/or -# /// err.find_cause::<FooErrorKind>(); -# /// -# /// // leave out the ChainError<FooErrorKind> implementation detail -# /// err.find_chain_or_kind::<FooErrorKind>(); -# /// ~~~ -# pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter() -# .filter_map(|e| { -# e.downcast_ref::<ChainError<U>>() -# .map(|e| e.kind()) -# .or_else(|| e.downcast_ref::<U>()) -# }) -# .next() -# } -# -# /// Return a reference to T of `ChainError<T>` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// #[derive(Debug)] -# /// enum Func1ErrorKind { -# /// Func2, -# /// IO(String), -# /// } -# /// -# /// /// impl ::std::fmt::Display for Func1ErrorKind {…} -# /// # impl ::std::fmt::Display for Func1ErrorKind { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"), -# /// # Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename), -# /// # } -# /// # } -# /// # } -# /// -# /// fn func1() -> ChainResult<(), Func1ErrorKind> { -# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; -# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// match e.kind() { -# /// Func1ErrorKind::Func2 => {}, -# /// Func1ErrorKind::IO(filename) => panic!(), -# /// } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn kind(&self) -> &T { -# &self.kind -# } -# -# /// Returns an Iterator over all error causes/sources -# /// -# /// # Example -# /// -# /// -# pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> { -# ErrorIter { -# current: Some(self), -# } -# } -# } -# -# struct ErrorIter<'a> { -# current: Option<&'a (dyn Error + 'static)>, -# } -# -# impl<'a> Iterator for ErrorIter<'a> { -# type Item = &'a (dyn Error + 'static); -# -# fn next(&mut self) -> Option<Self::Item> { -# let current = self.current; -# self.current = self.current.and_then(Error::source); -# current -# } -# } -# -# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> { -# type Target = T; -# -# fn deref(&self) -> &Self::Target { -# &self.kind -# } -# } -# -# /// Convenience trait to hide the `ChainError<T>` implementation internals -# pub trait ChainErrorDown { -# /// Test if of type `ChainError<T>` -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool; -# /// Downcast to a reference of `ChainError<T>` -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>; -# /// Downcast to a mutable reference of `ChainError<T>` -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>; -# } -# -# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# TypeId::of::<T>() == TypeId::of::<U>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&*(self as *const dyn Error as *const &ChainError<T>)) -# } -# } else { -# None -# } -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>)) -# } -# } else { -# None -# } -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send + Sync { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl<T: 'static + Display + Debug> Error for ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Display for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# write!(f, "{}", self.kind)?; -# -# #[cfg(feature = "display-cause")] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Display::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# impl<T: 'static + Display + Debug> Debug for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# #[cfg(not(feature = "no-fileline"))] -# { -# if let Some(o) = self.occurrence { -# write!(f, "{}:{}: ", o.1, o.0)?; -# } -# } -# -# if self.is_chain::<String>() { -# Display::fmt(&self.kind, f)?; -# } else { -# Debug::fmt(&self.kind, f)?; -# } -# -# #[cfg(not(feature = "no-debug-cause"))] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Debug::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# pub trait ChainErrorFrom<T>: Sized { -# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>; -# } -# -# pub trait IntoChainError<T>: Sized { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>; -# } -# -# impl<T, U> IntoChainError<U> for T -# where -# U: ChainErrorFrom<T>, -# { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> { -# U::chain_error_from(self, line_filename) -# } -# } -# -# impl<T, U> ChainErrorFrom<T> for U -# where -# T: Into<U>, -# U: 'static + Display + Debug, -# { -# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> { -# let e: U = t.into(); -# ChainError::<_>::new(e, None, line_filename) -# } -# } -# -# #[macro_export] -# macro_rules! minto_cherr { -# ( ) => { -# |e| e.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# #[macro_export] -# macro_rules! into_cherr { -# ( $t:expr ) => { -# $t.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# /// Creates a new `ChainError<T>` -# /// -# /// # Examples -# /// -# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`. -# /// ~~~rust -# /// # use chainerror::*; -# /// # -# /// # #[derive(Debug)] -# /// enum FooError { -# /// Bar, -# /// Baz(&'static str), -# /// } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// -# /// // impl ::std::fmt::Display for FooError -# /// -# /// fn do_some_stuff() -> bool { -# /// false -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// if ! do_some_stuff() { -# /// Err(cherr!(FooError::Baz("Error")))?; -# /// } -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# /// -# /// Additionally an error cause can be added. -# /// -# /// ~~~rust -# /// # use chainerror::*; -# /// # use std::io; -# /// # use std::error::Error; -# /// # -# /// # #[derive(Debug)] -# /// # enum FooError { -# /// # Bar, -# /// # Baz(&'static str), -# /// # } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// # -# /// fn do_some_stuff() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// do_some_stuff().map_err( -# /// |e| cherr!(e, FooError::Baz("Error")) -# /// )?; -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! cherr { -# ( $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( $e:path, $k:expr ) => ({ -# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!()))) -# }); -# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($e, format!($fmt, $($arg)+ )) -# }); -# -# } -# -# /// Convenience macro for `|e| cherr!(e, format!(…))` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!("func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # #[cfg(not(windows))] -# /// # assert_eq!( -# /// # format!("\n{:?}\n", e), r#" -# /// # src/lib.rs:20: func1 error -# /// # Caused by: -# /// # src/lib.rs:15: Error reading 'foo.txt' -# /// # Caused by: -# /// # Kind(NotFound) -# /// # "# -# /// # ); -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# /// -# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with -# /// `derive_str_cherr!(T)` -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! mstrerr { -# ( $t:path, $msg:expr ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# |e| cherr!(e, $t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# |e| cherr!(e, format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::result::Result; -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// Err(strerr!(Func2Error, "Error reading '{}'", filename)) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! strerr { -# ( $t:path, $msg:expr ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# cherr!($msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# cherr!($msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# cherr!(format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! derive_str_cherr { -# ($e:ident) => { -# pub struct $e(pub String); -# impl ::std::fmt::Display for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}", self.0) -# } -# } -# impl ::std::fmt::Debug for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}({})", stringify!($e), self.0) -# } -# } -# impl ::std::error::Error for $e {} -# }; -# } -# } -

-

The source() of Errors

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

The source() of Errors

Sometimes you want to inspect the source() of an Error. chainerror implements std::error::Error::source(), so you can get the cause of an error.

use chainerror::*;
@@ -3198,18 +444,18 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
     Ok(())
 }
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func2() {
         if let Some(s) = e.source() {
             eprintln!("func2 failed because of '{}'", s);
@@ -3219,943 +465,22 @@ fn func1() -> Result<(), Box<Error>> {
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         eprintln!("{}", e);
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
-

Note, that because we changed the output of the error in main() from +#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

Note, that because we changed the output of the error in main() from Debug to Display, we don't see the error backtrace with filename and line number.

To enable the Display backtrace, you have to enable the feature display-cause for chainerror.

-

Downcast the Errors

-

std::error::Error comes with some helper methods to get to the original object of the +

Downcast the Errors

+

std::error::Error comes with some helper methods to get to the original object of the &(dyn Error + 'static) returned by .source().

pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T>
 pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T>
@@ -4166,26 +491,26 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
     Ok(())
 }
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     func2().map_err(mstrerr!("func1 error"))?;
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         eprintln!("Error: {}", e);
-        let mut s = e.as_ref();
+        let mut s : &(dyn Error) = e.as_ref();
         while let Some(c) = s.source() {
             if let Some(ioerror) = c.downcast_ref::<io::Error>() {
                 eprintln!("caused by: std::io::Error: {}", ioerror);
@@ -4201,933 +526,12 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
-

The root cause of all Errors

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

The root cause of all Errors

chainerror also has some helper methods:

fn is_chain<T: 'static + Display + Debug>(&self) -> bool
 fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>
@@ -5138,7 +542,7 @@ fn find_chain_cause<U: Error + 'static>(&self) -> Option<&Ch
 fn kind<'a>(&'a self) -> &'a T
 

Using downcast_chain_ref::<String>() gives a ChainError<String>, which can be used -to call .find_cause::<io::Error>().

+to call .find_cause::<io::Error>().

        if let Some(s) = e.downcast_chain_ref::<String>() {
             if let Some(ioerror) = s.find_cause::<io::Error>() {
 
@@ -5150,23 +554,23 @@ use std::error::Error; use std::io; use std::result::Result; -fn do_some_io() -> Result<(), Box<Error>> { +fn do_some_io() -> Result<(), Box<Error + Send + Sync>> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } -fn func2() -> Result<(), Box<Error>> { +fn func2() -> Result<(), Box<Error + Send + Sync>> { let filename = "foo.txt"; do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; Ok(()) } -fn func1() -> Result<(), Box<Error>> { +fn func1() -> Result<(), Box<Error + Send + Sync>> { func2().map_err(mstrerr!("func1 error"))?; Ok(()) } -fn main() -> Result<(), Box<Error>> { +fn main() -> Result<(), Box<Error + Send + Sync>> { if let Err(e) = func1() { eprintln!("Error: {}", e); if let Some(s) = e.downcast_chain_ref::<String>() { @@ -5186,933 +590,12 @@ fn main() -> Result<(), Box<Error>> { } Ok(()) } - -# #[allow(dead_code)] -# mod chainerror { -# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your -# //! binaries, you still have the error backtrace. -# //! -# //! `chainerror` has no dependencies! -# //! -# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace. -# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally. -# //! -# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing. -# //! -# //! ## Features -# //! -# //! `no-fileline` -# //! : completely turn off storing filename and line -# //! -# //! `display-cause` -# //! : turn on printing a backtrace of the errors in `Display` -# //! -# //! `no-debug-cause` -# //! : turn off printing a backtrace of the errors in `Debug` -# //! -# //! -# //! # Tutorial -# //! -# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html) -# //! -# //! # Examples -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func2() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! fn func1() -> Result<(), Box<Error>> { -# //! func2().map_err(mstrerr!("func1 error"))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:20: func1 error -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# //! -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func3() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! derive_str_cherr!(Func2Error); -# //! -# //! fn func2() -> ChainResult<(), Func2Error> { -# //! func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?; -# //! Ok(()) -# //! } -# //! -# //! enum Func1Error { -# //! Func2, -# //! IO(String), -# //! } -# //! -# //! impl ::std::fmt::Display for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! match self { -# //! Func1Error::Func2 => write!(f, "func1 error calling func2"), -# //! Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename), -# //! } -# //! } -# //! } -# //! -# //! impl ::std::fmt::Debug for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! write!(f, "{}", self) -# //! } -# //! } -# //! -# //! fn func1() -> ChainResult<(), Func1Error> { -# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?; -# //! let filename = String::from("bar.txt"); -# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! assert!( -# //! match e.kind() { -# //! Func1Error::Func2 => { -# //! eprintln!("Main Error Report: func1 error calling func2"); -# //! true -# //! } -# //! Func1Error::IO(filename) => { -# //! eprintln!("Main Error Report: func1 error reading '{}'", filename); -# //! false -# //! } -# //! } -# //! ); -# //! -# //! assert!(e.find_chain_cause::<Func2Error>().is_some()); -# //! -# //! if let Some(e) = e.find_chain_cause::<Func2Error>() { -# //! eprintln!("\nError reported by Func2Error: {}", e) -# //! } -# //! -# //! -# //! assert!(e.root_cause().is_some()); -# //! -# //! if let Some(e) = e.root_cause() { -# //! let ioerror = e.downcast_ref::<io::Error>().unwrap(); -# //! eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror); -# //! } -# //! -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:47: func1 error calling func2 -# //! Caused by: -# //! src/lib.rs:22: Func2Error(func2 error: calling func3) -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# -# use std::any::TypeId; -# use std::error::Error; -# use std::fmt::{Debug, Display, Formatter, Result}; -# -# /// chains an inner error kind `T` with a causing error -# pub struct ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# occurrence: Option<(u32, &'static str)>, -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# } -# -# /// convenience type alias -# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>; -# -# impl<T: 'static + Display + Debug> ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { -# occurrence, -# kind, -# error_cause, -# } -# } -# -# #[cfg(feature = "no-fileline")] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# _occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { kind, error_cause } -# } -# -# /// return the root cause of the error chain, if any exists -# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> { -# self.iter().last() -# } -# -# /// Find the first error cause of type U, if any exists -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// -# /// assert!(f1err.find_cause::<io::Error>().is_some()); -# /// -# /// assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// } -# /// # else { -# /// # panic!(); -# /// # } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter().filter_map(Error::downcast_ref::<U>).next() -# } -# -# /// Find the first error cause of type `ChainError<U>`, if any exists -# /// -# /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooError>>(); -# /// -# /// // leave out the ChainError<FooError> implementation detail -# /// err.find_chain_cause::<FooError>(); -# /// ~~~ -# pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> { -# self.iter() -# .filter_map(Error::downcast_ref::<ChainError<U>>) -# .next() -# } -# -# /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U` -# /// -# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooErrorKind>>(); -# /// // and/or -# /// err.find_chain_cause::<FooErrorKind>(); -# /// // and/or -# /// err.find_cause::<FooErrorKind>(); -# /// -# /// // leave out the ChainError<FooErrorKind> implementation detail -# /// err.find_chain_or_kind::<FooErrorKind>(); -# /// ~~~ -# pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter() -# .filter_map(|e| { -# e.downcast_ref::<ChainError<U>>() -# .map(|e| e.kind()) -# .or_else(|| e.downcast_ref::<U>()) -# }) -# .next() -# } -# -# /// Return a reference to T of `ChainError<T>` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// #[derive(Debug)] -# /// enum Func1ErrorKind { -# /// Func2, -# /// IO(String), -# /// } -# /// -# /// /// impl ::std::fmt::Display for Func1ErrorKind {…} -# /// # impl ::std::fmt::Display for Func1ErrorKind { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"), -# /// # Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename), -# /// # } -# /// # } -# /// # } -# /// -# /// fn func1() -> ChainResult<(), Func1ErrorKind> { -# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; -# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// match e.kind() { -# /// Func1ErrorKind::Func2 => {}, -# /// Func1ErrorKind::IO(filename) => panic!(), -# /// } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn kind(&self) -> &T { -# &self.kind -# } -# -# /// Returns an Iterator over all error causes/sources -# /// -# /// # Example -# /// -# /// -# pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> { -# ErrorIter { -# current: Some(self), -# } -# } -# } -# -# struct ErrorIter<'a> { -# current: Option<&'a (dyn Error + 'static)>, -# } -# -# impl<'a> Iterator for ErrorIter<'a> { -# type Item = &'a (dyn Error + 'static); -# -# fn next(&mut self) -> Option<Self::Item> { -# let current = self.current; -# self.current = self.current.and_then(Error::source); -# current -# } -# } -# -# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> { -# type Target = T; -# -# fn deref(&self) -> &Self::Target { -# &self.kind -# } -# } -# -# /// Convenience trait to hide the `ChainError<T>` implementation internals -# pub trait ChainErrorDown { -# /// Test if of type `ChainError<T>` -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool; -# /// Downcast to a reference of `ChainError<T>` -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>; -# /// Downcast to a mutable reference of `ChainError<T>` -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>; -# } -# -# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# TypeId::of::<T>() == TypeId::of::<U>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&*(self as *const dyn Error as *const &ChainError<T>)) -# } -# } else { -# None -# } -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>)) -# } -# } else { -# None -# } -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send + Sync { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl<T: 'static + Display + Debug> Error for ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Display for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# write!(f, "{}", self.kind)?; -# -# #[cfg(feature = "display-cause")] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Display::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# impl<T: 'static + Display + Debug> Debug for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# #[cfg(not(feature = "no-fileline"))] -# { -# if let Some(o) = self.occurrence { -# write!(f, "{}:{}: ", o.1, o.0)?; -# } -# } -# -# if self.is_chain::<String>() { -# Display::fmt(&self.kind, f)?; -# } else { -# Debug::fmt(&self.kind, f)?; -# } -# -# #[cfg(not(feature = "no-debug-cause"))] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Debug::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# pub trait ChainErrorFrom<T>: Sized { -# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>; -# } -# -# pub trait IntoChainError<T>: Sized { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>; -# } -# -# impl<T, U> IntoChainError<U> for T -# where -# U: ChainErrorFrom<T>, -# { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> { -# U::chain_error_from(self, line_filename) -# } -# } -# -# impl<T, U> ChainErrorFrom<T> for U -# where -# T: Into<U>, -# U: 'static + Display + Debug, -# { -# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> { -# let e: U = t.into(); -# ChainError::<_>::new(e, None, line_filename) -# } -# } -# -# #[macro_export] -# macro_rules! minto_cherr { -# ( ) => { -# |e| e.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# #[macro_export] -# macro_rules! into_cherr { -# ( $t:expr ) => { -# $t.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# /// Creates a new `ChainError<T>` -# /// -# /// # Examples -# /// -# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`. -# /// ~~~rust -# /// # use chainerror::*; -# /// # -# /// # #[derive(Debug)] -# /// enum FooError { -# /// Bar, -# /// Baz(&'static str), -# /// } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// -# /// // impl ::std::fmt::Display for FooError -# /// -# /// fn do_some_stuff() -> bool { -# /// false -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// if ! do_some_stuff() { -# /// Err(cherr!(FooError::Baz("Error")))?; -# /// } -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# /// -# /// Additionally an error cause can be added. -# /// -# /// ~~~rust -# /// # use chainerror::*; -# /// # use std::io; -# /// # use std::error::Error; -# /// # -# /// # #[derive(Debug)] -# /// # enum FooError { -# /// # Bar, -# /// # Baz(&'static str), -# /// # } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// # -# /// fn do_some_stuff() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// do_some_stuff().map_err( -# /// |e| cherr!(e, FooError::Baz("Error")) -# /// )?; -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! cherr { -# ( $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( $e:path, $k:expr ) => ({ -# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!()))) -# }); -# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($e, format!($fmt, $($arg)+ )) -# }); -# -# } -# -# /// Convenience macro for `|e| cherr!(e, format!(…))` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!("func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # #[cfg(not(windows))] -# /// # assert_eq!( -# /// # format!("\n{:?}\n", e), r#" -# /// # src/lib.rs:20: func1 error -# /// # Caused by: -# /// # src/lib.rs:15: Error reading 'foo.txt' -# /// # Caused by: -# /// # Kind(NotFound) -# /// # "# -# /// # ); -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# /// -# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with -# /// `derive_str_cherr!(T)` -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! mstrerr { -# ( $t:path, $msg:expr ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# |e| cherr!(e, $t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# |e| cherr!(e, format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::result::Result; -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// Err(strerr!(Func2Error, "Error reading '{}'", filename)) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! strerr { -# ( $t:path, $msg:expr ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# cherr!($msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# cherr!($msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# cherr!(format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! derive_str_cherr { -# ($e:ident) => { -# pub struct $e(pub String); -# impl ::std::fmt::Display for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}", self.0) -# } -# } -# impl ::std::fmt::Debug for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}({})", stringify!($e), self.0) -# } -# } -# impl ::std::error::Error for $e {} -# }; -# } -# } - -

Finding an Error cause

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

Finding an Error cause

To distinguish the errors occuring in various places, we can define named string errors with the "new type" pattern.

derive_str_cherr!(Func2Error);
@@ -6132,14 +615,14 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -6147,12 +630,12 @@ fn func2() -> Result<(), Box<Error>> {
 
 derive_str_cherr!(Func1Error);
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
             eprintln!("Func1Error: {}", f1err);
@@ -6168,937 +651,16 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
-

Selective Error Handling

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

Selective Error Handling

What about functions returning different Error types?

In this example func1() can return either Func1ErrorFunc2 or Func1ErrorIO.

We might want to match on func1() with something like:

-
fn main() -> Result<(), Box<Error>> {
+
fn main() -> Result<(), Box<Error + Send + Sync>> {
     match func1() {
         Err(e) if let Some(s) = e.downcast_chain_ref::<Func1ErrorIO>() =>
         eprintln!("Func1ErrorIO:\n{:?}", s),
@@ -7118,14 +680,14 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -7134,14 +696,14 @@ fn func2() -> Result<(), Box<Error>> {
 derive_str_cherr!(Func1ErrorFunc2);
 derive_str_cherr!(Func1ErrorIO);
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     func2().map_err(mstrerr!(Func1ErrorFunc2, "func1 error calling func2"))?;
     let filename = "bar.txt";
     do_some_io().map_err(mstrerr!(Func1ErrorIO, "Error reading '{}'", filename))?;
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         if let Some(s) = e.downcast_ref::<ChainError<Func1ErrorIO>>() {
             eprintln!("Func1ErrorIO:\n{:?}", s);
@@ -7153,956 +715,35 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
-

ErrorKind to the rescue

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
+

ErrorKind to the rescue

To cope with different kind of errors, we introduce the kind of an error Func1ErrorKind with an enum.

Because we derive Debug and implement Display our Func1ErrorKind enum, this enum can be used as a std::error::Error.

Not using String errors anymore, the cherr!() macro seen in the beginning of the tutorial has to be used again.

-

Only returning Func1ErrorKind in func1() now let us get rid of Result<(), Box<Error>> and we can +

Only returning Func1ErrorKind in func1() now let us get rid of Result<(), Box<Error + Send + Sync>> and we can use ChainResult<(), Func1ErrorKind>.

In main we can now directly use the methods of ChainError<T> without downcasting the error first.

-

Also a nice match on ChainError<T>.kind() is now possible, which returns &T, meaning +

Also a nice match on ChainError<T>.kind() is now possible, which returns &T, meaning &Func1ErrorKind here.

use chainerror::*;
 use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -8131,7 +772,7 @@ fn func1() -> ChainResult<(), Func1ErrorKind> {
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         match e.kind() {
             Func1ErrorKind::Func2 => eprintln!("Main Error Report: func1 error calling func2"),
@@ -8148,933 +789,12 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
-

Debug for the ErrorKind

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

Debug for the ErrorKind

One small improvement at the end of the tutorial is to fix the debug output of Func1ErrorKind. As you probably noticed, the output doesn't say much of the enum.

Debug Error:
@@ -9095,14 +815,14 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -9137,7 +857,7 @@ fn func1() -> ChainResult<(), Func1ErrorKind> {
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         match e.kind() {
             Func1ErrorKind::Func2 => eprintln!("Main Error Report: func1 error calling func2"),
@@ -9154,933 +874,12 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
-

Deref for the ErrorKind

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

Deref for the ErrorKind

Because ChainError implements Deref to &T, we can also match on *e instead of e.kind() or call a function with &e

use chainerror::*;
@@ -10088,14 +887,14 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -10139,7 +938,7 @@ fn handle_func1errorkind(e: &Func1ErrorKind) {
     }
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         match *e {
             Func1ErrorKind::Func2 => eprintln!("Main Error Report: func1 error calling func2"),
@@ -10158,1890 +957,50 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
-

Writing a library

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

Writing a library

I would advise to only expose an mycrate::ErrorKind and type alias mycrate::Error to ChainError<mycrate::ErrorKind> so you can tell your library users to use the .kind() method as std::io::Error does.

If you later decide to make your own Error implementation, your library users don't have to change much or anything.

-
# #[allow(dead_code)]
-# #[macro_use]
-# pub mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-pub mod mycrate {
+
#[allow(dead_code)]
+#[macro_use]
+pub mod chainerror {
+{{#includecomment ../src/lib.rs}}
+}
+pub mod mycrate {
     use crate::chainerror::*; // omit the `crate::` part
     use std::io;
 
-    fn do_some_io() -> std::result::Result<(), Box<std::error::Error>> {
+    fn do_some_io() -> std::result::Result<(), Box<std::error::Error + Send + Sync>> {
         Err(io::Error::from(io::ErrorKind::NotFound))?;
         Ok(())
     }
 
     derive_str_cherr!(Func2Error);
 
-    fn func2() -> std::result::Result<(), Box<std::error::Error>> {
+    fn func2() -> std::result::Result<(), Box<std::error::Error + Send + Sync>> {
         let filename = "foo.txt";
         do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
         Ok(())
     }
 
-    #[derive(Debug)]
+    #[derive(Debug, Clone)]
     pub enum ErrorKind {
         Func2,
         IO(String),
     }
 
-    pub type Error = ChainError<ErrorKind>;
+    derive_err_kind!(Error, ErrorKind);
+
     pub type Result<T> = std::result::Result<T, Error>;
 
-    impl ::std::fmt::Display for ErrorKind {
-        fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+    impl std::fmt::Display for ErrorKind {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result {
             match self {
                 ErrorKind::Func2 => write!(f, "func1 error calling func2"),
                 ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
@@ -12057,7 +1016,7 @@ pub mod mycrate {
     }
 }
 
-fn main() -> Result<(), Box<std::error::Error>> {
+fn main() -> Result<(), Box<std::error::Error + Send + Sync>> {
     use mycrate::func1;
     use mycrate::ErrorKind;
     use std::error::Error;
@@ -12072,7 +1031,7 @@ fn main() -> Result<(), Box<std::error::Error>> {
         }
 
         eprintln!();
-        let mut s : &Error = &e;
+        let mut s: &Error = &e;
         while let Some(c) = s.source() {
             if let Some(ioerror) = c.downcast_ref::<io::Error>() {
                 eprintln!("caused by: std::io::Error: {}", ioerror);
@@ -12091,7 +1050,228 @@ fn main() -> Result<(), Box<std::error::Error>> {
     Ok(())
 }
 
-

The End

+

Going back to std

+

Not using chainerror and going full std would look like this:

+

Btw, the code size is bigger than using chainerror :-)

+
pub mod mycrate {
+    use std::error::Error as StdError;
+
+    use func2mod::{do_some_io, func2};
+
+    pub mod func2mod {
+        use std::error::Error as StdError;
+        use std::io;
+
+        pub enum ErrorKind {
+            IO(String),
+        }
+
+        impl std::fmt::Display for ErrorKind {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result {
+                match self {
+                    ErrorKind::IO(s) => std::fmt::Display::fmt(s, f),
+                }
+            }
+        }
+
+        impl std::fmt::Debug for ErrorKind {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result {
+                match self {
+                    ErrorKind::IO(s) => std::fmt::Display::fmt(s, f),
+                }
+            }
+        }
+
+        macro_rules! mcherr {
+            ( $k:expr ) => {{
+                |e| {
+                    Error(
+                        $k,
+                        Some(Box::from(e)),
+                        Some(concat!(file!(), ":", line!(), ": ")),
+                    )
+                }
+            }};
+        }
+
+        pub struct Error(
+            ErrorKind,
+            Option<Box<dyn std::error::Error + 'static>>,
+            Option<&'static str>,
+        );
+
+        impl Error {
+            pub fn kind(&self) -> &ErrorKind {
+                &self.0
+            }
+        }
+
+        impl From<ErrorKind> for Error {
+            fn from(e: ErrorKind) -> Self {
+                Error(e, None, None)
+            }
+        }
+
+        impl std::error::Error for Error {
+            fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
+                self.1.as_ref().map(|e| e.as_ref())
+            }
+        }
+
+        impl std::fmt::Display for Error {
+            fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+                std::fmt::Display::fmt(&self.0, f)
+            }
+        }
+
+        impl std::fmt::Debug for Error {
+            fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+                if let Some(ref o) = self.2 {
+                    std::fmt::Display::fmt(o, f)?;
+                }
+
+                std::fmt::Debug::fmt(&self.0, f)?;
+
+                if let Some(e) = self.source() {
+                    std::fmt::Display::fmt("\nCaused by:\n", f)?;
+                    std::fmt::Debug::fmt(&e, f)?;
+                }
+                Ok(())
+            }
+        }
+
+        pub fn do_some_io() -> std::result::Result<(), Box<dyn std::error::Error>> {
+            Err(io::Error::from(io::ErrorKind::NotFound))?;
+            Ok(())
+        }
+
+        pub fn func2() -> std::result::Result<(), Error> {
+            let filename = "foo.txt";
+            do_some_io().map_err(mcherr!(ErrorKind::IO(format!(
+                "Error reading '{}'",
+                filename
+            ))))?;
+            Ok(())
+        }
+    }
+
+    #[derive(Debug)]
+    pub enum ErrorKind {
+        Func2,
+        IO(String),
+    }
+
+    impl std::fmt::Display for ErrorKind {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result {
+            match self {
+                ErrorKind::Func2 => write!(f, "func1 error calling func2"),
+                ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
+            }
+        }
+    }
+
+    macro_rules! mcherr {
+        ( $k:expr ) => {{
+            |e| {
+                Error(
+                    $k,
+                    Some(Box::from(e)),
+                    Some(concat!(file!(), ":", line!(), ": ")),
+                )
+            }
+        }};
+    }
+
+    pub struct Error(
+        ErrorKind,
+        Option<Box<dyn std::error::Error + 'static>>,
+        Option<&'static str>,
+    );
+
+    impl Error {
+        pub fn kind(&self) -> &ErrorKind {
+            &self.0
+        }
+    }
+
+    impl From<ErrorKind> for Error {
+        fn from(e: ErrorKind) -> Self {
+            Error(e, None, None)
+        }
+    }
+
+    impl std::error::Error for Error {
+        fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
+            self.1.as_ref().map(|e| e.as_ref())
+        }
+    }
+
+    impl std::fmt::Display for Error {
+        fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+            std::fmt::Display::fmt(&self.0, f)
+        }
+    }
+
+    impl std::fmt::Debug for Error {
+        fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+            if let Some(ref o) = self.2 {
+                std::fmt::Display::fmt(o, f)?;
+            }
+
+            std::fmt::Debug::fmt(&self.0, f)?;
+            if let Some(e) = self.source() {
+                std::fmt::Display::fmt("\nCaused by:\n", f)?;
+                std::fmt::Debug::fmt(&e, f)?;
+            }
+            Ok(())
+        }
+    }
+
+    pub type Result<T> = std::result::Result<T, Error>;
+
+    pub fn func1() -> Result<()> {
+        func2().map_err(mcherr!(ErrorKind::Func2))?;
+        let filename = String::from("bar.txt");
+        do_some_io().map_err(mcherr!(ErrorKind::IO(filename)))?;
+        Ok(())
+    }
+}
+
+fn main() -> Result<(), Box<std::error::Error + Send + Sync>> {
+    use mycrate::func1;
+    use mycrate::ErrorKind;
+    use std::error::Error;
+    use std::io;
+
+    if let Err(e) = func1() {
+        match e.kind() {
+            ErrorKind::Func2 => eprintln!("Main Error Report: func1 error calling func2"),
+            ErrorKind::IO(ref filename) => {
+                eprintln!("Main Error Report: func1 error reading '{}'", filename)
+            }
+        }
+
+        eprintln!();
+        let mut s: &Error = &e;
+        while let Some(c) = s.source() {
+            if let Some(ioerror) = c.downcast_ref::<io::Error>() {
+                eprintln!("caused by: std::io::Error: {}", ioerror);
+                match ioerror.kind() {
+                    io::ErrorKind::NotFound => eprintln!("of kind: std::io::ErrorKind::NotFound"),
+                    _ => {}
+                }
+            } else {
+                eprintln!("caused by: {}", c);
+            }
+            s = c;
+        }
+
+        eprintln!("\nDebug Error:\n{:?}", e);
+    }
+    Ok(())
+}
+
+

The End

That's it for now…

Happy error handling!

To report issues, submit pull request or for the source code, examples and the book source, visit @@ -12123,6 +1303,14 @@ the Git Repo.

+ + + + + + diff --git a/searchindex.js b/searchindex.js index 056a08d..cbbd5bc 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -window.search = {"doc_urls":["index.html#chainerror","index.html#example","index.html#features","tutorial1.html#simple-string-errors","tutorial2.html#simple-chained-string-errors","tutorial2.html#what-did-we-do-here","tutorial3.html#mapping-errors","tutorial4.html#saving-coding-chars","tutorial5.html#the-source-of-errors","tutorial6.html#downcast-the-errors","tutorial7.html#the-root-cause-of-all-errors","tutorial8.html#finding-an-error-cause","tutorial9.html#selective-error-handling","tutorial10.html#errorkind-to-the-rescue","tutorial11.html#debug-for-the-errorkind","tutorial12.html#deref-for-the-errorkind","tutorial13.html#writing-a-library","end.html#the-end"],"index":{"documentStore":{"docInfo":{"0":{"body":60,"breadcrumbs":1,"title":1},"1":{"body":170,"breadcrumbs":1,"title":1},"10":{"body":1615,"breadcrumbs":3,"title":3},"11":{"body":1582,"breadcrumbs":3,"title":3},"12":{"body":1596,"breadcrumbs":3,"title":3},"13":{"body":1653,"breadcrumbs":2,"title":2},"14":{"body":1659,"breadcrumbs":2,"title":2},"15":{"body":1639,"breadcrumbs":2,"title":2},"16":{"body":1656,"breadcrumbs":2,"title":2},"17":{"body":18,"breadcrumbs":1,"title":1},"2":{"body":20,"breadcrumbs":1,"title":1},"3":{"body":94,"breadcrumbs":3,"title":3},"4":{"body":1553,"breadcrumbs":4,"title":4},"5":{"body":44,"breadcrumbs":1,"title":1},"6":{"body":1571,"breadcrumbs":2,"title":2},"7":{"body":1557,"breadcrumbs":3,"title":3},"8":{"body":1570,"breadcrumbs":2,"title":2},"9":{"body":1580,"breadcrumbs":2,"title":2}},"docs":{"0":{"body":"Build Status Crate Rust Documentation chainerror provides an error backtrace like failure without doing a real backtrace, so even after you strip your binaries, you still have the error backtrace. chainerror has no dependencies! chainerror uses .source() of std::error::Error along with line()! and file()! to provide a nice debug error backtrace. It encapsulates all types, which have Display + Debug and can store the error cause internally. Along with the ChainError struct, chainerror comes with some useful helper macros to save a lot of typing. Debug information is worth it! Now continue reading the Tutorial","breadcrumbs":"chainerror","id":"0","title":"chainerror"},"1":{"body":"Output: $ cargo run -q --example example\nMain Error Report: func1 error calling func2 Error reported by Func2Error: func2 error: calling func3 The root cause was: std::io::Error: Kind( NotFound\n) Debug Error:\nexamples/example.rs:45: func1 error calling func2\nCaused by:\nexamples/example.rs:20: Func2Error(func2 error: calling func3)\nCaused by:\nexamples/example.rs:13: Error reading 'foo.txt'\nCaused by:\nKind(NotFound) use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func3() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> ChainResult<(), Func2Error> { func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?; Ok(())\n} enum Func1Error { Func2, IO(String),\n} impl ::std::fmt::Display for Func1Error { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1Error::Func2 => write!(f, \"func1 error calling func2\"), Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1Error { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} fn func1() -> ChainResult<(), Func1Error> { func2().map_err(|e| cherr!(e, Func1Error::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; Ok(())\n} fn main() { if let Err(e) = func1() { match e.kind() { Func1Error::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1Error::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } if let Some(e) = e.root_cause() { let ioerror = e.downcast_ref::().unwrap(); eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror); } eprintln!(\"\\nDebug Error:\\n{:?}\", e); }\n}","breadcrumbs":"Example:","id":"1","title":"Example:"},"10":{"body":"chainerror also has some helper methods: fn is_chain(&self) -> bool\nfn downcast_chain_ref(&self) -> Option<&ChainError>\nfn downcast_chain_mut(&mut self) -> Option<&mut ChainError>\nfn root_cause(&self) -> Option<&(dyn Error + 'static)>\nfn find_cause(&self) -> Option<&U>\nfn find_chain_cause(&self) -> Option<&ChainError>\nfn kind<'a>(&'a self) -> &'a T Using downcast_chain_ref::() gives a ChainError , which can be used to call .find_cause::() . if let Some(s) = e.downcast_chain_ref::() { if let Some(ioerror) = s.find_cause::() { or to use .root_cause() , which of course can be of any type implementing std::error::Error . if let Some(e) = s.root_cause() { use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"Error: {}\", e); if let Some(s) = e.downcast_chain_ref::() { if let Some(ioerror) = s.find_cause::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } if let Some(e) = s.root_cause() { let ioerror = e.downcast_ref::().unwrap(); eprintln!(\"The root cause was: std::io::Error: {:#?}\", ioerror); } } } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"The root cause of all Errors","id":"10","title":"The root cause of all Errors"},"11":{"body":"To distinguish the errors occuring in various places, we can define named string errors with the \"new type\" pattern. derive_str_cherr!(Func2Error);\nderive_str_cherr!(Func1Error); Instead of ChainError we now have struct Func1Error(String) and ChainError . In the main function you can see, how we can match the different errors. Also see: if let Some(f2err) = f1err.find_chain_cause::() { as a shortcut to if let Some(f2err) = f1err.find_cause::>() { hiding the ChainError implementation detail. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func1Error); fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { if let Some(f1err) = e.downcast_chain_ref::() { eprintln!(\"Func1Error: {}\", f1err); if let Some(f2err) = f1err.find_cause::>() { eprintln!(\"Func2Error: {}\", f2err); } if let Some(f2err) = f1err.find_chain_cause::() { eprintln!(\"Debug Func2Error:\\n{:?}\", f2err); } } } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Finding an Error cause","id":"11","title":"Finding an Error cause"},"12":{"body":"What about functions returning different Error types? In this example func1() can return either Func1ErrorFunc2 or Func1ErrorIO . We might want to match on func1() with something like: fn main() -> Result<(), Box> { match func1() { Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!(\"Func1ErrorIO:\\n{:?}\", s), Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!(\"Func1ErrorFunc2:\\n{:?}\", s), Ok(_) => {}, } Ok(())\n} but this is not valid rust code, so we end up doing it the hard way. In the next chapter, we will see, how to solve this more elegantly. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func1ErrorFunc2);\nderive_str_cherr!(Func1ErrorIO); fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(Func1ErrorFunc2, \"func1 error calling func2\"))?; let filename = \"bar.txt\"; do_some_io().map_err(mstrerr!(Func1ErrorIO, \"Error reading '{}'\", filename))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { if let Some(s) = e.downcast_ref::>() { eprintln!(\"Func1ErrorIO:\\n{:?}\", s); } if let Some(s) = e.downcast_chain_ref::() { eprintln!(\"Func1ErrorFunc2:\\n{:?}\", s); } } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Selective Error Handling","id":"12","title":"Selective Error Handling"},"13":{"body":"To cope with different kind of errors, we introduce the kind of an error Func1ErrorKind with an enum. Because we derive Debug and implement Display our Func1ErrorKind enum, this enum can be used as a std::error::Error . Not using String errors anymore, the cherr!() macro seen in the beginning of the tutorial has to be used again. Only returning Func1ErrorKind in func1() now let us get rid of Result<(), Box> and we can use ChainResult<(), Func1ErrorKind> . In main we can now directly use the methods of ChainError without downcasting the error first. Also a nice match on ChainError.kind() is now possible, which returns &T , meaning &Func1ErrorKind here. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} #[derive(Debug)]\nenum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n}\nimpl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match e.kind() { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"ErrorKind to the rescue","id":"13","title":"ErrorKind to the rescue"},"14":{"body":"One small improvement at the end of the tutorial is to fix the debug output of Func1ErrorKind . As you probably noticed, the output doesn't say much of the enum. Debug Error:\nsrc/main.rs:35: Func2\n[…] As a lazy shortcut, we implement Debug by calling Display and end up with Debug Error:\nsrc/main.rs:40: func1 error calling func2\n[…} which gives us a lot more detail. To create your own Errors, you might find crates which create enum Display+Debug via derive macros. Also noteworthy is custom_error to define your custom errors, which can then be used with chainerror . use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} enum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} impl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match e.kind() { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Debug for the ErrorKind","id":"14","title":"Debug for the ErrorKind"},"15":{"body":"Because ChainError implements Deref to &T, we can also match on *e instead of e.kind() or call a function with &e use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} enum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} impl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn handle_func1errorkind(e: &Func1ErrorKind) { match e { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } }\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match *e { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } handle_func1errorkind(&e); if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Deref for the ErrorKind","id":"15","title":"Deref for the ErrorKind"},"16":{"body":"I would advise to only expose an mycrate::ErrorKind and type alias mycrate::Error to ChainError so you can tell your library users to use the .kind() method as std::io::Error does. If you later decide to make your own Error implementation, your library users don't have to change much or anything. # #[allow(dead_code)]\n# #[macro_use]\n# pub mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }\npub mod mycrate { use crate::chainerror::*; // omit the `crate::` part use std::io; fn do_some_io() -> std::result::Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } derive_str_cherr!(Func2Error); fn func2() -> std::result::Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(()) } #[derive(Debug)] pub enum ErrorKind { Func2, IO(String), } pub type Error = ChainError; pub type Result = std::result::Result; impl ::std::fmt::Display for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } } } pub fn func1() -> Result<()> { func2().map_err(|e| cherr!(e, ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, ErrorKind::IO(filename)))?; Ok(()) }\n} fn main() -> Result<(), Box> { use mycrate::func1; use mycrate::ErrorKind; use std::error::Error; use std::io; if let Err(e) = func1() { match e.kind() { ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } eprintln!(); let mut s : &Error = &e; while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}","breadcrumbs":"Writing a library","id":"16","title":"Writing a library"},"17":{"body":"That's it for now… Happy error handling! To report issues, submit pull request or for the source code, examples and the book source, visit the Git Repo .","breadcrumbs":"The End","id":"17","title":"The End"},"2":{"body":"no-fileline : completely turn off storing filename and line display-cause : turn on printing a backtrace of the errors in Display no-debug-cause : turn off printing a backtrace of the errors in Debug","breadcrumbs":"Features","id":"2","title":"Features"},"3":{"body":"An easy way of doing error handling in rust is by returning String as a Box . If the rust main function returns an Err() , this Err() will be displayed with std::fmt::Debug . As you can see by running the example (by pressing the \"Play\" button in upper right of the code block), this only prints out the last Error . Error: StringError(\"func1 error\") The next chapters of this tutorial show how chainerror adds more information and improves inspecting the sources of an error. You can also run the tutorial examples in the checked out chainerror git repo . $ cargo run -q --example tutorial1 use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { if let Err(_) = do_some_io() { Err(\"func2 error\")?; } Ok(())\n} fn func1() -> Result<(), Box> { if let Err(_) = func2() { Err(\"func1 error\")?; } Ok(())\n} fn main() -> Result<(), Box> { func1()\n}","breadcrumbs":"Simple String Errors","id":"3","title":"Simple String Errors"},"4":{"body":"With relatively small changes and the help of the cherr! macro of the chainerror crate the String errors are now chained together. Press the play button in the upper right corner and see the nice debug output. use chainerror::*; use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { if let Err(e) = do_some_io() { Err(cherr!(e, \"func2 error\"))?; } Ok(())\n} fn func1() -> Result<(), Box> { if let Err(e) = func2() { Err(cherr!(e, \"func1 error\"))?; } Ok(())\n} fn main() -> Result<(), Box> { func1()\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Simple Chained String Errors","id":"4","title":"Simple Chained String Errors"},"5":{"body":"if let Err(e) = do_some_io() { Err(cherr!(e, \"func2 error\"))?; } The macro cherr!(olderror, newerror) stores olderror as the source/cause of newerror along with the filename ( file!() ) and line number ( line!() ) and returns newerror . Err()? then returns the inner error applying .into() , so that we again have a Err(Box) as a result. The Debug implementation of ChainError (which is returned by cherr!() ) prints the Debug of T prefixed with the stored filename and line number. ChainError in our case is ChainError .","breadcrumbs":"What did we do here?","id":"5","title":"What did we do here?"},"6":{"body":"Now let's get more rust idiomatic by using .map_err() . use chainerror::*; use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { do_some_io().map_err(|e| cherr!(e, \"func2 error\"))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(|e| cherr!(e, \"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# } If you compare the output to the previous example, you will see, that: Error: src/main.rs:19: \"func1 error\" changed to just: src/main.rs:16: \"func1 error\" This is, because we caught the error of func1() in main() and print it out ourselves. We can now control, whether to output in Debug or Display mode. Maybe depending on --debug as a CLI argument.","breadcrumbs":"Mapping Errors","id":"6","title":"Mapping Errors"},"7":{"body":"Because decorating an error with more information should not let you jump through hoops, chainerror has a quick macro for that. mstrerror!() fits right into .map_err() letting you quickly add more debug strings. mstrerror!() even understands format!() syntax like println!() . use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Saving coding chars","id":"7","title":"Saving coding chars"},"8":{"body":"Sometimes you want to inspect the source() of an Error . chainerror implements std::error::Error::source() , so you can get the cause of an error. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { if let Err(e) = func2() { if let Some(s) = e.source() { eprintln!(\"func2 failed because of '{}'\", s); Err(e).map_err(mstrerr!(\"func1 error\"))?; } } Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# } Note, that because we changed the output of the error in main() from Debug to Display , we don't see the error backtrace with filename and line number. To enable the Display backtrace, you have to enable the feature display-cause for chainerror .","breadcrumbs":"The source() of Errors","id":"8","title":"The source() of Errors"},"9":{"body":"std::error::Error comes with some helper methods to get to the original object of the &(dyn Error + 'static) returned by .source() . pub fn downcast_ref(&self) -> Option<&T>\npub fn downcast_mut(&mut self) -> Option<&mut T> This is how it looks like, when using those: use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"Error: {}\", e); let mut s = e.as_ref(); while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Downcast the Errors","id":"9","title":"Downcast the Errors"}},"length":18,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"_":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}},"o":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"d":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{":":{":":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":14,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"n":{"d":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"g":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}},"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":14,"docs":{"0":{"tf":2.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.8284271247461903},"9":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"z":{"(":{"&":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.0}}},"l":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":14,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.898979485566356},"11":{"tf":4.898979485566356},"12":{"tf":5.0},"13":{"tf":4.898979485566356},"14":{"tf":4.795831523312719},"15":{"tf":4.795831523312719},"16":{"tf":4.47213595499958},"3":{"tf":2.0},"4":{"tf":4.898979485566356},"6":{"tf":4.898979485566356},"7":{"tf":4.898979485566356},"8":{"tf":4.898979485566356},"9":{"tf":4.898979485566356}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.7320508075688772},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"c":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":13,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":3.0},"11":{"tf":2.8284271247461903},"12":{"tf":3.0},"13":{"tf":3.1622776601683795},"14":{"tf":3.4641016151377544},"15":{"tf":3.4641016151377544},"16":{"tf":3.1622776601683795},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"s":{"df":15,"docs":{"0":{"tf":1.0},"1":{"tf":2.23606797749979},"10":{"tf":4.58257569495584},"11":{"tf":4.47213595499958},"12":{"tf":4.358898943540674},"13":{"tf":4.358898943540674},"14":{"tf":4.358898943540674},"15":{"tf":4.358898943540674},"16":{"tf":4.358898943540674},"2":{"tf":1.4142135623730951},"4":{"tf":4.358898943540674},"6":{"tf":4.358898943540674},"7":{"tf":4.358898943540674},"8":{"tf":4.58257569495584},"9":{"tf":4.358898943540674}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"16":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"_":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":2.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"<":{"_":{">":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"$":{"df":0,"docs":{},"k":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}},"t":{">":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":5.0},"11":{"tf":5.0},"12":{"tf":4.898979485566356},"13":{"tf":5.0},"14":{"tf":4.898979485566356},"15":{"tf":4.898979485566356},"16":{"tf":4.898979485566356},"4":{"tf":4.898979485566356},"5":{"tf":1.4142135623730951},"6":{"tf":4.898979485566356},"7":{"tf":4.898979485566356},"8":{"tf":4.898979485566356},"9":{"tf":4.898979485566356}}},"u":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}}},"df":15,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"10":{"tf":3.3166247903554},"11":{"tf":3.1622776601683795},"12":{"tf":3.1622776601683795},"13":{"tf":3.1622776601683795},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.0},"3":{"tf":1.4142135623730951},"4":{"tf":3.3166247903554},"6":{"tf":3.1622776601683795},"7":{"tf":3.3166247903554},"8":{"tf":3.4641016151377544},"9":{"tf":3.1622776601683795}},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":3.0},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.7416573867739413},"14":{"tf":3.7416573867739413},"15":{"tf":3.7416573867739413},"16":{"tf":3.7416573867739413},"4":{"tf":3.4641016151377544},"6":{"tf":3.7416573867739413},"7":{"tf":3.4641016151377544},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"$":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":2.23606797749979},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":3.4641016151377544},"11":{"tf":3.1622776601683795},"12":{"tf":3.1622776601683795},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"4":{"tf":3.1622776601683795},"6":{"tf":3.1622776601683795},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"10":{"tf":4.123105625617661},"11":{"tf":4.123105625617661},"12":{"tf":4.123105625617661},"13":{"tf":4.242640687119285},"14":{"tf":4.69041575982343},"15":{"tf":4.123105625617661},"16":{"tf":4.123105625617661},"2":{"tf":1.4142135623730951},"4":{"tf":4.242640687119285},"5":{"tf":1.4142135623730951},"6":{"tf":4.358898943540674},"7":{"tf":4.242640687119285},"8":{"tf":4.242640687119285},"9":{"tf":4.123105625617661}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.449489742783178},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.8284271247461903},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"+":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":5.916079783099616},"11":{"tf":5.656854249492381},"12":{"tf":5.656854249492381},"13":{"tf":5.744562646538029},"14":{"tf":5.744562646538029},"15":{"tf":5.656854249492381},"16":{"tf":5.656854249492381},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":5.656854249492381},"6":{"tf":5.744562646538029},"7":{"tf":5.656854249492381},"8":{"tf":5.916079783099616},"9":{"tf":5.656854249492381}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"3":{"tf":1.4142135623730951},"4":{"tf":3.0},"5":{"tf":1.0},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":3.0}}}}},"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},":":{"df":0,"docs":{},"i":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.358898943540674},"11":{"tf":4.242640687119285},"12":{"tf":4.242640687119285},"13":{"tf":4.47213595499958},"14":{"tf":4.47213595499958},"15":{"tf":4.898979485566356},"16":{"tf":4.47213595499958},"4":{"tf":4.242640687119285},"6":{"tf":4.358898943540674},"7":{"tf":4.358898943540674},"8":{"tf":4.358898943540674},"9":{"tf":4.358898943540674}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"df":3,"docs":{"12":{"tf":1.0},"14":{"tf":1.4142135623730951},"17":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.8284271247461903},"14":{"tf":2.6457513110645907},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":5,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"2":{"df":1,"docs":{"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":2.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"16":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"2":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"5":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.3166247903554},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.1622776601683795},"5":{"tf":1.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.1622776601683795},"9":{"tf":3.0}},"e":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"3":{"tf":1.4142135623730951},"5":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{":":{"\\":{"df":0,"docs":{},"n":{"df":5,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":18,"docs":{"0":{"tf":2.0},"1":{"tf":3.872983346207417},"10":{"tf":8.54400374531753},"11":{"tf":8.602325267042627},"12":{"tf":8.54400374531753},"13":{"tf":8.888194417315589},"14":{"tf":8.94427190999916},"15":{"tf":8.888194417315589},"16":{"tf":8.888194417315589},"17":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":2.8284271247461903},"4":{"tf":8.48528137423857},"5":{"tf":1.4142135623730951},"6":{"tf":8.660254037844387},"7":{"tf":8.366600265340756},"8":{"tf":8.602325267042627},"9":{"tf":8.54400374531753}},"i":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"<":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":15,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":3.1622776601683795},"11":{"tf":3.1622776601683795},"12":{"tf":3.3166247903554},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"17":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":3.1622776601683795},"6":{"tf":3.3166247903554},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"3":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.7416573867739413},"14":{"tf":3.872983346207417},"15":{"tf":3.872983346207417},"16":{"tf":3.7416573867739413},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.605551275463989}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"5":{"tf":1.0},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"2":{"tf":1.0},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":15,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":4.795831523312719},"11":{"tf":4.795831523312719},"12":{"tf":5.0},"13":{"tf":5.0990195135927845},"14":{"tf":5.0990195135927845},"15":{"tf":5.385164807134504},"16":{"tf":5.196152422706632},"2":{"tf":1.0},"4":{"tf":4.58257569495584},"5":{"tf":1.4142135623730951},"6":{"tf":4.58257569495584},"7":{"tf":4.795831523312719},"8":{"tf":4.898979485566356},"9":{"tf":4.795831523312719}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"|":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":2.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":2.0},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"t":{"df":1,"docs":{"7":{"tf":1.0}}},"x":{"df":1,"docs":{"14":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.1622776601683795},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.1622776601683795},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}}}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}},"n":{"df":14,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":9.486832980505138},"11":{"tf":9.1104335791443},"12":{"tf":9.16515138991168},"13":{"tf":9.16515138991168},"14":{"tf":9.219544457292887},"15":{"tf":9.273618495495704},"16":{"tf":9.16515138991168},"3":{"tf":2.0},"4":{"tf":9.1104335791443},"6":{"tf":9.1104335791443},"7":{"tf":9.1104335791443},"8":{"tf":9.1104335791443},"9":{"tf":9.219544457292887}}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.4641016151377544},"14":{"tf":3.4641016151377544},"15":{"tf":3.4641016151377544},"16":{"tf":3.4641016151377544},"4":{"tf":3.3166247903554},"6":{"tf":3.3166247903554},"7":{"tf":3.4641016151377544},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"a":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"z":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}}}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{":":{"?":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"$":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"c":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":14,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":5.385164807134504},"11":{"tf":5.477225575051661},"12":{"tf":5.744562646538029},"13":{"tf":5.744562646538029},"14":{"tf":5.744562646538029},"15":{"tf":5.830951894845301},"16":{"tf":5.656854249492381},"3":{"tf":1.4142135623730951},"4":{"tf":5.477225575051661},"6":{"tf":5.744562646538029},"7":{"tf":5.385164807134504},"8":{"tf":5.385164807134504},"9":{"tf":5.385164807134504}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":2.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":3.605551275463989},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}}}}}}}}},"2":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":2.8284271247461903},"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.123105625617661},"13":{"tf":4.358898943540674},"14":{"tf":4.58257569495584},"15":{"tf":4.47213595499958},"16":{"tf":4.358898943540674},"3":{"tf":1.4142135623730951},"4":{"tf":4.242640687119285},"5":{"tf":1.0},"6":{"tf":4.123105625617661},"7":{"tf":4.0},"8":{"tf":4.123105625617661},"9":{"tf":4.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"3":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":2.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"15":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"3":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"14":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":1,"docs":{"15":{"tf":1.0}}},"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":2.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.7416573867739413},"11":{"tf":3.7416573867739413},"12":{"tf":3.7416573867739413},"13":{"tf":4.0},"14":{"tf":4.123105625617661},"15":{"tf":4.123105625617661},"16":{"tf":3.872983346207417},"4":{"tf":3.7416573867739413},"6":{"tf":3.7416573867739413},"7":{"tf":3.7416573867739413},"8":{"tf":3.7416573867739413},"9":{"tf":3.7416573867739413}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":13,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"5":{"tf":1.0},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.8284271247461903},"9":{"tf":2.6457513110645907}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"d":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"o":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.23606797749979},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}}}},"s":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"r":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"k":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}}}}},"<":{"'":{"a":{">":{"(":{"&":{"'":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.8284271247461903},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.8284271247461903},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"v":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"6":{"tf":1.0}}},"df":1,"docs":{"7":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}}},"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.6457513110645907},"5":{"tf":1.0},"6":{"tf":2.449489742783178},"7":{"tf":2.6457513110645907},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":14,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.3166247903554},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.4641016151377544},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"4":{"tf":3.3166247903554},"6":{"tf":3.4641016151377544},"7":{"tf":3.3166247903554},"8":{"tf":3.4641016151377544},"9":{"tf":3.3166247903554}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"p":{"(":{"df":0,"docs":{},"|":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.1622776601683795},"13":{"tf":3.3166247903554},"14":{"tf":3.1622776601683795},"15":{"tf":3.4641016151377544},"16":{"tf":3.3166247903554},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":3.0}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.7416573867739413},"14":{"tf":3.872983346207417},"15":{"tf":3.872983346207417},"16":{"tf":3.872983346207417},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.7416573867739413}}}},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.6457513110645907},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.7320508075688772}}}}}}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":6,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"17":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"5":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{".":{"0":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"1":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"(":{"_":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":14,"docs":{"1":{"tf":2.0},"10":{"tf":5.656854249492381},"11":{"tf":5.656854249492381},"12":{"tf":5.744562646538029},"13":{"tf":5.656854249492381},"14":{"tf":5.656854249492381},"15":{"tf":5.656854249492381},"16":{"tf":5.656854249492381},"3":{"tf":1.7320508075688772},"4":{"tf":5.5677643628300215},"6":{"tf":5.656854249492381},"7":{"tf":5.656854249492381},"8":{"tf":5.656854249492381},"9":{"tf":5.656854249492381}}},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"n":{"df":1,"docs":{"14":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"&":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"(":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"t":{"df":13,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"y":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":13,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"b":{"df":12,"docs":{"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.0},"14":{"tf":4.0},"15":{"tf":4.0},"16":{"tf":4.69041575982343},"4":{"tf":4.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.242640687119285}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"q":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}},"e":{"a":{"d":{"df":14,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.123105625617661},"13":{"tf":4.242640687119285},"14":{"tf":4.242640687119285},"15":{"tf":4.358898943540674},"16":{"tf":4.242640687119285},"4":{"tf":3.872983346207417},"6":{"tf":3.872983346207417},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.0}}},"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"l":{"df":1,"docs":{"4":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":2,"docs":{"17":{"tf":1.0},"3":{"tf":1.0}},"r":{"df":0,"docs":{},"t":{"df":14,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.8284271247461903},"16":{"tf":2.23606797749979},"17":{"tf":1.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":15,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":5.196152422706632},"11":{"tf":5.196152422706632},"12":{"tf":5.291502622129181},"13":{"tf":5.196152422706632},"14":{"tf":5.0990195135927845},"15":{"tf":5.0990195135927845},"16":{"tf":5.0},"3":{"tf":2.0},"4":{"tf":5.196152422706632},"5":{"tf":1.0},"6":{"tf":5.196152422706632},"7":{"tf":5.196152422706632},"8":{"tf":5.196152422706632},"9":{"tf":5.196152422706632}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":14,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"3":{"tf":1.4142135623730951},"4":{"tf":2.0},"5":{"tf":1.7320508075688772},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.23606797749979}}}}}}},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"t":{",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":3.1622776601683795},"11":{"tf":3.1622776601683795},"12":{"tf":3.3166247903554},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"3":{"tf":1.4142135623730951},"4":{"tf":3.1622776601683795},"6":{"tf":3.3166247903554},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}}}}}},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.8284271247461903},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.449489742783178},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"e":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}},"f":{".":{"0":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"s":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"u":{">":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"o":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.242640687119285},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.123105625617661},"14":{"tf":4.242640687119285},"15":{"tf":4.242640687119285},"16":{"tf":4.123105625617661},"4":{"tf":4.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.123105625617661}}}},"n":{"d":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"&":{"*":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.8284271247461903},"11":{"tf":2.0},"12":{"tf":2.8284271247461903},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.23606797749979},"9":{"tf":2.0}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":2.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"16":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"/":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"5":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"2":{"0":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"2":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"4":{"7":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"3":{"5":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":6.928203230275509},"11":{"tf":6.6332495807108},"12":{"tf":6.6332495807108},"13":{"tf":6.6332495807108},"14":{"tf":6.6332495807108},"15":{"tf":6.6332495807108},"16":{"tf":6.6332495807108},"4":{"tf":6.6332495807108},"6":{"tf":6.6332495807108},"7":{"tf":6.6332495807108},"8":{"tf":6.6332495807108},"9":{"tf":6.708203932499369}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"d":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":3.7416573867739413},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.872983346207417},"14":{"tf":3.7416573867739413},"15":{"tf":3.7416573867739413},"16":{"tf":3.605551275463989},"3":{"tf":1.0},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.7416573867739413}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}}},"{":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"r":{"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"n":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}}}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":13,"docs":{"10":{"tf":4.123105625617661},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.123105625617661},"14":{"tf":4.0},"15":{"tf":4.123105625617661},"16":{"tf":4.0},"4":{"tf":4.0},"5":{"tf":1.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.123105625617661}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.3166247903554},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.7416573867739413},"4":{"tf":3.3166247903554},"6":{"tf":3.3166247903554},"7":{"tf":3.3166247903554},"8":{"tf":3.3166247903554},"9":{"tf":3.3166247903554}},"i":{"d":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":15,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"10":{"tf":7.0710678118654755},"11":{"tf":6.855654600401044},"12":{"tf":6.855654600401044},"13":{"tf":7.211102550927978},"14":{"tf":6.928203230275509},"15":{"tf":6.855654600401044},"16":{"tf":7.0710678118654755},"3":{"tf":1.7320508075688772},"4":{"tf":6.855654600401044},"6":{"tf":6.928203230275509},"7":{"tf":6.855654600401044},"8":{"tf":6.855654600401044},"9":{"tf":6.928203230275509}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.0}}}},"y":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.872983346207417},"14":{"tf":4.0},"15":{"tf":4.0},"16":{"tf":3.872983346207417},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.605551275463989}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"breadcrumbs":{"root":{"_":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}},"o":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"d":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{":":{":":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":14,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"n":{"d":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"g":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}},"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":14,"docs":{"0":{"tf":2.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.8284271247461903},"9":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"z":{"(":{"&":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.0}}},"l":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":14,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.898979485566356},"11":{"tf":4.898979485566356},"12":{"tf":5.0},"13":{"tf":4.898979485566356},"14":{"tf":4.795831523312719},"15":{"tf":4.795831523312719},"16":{"tf":4.47213595499958},"3":{"tf":2.0},"4":{"tf":4.898979485566356},"6":{"tf":4.898979485566356},"7":{"tf":4.898979485566356},"8":{"tf":4.898979485566356},"9":{"tf":4.898979485566356}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.7320508075688772},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"c":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":13,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":3.0},"11":{"tf":2.8284271247461903},"12":{"tf":3.0},"13":{"tf":3.1622776601683795},"14":{"tf":3.4641016151377544},"15":{"tf":3.4641016151377544},"16":{"tf":3.1622776601683795},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"s":{"df":15,"docs":{"0":{"tf":1.0},"1":{"tf":2.23606797749979},"10":{"tf":4.69041575982343},"11":{"tf":4.58257569495584},"12":{"tf":4.358898943540674},"13":{"tf":4.358898943540674},"14":{"tf":4.358898943540674},"15":{"tf":4.358898943540674},"16":{"tf":4.358898943540674},"2":{"tf":1.4142135623730951},"4":{"tf":4.358898943540674},"6":{"tf":4.358898943540674},"7":{"tf":4.358898943540674},"8":{"tf":4.58257569495584},"9":{"tf":4.358898943540674}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"16":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"_":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":2.23606797749979},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"<":{"_":{">":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"$":{"df":0,"docs":{},"k":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}},"t":{">":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":5.0},"11":{"tf":5.0},"12":{"tf":4.898979485566356},"13":{"tf":5.0},"14":{"tf":4.898979485566356},"15":{"tf":4.898979485566356},"16":{"tf":4.898979485566356},"4":{"tf":4.898979485566356},"5":{"tf":1.4142135623730951},"6":{"tf":4.898979485566356},"7":{"tf":4.898979485566356},"8":{"tf":4.898979485566356},"9":{"tf":4.898979485566356}}},"u":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}}},"df":15,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.0},"10":{"tf":3.3166247903554},"11":{"tf":3.1622776601683795},"12":{"tf":3.1622776601683795},"13":{"tf":3.1622776601683795},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.0},"3":{"tf":1.4142135623730951},"4":{"tf":3.3166247903554},"6":{"tf":3.1622776601683795},"7":{"tf":3.3166247903554},"8":{"tf":3.4641016151377544},"9":{"tf":3.1622776601683795}},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":3.0},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.7416573867739413},"14":{"tf":3.7416573867739413},"15":{"tf":3.7416573867739413},"16":{"tf":3.7416573867739413},"4":{"tf":3.4641016151377544},"6":{"tf":3.7416573867739413},"7":{"tf":3.4641016151377544},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"$":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":2.23606797749979},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":3.4641016151377544},"11":{"tf":3.1622776601683795},"12":{"tf":3.1622776601683795},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"4":{"tf":3.1622776601683795},"6":{"tf":3.1622776601683795},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"10":{"tf":4.123105625617661},"11":{"tf":4.123105625617661},"12":{"tf":4.123105625617661},"13":{"tf":4.242640687119285},"14":{"tf":4.795831523312719},"15":{"tf":4.123105625617661},"16":{"tf":4.123105625617661},"2":{"tf":1.4142135623730951},"4":{"tf":4.242640687119285},"5":{"tf":1.4142135623730951},"6":{"tf":4.358898943540674},"7":{"tf":4.242640687119285},"8":{"tf":4.242640687119285},"9":{"tf":4.123105625617661}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.7320508075688772}}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.449489742783178},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.8284271247461903},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"+":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":5.916079783099616},"11":{"tf":5.656854249492381},"12":{"tf":5.656854249492381},"13":{"tf":5.744562646538029},"14":{"tf":5.744562646538029},"15":{"tf":5.656854249492381},"16":{"tf":5.656854249492381},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":5.656854249492381},"6":{"tf":5.744562646538029},"7":{"tf":5.656854249492381},"8":{"tf":5.916079783099616},"9":{"tf":5.656854249492381}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"3":{"tf":1.4142135623730951},"4":{"tf":3.0},"5":{"tf":1.0},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":3.0}}}}},"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},":":{"df":0,"docs":{},"i":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.358898943540674},"11":{"tf":4.242640687119285},"12":{"tf":4.242640687119285},"13":{"tf":4.47213595499958},"14":{"tf":4.47213595499958},"15":{"tf":4.898979485566356},"16":{"tf":4.47213595499958},"4":{"tf":4.242640687119285},"6":{"tf":4.358898943540674},"7":{"tf":4.358898943540674},"8":{"tf":4.358898943540674},"9":{"tf":4.358898943540674}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"df":3,"docs":{"12":{"tf":1.0},"14":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.8284271247461903},"14":{"tf":2.6457513110645907},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":5,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"2":{"df":1,"docs":{"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":2.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"16":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"2":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"5":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.3166247903554},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.1622776601683795},"5":{"tf":1.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.1622776601683795},"9":{"tf":3.0}},"e":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"3":{"tf":1.4142135623730951},"5":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{":":{"\\":{"df":0,"docs":{},"n":{"df":5,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":18,"docs":{"0":{"tf":2.0},"1":{"tf":3.872983346207417},"10":{"tf":8.602325267042627},"11":{"tf":8.660254037844387},"12":{"tf":8.602325267042627},"13":{"tf":8.888194417315589},"14":{"tf":8.94427190999916},"15":{"tf":8.888194417315589},"16":{"tf":8.888194417315589},"17":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":3.0},"4":{"tf":8.54400374531753},"5":{"tf":1.4142135623730951},"6":{"tf":8.717797887081348},"7":{"tf":8.366600265340756},"8":{"tf":8.660254037844387},"9":{"tf":8.602325267042627}},"i":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"<":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":15,"docs":{"1":{"tf":2.0},"10":{"tf":3.1622776601683795},"11":{"tf":3.1622776601683795},"12":{"tf":3.3166247903554},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"17":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":3.1622776601683795},"6":{"tf":3.3166247903554},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"3":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.7416573867739413},"14":{"tf":3.872983346207417},"15":{"tf":3.872983346207417},"16":{"tf":3.7416573867739413},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.605551275463989}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"5":{"tf":1.0},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"2":{"tf":1.0},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":15,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":4.795831523312719},"11":{"tf":4.795831523312719},"12":{"tf":5.0},"13":{"tf":5.0990195135927845},"14":{"tf":5.0990195135927845},"15":{"tf":5.385164807134504},"16":{"tf":5.196152422706632},"2":{"tf":1.0},"4":{"tf":4.58257569495584},"5":{"tf":1.4142135623730951},"6":{"tf":4.58257569495584},"7":{"tf":4.795831523312719},"8":{"tf":4.898979485566356},"9":{"tf":4.795831523312719}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"|":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":2.23606797749979},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":2.0},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"t":{"df":1,"docs":{"7":{"tf":1.0}}},"x":{"df":1,"docs":{"14":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.1622776601683795},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.1622776601683795},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}}}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}},"n":{"df":14,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":9.486832980505138},"11":{"tf":9.1104335791443},"12":{"tf":9.16515138991168},"13":{"tf":9.16515138991168},"14":{"tf":9.219544457292887},"15":{"tf":9.273618495495704},"16":{"tf":9.16515138991168},"3":{"tf":2.0},"4":{"tf":9.1104335791443},"6":{"tf":9.1104335791443},"7":{"tf":9.1104335791443},"8":{"tf":9.1104335791443},"9":{"tf":9.219544457292887}}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.4641016151377544},"14":{"tf":3.4641016151377544},"15":{"tf":3.4641016151377544},"16":{"tf":3.4641016151377544},"4":{"tf":3.3166247903554},"6":{"tf":3.3166247903554},"7":{"tf":3.4641016151377544},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"a":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"z":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}}}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{":":{"?":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"$":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"c":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":14,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":5.385164807134504},"11":{"tf":5.477225575051661},"12":{"tf":5.744562646538029},"13":{"tf":5.744562646538029},"14":{"tf":5.744562646538029},"15":{"tf":5.830951894845301},"16":{"tf":5.656854249492381},"3":{"tf":1.4142135623730951},"4":{"tf":5.477225575051661},"6":{"tf":5.744562646538029},"7":{"tf":5.385164807134504},"8":{"tf":5.385164807134504},"9":{"tf":5.385164807134504}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":2.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":3.605551275463989},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}}}}}}}}},"2":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":2.8284271247461903},"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.123105625617661},"13":{"tf":4.358898943540674},"14":{"tf":4.58257569495584},"15":{"tf":4.47213595499958},"16":{"tf":4.358898943540674},"3":{"tf":1.4142135623730951},"4":{"tf":4.242640687119285},"5":{"tf":1.0},"6":{"tf":4.123105625617661},"7":{"tf":4.0},"8":{"tf":4.123105625617661},"9":{"tf":4.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"3":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":2.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"15":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"3":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"14":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"17":{"tf":1.0},"3":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":1,"docs":{"15":{"tf":1.0}}},"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":2.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.7416573867739413},"11":{"tf":3.7416573867739413},"12":{"tf":3.7416573867739413},"13":{"tf":4.0},"14":{"tf":4.123105625617661},"15":{"tf":4.123105625617661},"16":{"tf":3.872983346207417},"4":{"tf":3.7416573867739413},"6":{"tf":3.7416573867739413},"7":{"tf":3.7416573867739413},"8":{"tf":3.7416573867739413},"9":{"tf":3.7416573867739413}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":13,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"5":{"tf":1.0},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.8284271247461903},"9":{"tf":2.6457513110645907}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"d":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"o":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.23606797749979},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}}}},"s":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"r":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"k":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}}}}},"<":{"'":{"a":{">":{"(":{"&":{"'":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.8284271247461903},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.8284271247461903},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"v":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"6":{"tf":1.0}}},"df":1,"docs":{"7":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}}},"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.6457513110645907},"5":{"tf":1.0},"6":{"tf":2.449489742783178},"7":{"tf":2.6457513110645907},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":14,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.3166247903554},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.4641016151377544},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"4":{"tf":3.3166247903554},"6":{"tf":3.4641016151377544},"7":{"tf":3.3166247903554},"8":{"tf":3.4641016151377544},"9":{"tf":3.3166247903554}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"p":{"(":{"df":0,"docs":{},"|":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.1622776601683795},"13":{"tf":3.3166247903554},"14":{"tf":3.1622776601683795},"15":{"tf":3.4641016151377544},"16":{"tf":3.3166247903554},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":3.0}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.7416573867739413},"14":{"tf":3.872983346207417},"15":{"tf":3.872983346207417},"16":{"tf":3.872983346207417},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.7416573867739413}}}},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.6457513110645907},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.7320508075688772}}}}}}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":6,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"17":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"5":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{".":{"0":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"1":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"(":{"_":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":14,"docs":{"1":{"tf":2.0},"10":{"tf":5.656854249492381},"11":{"tf":5.656854249492381},"12":{"tf":5.744562646538029},"13":{"tf":5.656854249492381},"14":{"tf":5.656854249492381},"15":{"tf":5.656854249492381},"16":{"tf":5.656854249492381},"3":{"tf":1.7320508075688772},"4":{"tf":5.5677643628300215},"6":{"tf":5.656854249492381},"7":{"tf":5.656854249492381},"8":{"tf":5.656854249492381},"9":{"tf":5.656854249492381}}},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"n":{"df":1,"docs":{"14":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"&":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"(":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"t":{"df":13,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"y":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":13,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"b":{"df":12,"docs":{"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.0},"14":{"tf":4.0},"15":{"tf":4.0},"16":{"tf":4.69041575982343},"4":{"tf":4.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.242640687119285}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"q":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}},"e":{"a":{"d":{"df":14,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.123105625617661},"13":{"tf":4.242640687119285},"14":{"tf":4.242640687119285},"15":{"tf":4.358898943540674},"16":{"tf":4.242640687119285},"4":{"tf":3.872983346207417},"6":{"tf":3.872983346207417},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.0}}},"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"l":{"df":1,"docs":{"4":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":2,"docs":{"17":{"tf":1.0},"3":{"tf":1.0}},"r":{"df":0,"docs":{},"t":{"df":14,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.8284271247461903},"16":{"tf":2.23606797749979},"17":{"tf":1.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":15,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":5.196152422706632},"11":{"tf":5.196152422706632},"12":{"tf":5.291502622129181},"13":{"tf":5.196152422706632},"14":{"tf":5.0990195135927845},"15":{"tf":5.0990195135927845},"16":{"tf":5.0},"3":{"tf":2.0},"4":{"tf":5.196152422706632},"5":{"tf":1.0},"6":{"tf":5.196152422706632},"7":{"tf":5.196152422706632},"8":{"tf":5.196152422706632},"9":{"tf":5.196152422706632}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":14,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"3":{"tf":1.4142135623730951},"4":{"tf":2.0},"5":{"tf":1.7320508075688772},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.23606797749979}}}}}}},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.23606797749979},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"t":{",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":3.1622776601683795},"11":{"tf":3.1622776601683795},"12":{"tf":3.3166247903554},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"3":{"tf":1.4142135623730951},"4":{"tf":3.1622776601683795},"6":{"tf":3.3166247903554},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}}}}}},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.7320508075688772},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.8284271247461903},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.449489742783178},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"e":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"f":{".":{"0":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"s":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"u":{">":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"o":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.242640687119285},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.123105625617661},"14":{"tf":4.242640687119285},"15":{"tf":4.242640687119285},"16":{"tf":4.123105625617661},"4":{"tf":4.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.123105625617661}}}},"n":{"d":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}}}},"z":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"&":{"*":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.8284271247461903},"11":{"tf":2.0},"12":{"tf":2.8284271247461903},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.23606797749979},"9":{"tf":2.0}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":2.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"16":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"/":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"5":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"2":{"0":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"2":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"4":{"7":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"3":{"5":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":6.928203230275509},"11":{"tf":6.6332495807108},"12":{"tf":6.6332495807108},"13":{"tf":6.6332495807108},"14":{"tf":6.6332495807108},"15":{"tf":6.6332495807108},"16":{"tf":6.6332495807108},"4":{"tf":6.6332495807108},"6":{"tf":6.6332495807108},"7":{"tf":6.6332495807108},"8":{"tf":6.6332495807108},"9":{"tf":6.708203932499369}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"d":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":3.7416573867739413},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.872983346207417},"14":{"tf":3.7416573867739413},"15":{"tf":3.7416573867739413},"16":{"tf":3.605551275463989},"3":{"tf":1.0},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.7416573867739413}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}}},"{":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"r":{"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":2.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"n":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}}}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":13,"docs":{"10":{"tf":4.123105625617661},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.123105625617661},"14":{"tf":4.0},"15":{"tf":4.123105625617661},"16":{"tf":4.0},"4":{"tf":4.0},"5":{"tf":1.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.123105625617661}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.3166247903554},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.7416573867739413},"4":{"tf":3.3166247903554},"6":{"tf":3.3166247903554},"7":{"tf":3.3166247903554},"8":{"tf":3.3166247903554},"9":{"tf":3.3166247903554}},"i":{"d":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":15,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"10":{"tf":7.0710678118654755},"11":{"tf":6.855654600401044},"12":{"tf":6.855654600401044},"13":{"tf":7.211102550927978},"14":{"tf":6.928203230275509},"15":{"tf":6.855654600401044},"16":{"tf":7.0710678118654755},"3":{"tf":1.7320508075688772},"4":{"tf":6.855654600401044},"6":{"tf":6.928203230275509},"7":{"tf":6.855654600401044},"8":{"tf":6.855654600401044},"9":{"tf":6.928203230275509}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.0}}}},"y":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.872983346207417},"14":{"tf":4.0},"15":{"tf":4.0},"16":{"tf":3.872983346207417},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.605551275463989}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":2.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"title":{"root":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"10":{"tf":1.0},"11":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}; \ No newline at end of file +Object.assign(window.search, {"doc_urls":["index.html#chainerror","index.html#example","index.html#features","tutorial1.html#simple-string-errors","tutorial2.html#simple-chained-string-errors","tutorial2.html#what-did-we-do-here","tutorial3.html#mapping-errors","tutorial4.html#saving-coding-chars","tutorial5.html#the-source-of-errors","tutorial6.html#downcast-the-errors","tutorial7.html#the-root-cause-of-all-errors","tutorial8.html#finding-an-error-cause","tutorial9.html#selective-error-handling","tutorial10.html#errorkind-to-the-rescue","tutorial11.html#debug-for-the-errorkind","tutorial12.html#deref-for-the-errorkind","tutorial13.html#writing-a-library","tutorial14.html#going-back-to-std","end.html#the-end"],"index":{"documentStore":{"docInfo":{"0":{"body":60,"breadcrumbs":1,"title":1},"1":{"body":174,"breadcrumbs":1,"title":1},"10":{"body":137,"breadcrumbs":3,"title":3},"11":{"body":104,"breadcrumbs":3,"title":3},"12":{"body":120,"breadcrumbs":3,"title":3},"13":{"body":175,"breadcrumbs":2,"title":2},"14":{"body":179,"breadcrumbs":2,"title":2},"15":{"body":159,"breadcrumbs":2,"title":2},"16":{"body":175,"breadcrumbs":2,"title":2},"17":{"body":345,"breadcrumbs":3,"title":3},"18":{"body":18,"breadcrumbs":1,"title":1},"2":{"body":20,"breadcrumbs":1,"title":1},"3":{"body":102,"breadcrumbs":3,"title":3},"4":{"body":75,"breadcrumbs":4,"title":4},"5":{"body":46,"breadcrumbs":1,"title":1},"6":{"body":93,"breadcrumbs":2,"title":2},"7":{"body":79,"breadcrumbs":3,"title":3},"8":{"body":92,"breadcrumbs":2,"title":2},"9":{"body":104,"breadcrumbs":2,"title":2}},"docs":{"0":{"body":"Build Status Crate Rust Documentation chainerror provides an error backtrace like failure without doing a real backtrace, so even after you strip your binaries, you still have the error backtrace. chainerror has no dependencies! chainerror uses .source() of std::error::Error along with line()! and file()! to provide a nice debug error backtrace. It encapsulates all types, which have Display + Debug and can store the error cause internally. Along with the ChainError struct, chainerror comes with some useful helper macros to save a lot of typing. Debug information is worth it! Now continue reading the Tutorial","breadcrumbs":"chainerror","id":"0","title":"chainerror"},"1":{"body":"Output: $ cargo run -q --example example\nMain Error Report: func1 error calling func2 Error reported by Func2Error: func2 error: calling func3 The root cause was: std::io::Error: Kind( NotFound\n) Debug Error:\nexamples/example.rs:45: func1 error calling func2\nCaused by:\nexamples/example.rs:20: Func2Error(func2 error: calling func3)\nCaused by:\nexamples/example.rs:13: Error reading 'foo.txt'\nCaused by:\nKind(NotFound) use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func3() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> ChainResult<(), Func2Error> { func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?; Ok(())\n} enum Func1Error { Func2, IO(String),\n} impl ::std::fmt::Display for Func1Error { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1Error::Func2 => write!(f, \"func1 error calling func2\"), Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1Error { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} fn func1() -> ChainResult<(), Func1Error> { func2().map_err(|e| cherr!(e, Func1Error::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; Ok(())\n} fn main() { if let Err(e) = func1() { match e.kind() { Func1Error::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1Error::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } if let Some(e) = e.root_cause() { let ioerror = e.downcast_ref::().unwrap(); eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror); } eprintln!(\"\\nDebug Error:\\n{:?}\", e); }\n}","breadcrumbs":"Example:","id":"1","title":"Example:"},"10":{"body":"chainerror also has some helper methods: fn is_chain(&self) -> bool\nfn downcast_chain_ref(&self) -> Option<&ChainError>\nfn downcast_chain_mut(&mut self) -> Option<&mut ChainError>\nfn root_cause(&self) -> Option<&(dyn Error + 'static)>\nfn find_cause(&self) -> Option<&U>\nfn find_chain_cause(&self) -> Option<&ChainError>\nfn kind<'a>(&'a self) -> &'a T Using downcast_chain_ref::() gives a ChainError, which can be used to call .find_cause::(). if let Some(s) = e.downcast_chain_ref::() { if let Some(ioerror) = s.find_cause::() { or to use .root_cause(), which of course can be of any type implementing std::error::Error. if let Some(e) = s.root_cause() { use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"Error: {}\", e); if let Some(s) = e.downcast_chain_ref::() { if let Some(ioerror) = s.find_cause::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } if let Some(e) = s.root_cause() { let ioerror = e.downcast_ref::().unwrap(); eprintln!(\"The root cause was: std::io::Error: {:#?}\", ioerror); } } } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"The root cause of all Errors","id":"10","title":"The root cause of all Errors"},"11":{"body":"To distinguish the errors occuring in various places, we can define named string errors with the \"new type\" pattern. derive_str_cherr!(Func2Error);\nderive_str_cherr!(Func1Error); Instead of ChainError we now have struct Func1Error(String) and ChainError. In the main function you can see, how we can match the different errors. Also see: if let Some(f2err) = f1err.find_chain_cause::() { as a shortcut to if let Some(f2err) = f1err.find_cause::>() { hiding the ChainError implementation detail. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func1Error); fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { if let Some(f1err) = e.downcast_chain_ref::() { eprintln!(\"Func1Error: {}\", f1err); if let Some(f2err) = f1err.find_cause::>() { eprintln!(\"Func2Error: {}\", f2err); } if let Some(f2err) = f1err.find_chain_cause::() { eprintln!(\"Debug Func2Error:\\n{:?}\", f2err); } } } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Finding an Error cause","id":"11","title":"Finding an Error cause"},"12":{"body":"What about functions returning different Error types? In this example func1() can return either Func1ErrorFunc2 or Func1ErrorIO. We might want to match on func1() with something like: fn main() -> Result<(), Box> { match func1() { Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!(\"Func1ErrorIO:\\n{:?}\", s), Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!(\"Func1ErrorFunc2:\\n{:?}\", s), Ok(_) => {}, } Ok(())\n} but this is not valid rust code, so we end up doing it the hard way. In the next chapter, we will see, how to solve this more elegantly. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func1ErrorFunc2);\nderive_str_cherr!(Func1ErrorIO); fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(Func1ErrorFunc2, \"func1 error calling func2\"))?; let filename = \"bar.txt\"; do_some_io().map_err(mstrerr!(Func1ErrorIO, \"Error reading '{}'\", filename))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { if let Some(s) = e.downcast_ref::>() { eprintln!(\"Func1ErrorIO:\\n{:?}\", s); } if let Some(s) = e.downcast_chain_ref::() { eprintln!(\"Func1ErrorFunc2:\\n{:?}\", s); } } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Selective Error Handling","id":"12","title":"Selective Error Handling"},"13":{"body":"To cope with different kind of errors, we introduce the kind of an error Func1ErrorKind with an enum. Because we derive Debug and implement Display our Func1ErrorKind enum, this enum can be used as a std::error::Error. Not using String errors anymore, the cherr!() macro seen in the beginning of the tutorial has to be used again. Only returning Func1ErrorKind in func1() now let us get rid of Result<(), Box> and we can use ChainResult<(), Func1ErrorKind>. In main we can now directly use the methods of ChainError without downcasting the error first. Also a nice match on ChainError.kind() is now possible, which returns &T, meaning &Func1ErrorKind here. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} #[derive(Debug)]\nenum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n}\nimpl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match e.kind() { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"ErrorKind to the rescue","id":"13","title":"ErrorKind to the rescue"},"14":{"body":"One small improvement at the end of the tutorial is to fix the debug output of Func1ErrorKind. As you probably noticed, the output doesn't say much of the enum. Debug Error:\nsrc/main.rs:35: Func2\n[…] As a lazy shortcut, we implement Debug by calling Display and end up with Debug Error:\nsrc/main.rs:40: func1 error calling func2\n[…} which gives us a lot more detail. To create your own Errors, you might find crates which create enum Display+Debug via derive macros. Also noteworthy is custom_error to define your custom errors, which can then be used with chainerror. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} enum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} impl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match e.kind() { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Debug for the ErrorKind","id":"14","title":"Debug for the ErrorKind"},"15":{"body":"Because ChainError implements Deref to &T, we can also match on *e instead of e.kind() or call a function with &e use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} enum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} impl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn handle_func1errorkind(e: &Func1ErrorKind) { match e { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } }\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match *e { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } handle_func1errorkind(&e); if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Deref for the ErrorKind","id":"15","title":"Deref for the ErrorKind"},"16":{"body":"I would advise to only expose an mycrate::ErrorKind and type alias mycrate::Error to ChainError so you can tell your library users to use the .kind() method as std::io::Error does. If you later decide to make your own Error implementation, your library users don't have to change much or anything. # #[allow(dead_code)]\n# #[macro_use]\n# pub mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }\npub mod mycrate { use crate::chainerror::*; // omit the `crate::` part use std::io; fn do_some_io() -> std::result::Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } derive_str_cherr!(Func2Error); fn func2() -> std::result::Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(()) } #[derive(Debug, Clone)] pub enum ErrorKind { Func2, IO(String), } derive_err_kind!(Error, ErrorKind); pub type Result = std::result::Result; impl std::fmt::Display for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result { match self { ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } } } pub fn func1() -> Result<()> { func2().map_err(|e| cherr!(e, ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, ErrorKind::IO(filename)))?; Ok(()) }\n} fn main() -> Result<(), Box> { use mycrate::func1; use mycrate::ErrorKind; use std::error::Error; use std::io; if let Err(e) = func1() { match e.kind() { ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } eprintln!(); let mut s: &Error = &e; while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}","breadcrumbs":"Writing a library","id":"16","title":"Writing a library"},"17":{"body":"Not using chainerror and going full std would look like this: Btw, the code size is bigger than using chainerror :-) pub mod mycrate { use std::error::Error as StdError; use func2mod::{do_some_io, func2}; pub mod func2mod { use std::error::Error as StdError; use std::io; pub enum ErrorKind { IO(String), } impl std::fmt::Display for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result { match self { ErrorKind::IO(s) => std::fmt::Display::fmt(s, f), } } } impl std::fmt::Debug for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result { match self { ErrorKind::IO(s) => std::fmt::Display::fmt(s, f), } } } macro_rules! mcherr { ( $k:expr ) => {{ |e| { Error( $k, Some(Box::from(e)), Some(concat!(file!(), \":\", line!(), \": \")), ) } }}; } pub struct Error( ErrorKind, Option>, Option<&'static str>, ); impl Error { pub fn kind(&self) -> &ErrorKind { &self.0 } } impl From for Error { fn from(e: ErrorKind) -> Self { Error(e, None, None) } } impl std::error::Error for Error { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { self.1.as_ref().map(|e| e.as_ref()) } } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { std::fmt::Display::fmt(&self.0, f) } } impl std::fmt::Debug for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { if let Some(ref o) = self.2 { std::fmt::Display::fmt(o, f)?; } std::fmt::Debug::fmt(&self.0, f)?; if let Some(e) = self.source() { std::fmt::Display::fmt(\"\\nCaused by:\\n\", f)?; std::fmt::Debug::fmt(&e, f)?; } Ok(()) } } pub fn do_some_io() -> std::result::Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } pub fn func2() -> std::result::Result<(), Error> { let filename = \"foo.txt\"; do_some_io().map_err(mcherr!(ErrorKind::IO(format!( \"Error reading '{}'\", filename ))))?; Ok(()) } } #[derive(Debug)] pub enum ErrorKind { Func2, IO(String), } impl std::fmt::Display for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result { match self { ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } } } macro_rules! mcherr { ( $k:expr ) => {{ |e| { Error( $k, Some(Box::from(e)), Some(concat!(file!(), \":\", line!(), \": \")), ) } }}; } pub struct Error( ErrorKind, Option>, Option<&'static str>, ); impl Error { pub fn kind(&self) -> &ErrorKind { &self.0 } } impl From for Error { fn from(e: ErrorKind) -> Self { Error(e, None, None) } } impl std::error::Error for Error { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { self.1.as_ref().map(|e| e.as_ref()) } } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { std::fmt::Display::fmt(&self.0, f) } } impl std::fmt::Debug for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { if let Some(ref o) = self.2 { std::fmt::Display::fmt(o, f)?; } std::fmt::Debug::fmt(&self.0, f)?; if let Some(e) = self.source() { std::fmt::Display::fmt(\"\\nCaused by:\\n\", f)?; std::fmt::Debug::fmt(&e, f)?; } Ok(()) } } pub type Result = std::result::Result; pub fn func1() -> Result<()> { func2().map_err(mcherr!(ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(mcherr!(ErrorKind::IO(filename)))?; Ok(()) }\n} fn main() -> Result<(), Box> { use mycrate::func1; use mycrate::ErrorKind; use std::error::Error; use std::io; if let Err(e) = func1() { match e.kind() { ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } eprintln!(); let mut s: &Error = &e; while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}","breadcrumbs":"Going back to std","id":"17","title":"Going back to std"},"18":{"body":"That's it for now… Happy error handling! To report issues, submit pull request or for the source code, examples and the book source, visit the Git Repo .","breadcrumbs":"The End","id":"18","title":"The End"},"2":{"body":"no-fileline : completely turn off storing filename and line display-cause : turn on printing a backtrace of the errors in Display no-debug-cause : turn off printing a backtrace of the errors in Debug","breadcrumbs":"Features","id":"2","title":"Features"},"3":{"body":"An easy way of doing error handling in rust is by returning String as a Box. If the rust main function returns an Err(), this Err() will be displayed with std::fmt::Debug. As you can see by running the example (by pressing the \"Play\" button in upper right of the code block), this only prints out the last Error. Error: StringError(\"func1 error\") The next chapters of this tutorial show how chainerror adds more information and improves inspecting the sources of an error. You can also run the tutorial examples in the checked out chainerror git repo . $ cargo run -q --example tutorial1 use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { if let Err(_) = do_some_io() { Err(\"func2 error\")?; } Ok(())\n} fn func1() -> Result<(), Box> { if let Err(_) = func2() { Err(\"func1 error\")?; } Ok(())\n} fn main() -> Result<(), Box> { func1()\n}","breadcrumbs":"Simple String Errors","id":"3","title":"Simple String Errors"},"4":{"body":"With relatively small changes and the help of the cherr! macro of the chainerror crate the String errors are now chained together. Press the play button in the upper right corner and see the nice debug output. use chainerror::*; use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { if let Err(e) = do_some_io() { Err(cherr!(e, \"func2 error\"))?; } Ok(())\n} fn func1() -> Result<(), Box> { if let Err(e) = func2() { Err(cherr!(e, \"func1 error\"))?; } Ok(())\n} fn main() -> Result<(), Box> { func1()\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Simple Chained String Errors","id":"4","title":"Simple Chained String Errors"},"5":{"body":"if let Err(e) = do_some_io() { Err(cherr!(e, \"func2 error\"))?; } The macro cherr!(olderror, newerror) stores olderror as the source/cause of newerror along with the filename (file!()) and line number (line!()) and returns newerror. Err()? then returns the inner error applying .into(), so that we again have a Err(Box) as a result. The Debug implementation of ChainError (which is returned by cherr!()) prints the Debug of T prefixed with the stored filename and line number. ChainError in our case is ChainError.","breadcrumbs":"What did we do here?","id":"5","title":"What did we do here?"},"6":{"body":"Now let's get more rust idiomatic by using .map_err(). use chainerror::*; use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { do_some_io().map_err(|e| cherr!(e, \"func2 error\"))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(|e| cherr!(e, \"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# } If you compare the output to the previous example, you will see, that: Error: src/main.rs:19: \"func1 error\" changed to just: src/main.rs:16: \"func1 error\" This is, because we caught the error of func1() in main() and print it out ourselves. We can now control, whether to output in Debug or Display mode. Maybe depending on --debug as a CLI argument.","breadcrumbs":"Mapping Errors","id":"6","title":"Mapping Errors"},"7":{"body":"Because decorating an error with more information should not let you jump through hoops, chainerror has a quick macro for that. mstrerror!() fits right into .map_err() letting you quickly add more debug strings. mstrerror!() even understands format!() syntax like println!(). use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Saving coding chars","id":"7","title":"Saving coding chars"},"8":{"body":"Sometimes you want to inspect the source() of an Error. chainerror implements std::error::Error::source(), so you can get the cause of an error. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { if let Err(e) = func2() { if let Some(s) = e.source() { eprintln!(\"func2 failed because of '{}'\", s); Err(e).map_err(mstrerr!(\"func1 error\"))?; } } Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# } Note, that because we changed the output of the error in main() from Debug to Display, we don't see the error backtrace with filename and line number. To enable the Display backtrace, you have to enable the feature display-cause for chainerror.","breadcrumbs":"The source() of Errors","id":"8","title":"The source() of Errors"},"9":{"body":"std::error::Error comes with some helper methods to get to the original object of the &(dyn Error + 'static) returned by .source(). pub fn downcast_ref(&self) -> Option<&T>\npub fn downcast_mut(&mut self) -> Option<&mut T> This is how it looks like, when using those: use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"Error: {}\", e); let mut s : &(dyn Error) = e.as_ref(); while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Downcast the Errors","id":"9","title":"Downcast the Errors"}},"length":19,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"_":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"a":{"d":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.0}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":3,"docs":{"0":{"tf":2.0},"2":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}},"l":{"df":1,"docs":{"10":{"tf":1.0}}}},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"3":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"w":{"df":1,"docs":{"17":{"tf":1.0}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}},"y":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"s":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"2":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}}}},"df":3,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}},"t":{">":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"5":{"tf":1.4142135623730951}}}},"df":16,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"9":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":2.23606797749979},"2":{"tf":1.4142135623730951},"4":{"tf":1.0},"5":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"0":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":3,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"1":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"+":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":3,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"13":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"1":{"tf":1.0},"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":11,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":1.4142135623730951},"17":{"tf":2.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"df":3,"docs":{"12":{"tf":1.0},"14":{"tf":1.4142135623730951},"18":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"2":{"df":1,"docs":{"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"2":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"3":{"tf":1.4142135623730951},"5":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},":":{"\\":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":0,"docs":{}},"df":19,"docs":{"0":{"tf":2.0},"1":{"tf":3.872983346207417},"10":{"tf":2.23606797749979},"11":{"tf":2.449489742783178},"12":{"tf":2.23606797749979},"13":{"tf":3.3166247903554},"14":{"tf":3.4641016151377544},"15":{"tf":3.3166247903554},"16":{"tf":3.1622776601683795},"17":{"tf":4.898979485566356},"18":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":2.8284271247461903},"4":{"tf":2.0},"5":{"tf":1.4142135623730951},"6":{"tf":2.6457513110645907},"7":{"tf":1.4142135623730951},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":2,"docs":{"16":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":3.3166247903554}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.0}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.7320508075688772},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"3":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":4.358898943540674}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"2":{"tf":1.0},"8":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"5":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":14,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":2.0},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.8284271247461903},"16":{"tf":2.449489742783178},"17":{"tf":2.449489742783178},"2":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":1,"docs":{"7":{"tf":1.0}}},"x":{"df":1,"docs":{"14":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":15,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":3.3166247903554},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":2.23606797749979},"17":{"tf":4.123105625617661},"3":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.449489742783178}}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":12,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}},"n":{"c":{"1":{"df":15,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":2.23606797749979},"17":{"tf":2.23606797749979},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":2.449489742783178},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":3,"docs":{"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":3.0},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}}}}}}},"2":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":3,"docs":{"10":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":2.8284271247461903},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.0},"14":{"tf":2.449489742783178},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"17":{"tf":2.23606797749979},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":4,"docs":{"1":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{":":{":":{"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}}}},"3":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":2.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"15":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"14":{"tf":1.0}}}}},"o":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":1,"docs":{"15":{"tf":1.0}}},"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":3.605551275463989}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"5":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"11":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"s":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"k":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"<":{"'":{"a":{">":{"(":{"&":{"'":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"6":{"tf":1.0}}},"df":1,"docs":{"7":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":5,"docs":{"0":{"tf":1.0},"17":{"tf":1.4142135623730951},"2":{"tf":1.0},"5":{"tf":1.7320508075688772},"8":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":2,"docs":{"0":{"tf":1.0},"14":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":6,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":15,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":1,"docs":{"6":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":10,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":2.0},"16":{"tf":1.7320508075688772},"17":{"tf":2.23606797749979},"9":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"d":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":2.8284271247461903},"9":{"tf":1.0}}}},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.7320508075688772}}}}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":2.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":6,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"18":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"5":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"k":{"(":{"_":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":2.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"17":{"tf":2.449489742783178},"3":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"n":{"df":1,"docs":{"14":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"&":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"(":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"t":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"6":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"y":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0}},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"0":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"b":{"df":3,"docs":{"16":{"tf":2.23606797749979},"17":{"tf":3.4641016151377544},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"q":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":13,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}},"r":{"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":2.23606797749979},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.0}}}}},"df":5,"docs":{"12":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":8,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.23606797749979},"9":{"tf":1.0}}}},"n":{"d":{"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":8,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.4142135623730951},"8":{"tf":1.0}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":2.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.4142135623730951},"3":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"/":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"3":{"5":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"10":{"tf":2.0},"17":{"tf":2.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.7320508075688772},"3":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"o":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"2":{"tf":1.0},"5":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":5,"docs":{"11":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"p":{"df":1,"docs":{"0":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"n":{"c":{"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":5,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":6,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"p":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":16,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":3.0},"14":{"tf":2.23606797749979},"15":{"tf":2.0},"16":{"tf":2.6457513110645907},"17":{"tf":3.1622776601683795},"3":{"tf":1.7320508075688772},"4":{"tf":2.0},"6":{"tf":2.23606797749979},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.0}}}},"y":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"13":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":6,"docs":{"1":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"16":{"tf":1.0}}}}}}}}},"breadcrumbs":{"root":{"_":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"a":{"d":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":3,"docs":{"0":{"tf":2.0},"2":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}},"l":{"df":1,"docs":{"10":{"tf":1.0}}}},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"3":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"w":{"df":1,"docs":{"17":{"tf":1.0}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}},"y":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"s":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":2.23606797749979},"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}}}},"df":3,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}},"t":{">":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"5":{"tf":1.4142135623730951}}}},"df":16,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"9":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"4":{"tf":1.0},"5":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"0":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":3,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"1":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"+":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":3,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"13":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"1":{"tf":1.0},"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":11,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":1.4142135623730951},"17":{"tf":2.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"df":3,"docs":{"12":{"tf":1.0},"14":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"2":{"df":1,"docs":{"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"2":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"3":{"tf":1.4142135623730951},"5":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},":":{"\\":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":0,"docs":{}},"df":19,"docs":{"0":{"tf":2.0},"1":{"tf":3.872983346207417},"10":{"tf":2.449489742783178},"11":{"tf":2.6457513110645907},"12":{"tf":2.449489742783178},"13":{"tf":3.3166247903554},"14":{"tf":3.4641016151377544},"15":{"tf":3.3166247903554},"16":{"tf":3.1622776601683795},"17":{"tf":4.898979485566356},"18":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":3.0},"4":{"tf":2.23606797749979},"5":{"tf":1.4142135623730951},"6":{"tf":2.8284271247461903},"7":{"tf":1.4142135623730951},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":2,"docs":{"16":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"17":{"tf":3.3166247903554}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.0}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":2.0},"12":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.7320508075688772},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"3":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":4.358898943540674}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"2":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"5":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":14,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":2.0},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.8284271247461903},"16":{"tf":2.449489742783178},"17":{"tf":2.449489742783178},"2":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"11":{"tf":1.4142135623730951},"14":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":1,"docs":{"7":{"tf":1.0}}},"x":{"df":1,"docs":{"14":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":15,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":3.3166247903554},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":2.23606797749979},"17":{"tf":4.123105625617661},"3":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.449489742783178}}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":12,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}},"n":{"c":{"1":{"df":15,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":2.23606797749979},"17":{"tf":2.23606797749979},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":2.449489742783178},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":3,"docs":{"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":3.0},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}}}}}}},"2":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":3,"docs":{"10":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":2.8284271247461903},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.0},"14":{"tf":2.449489742783178},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"17":{"tf":2.23606797749979},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":4,"docs":{"1":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{":":{":":{"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}}}},"3":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":2.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"15":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"14":{"tf":1.0}}}}},"o":{"df":1,"docs":{"17":{"tf":1.7320508075688772}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"18":{"tf":1.0},"3":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":1,"docs":{"15":{"tf":1.0}}},"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":3.605551275463989}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"5":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"11":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"s":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"k":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"<":{"'":{"a":{">":{"(":{"&":{"'":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"6":{"tf":1.0}}},"df":1,"docs":{"7":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":5,"docs":{"0":{"tf":1.0},"17":{"tf":1.4142135623730951},"2":{"tf":1.0},"5":{"tf":1.7320508075688772},"8":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":2,"docs":{"0":{"tf":1.0},"14":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":6,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":15,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":1,"docs":{"6":{"tf":1.4142135623730951}}},"t":{"c":{"df":0,"docs":{},"h":{"df":10,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":2.0},"16":{"tf":1.7320508075688772},"17":{"tf":2.23606797749979},"9":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"d":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":2.8284271247461903},"9":{"tf":1.0}}}},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.7320508075688772}}}}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":2.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":6,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"18":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"5":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"k":{"(":{"_":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":2.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"17":{"tf":2.449489742783178},"3":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"n":{"df":1,"docs":{"14":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"&":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"(":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"t":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"6":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"y":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0}},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"0":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"b":{"df":3,"docs":{"16":{"tf":2.23606797749979},"17":{"tf":3.4641016151377544},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"q":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":13,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}},"r":{"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":2.23606797749979},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772}}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"df":5,"docs":{"12":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":8,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.23606797749979},"9":{"tf":1.0}}}},"n":{"d":{"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":8,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.4142135623730951},"8":{"tf":1.0}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":2.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.4142135623730951},"3":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"/":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"3":{"5":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"10":{"tf":2.0},"17":{"tf":2.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.7320508075688772},"3":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"o":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"2":{"tf":1.0},"5":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":5,"docs":{"11":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"p":{"df":1,"docs":{"0":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"n":{"c":{"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":5,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":6,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"p":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":16,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":3.0},"14":{"tf":2.23606797749979},"15":{"tf":2.0},"16":{"tf":2.6457513110645907},"17":{"tf":3.1622776601683795},"3":{"tf":1.7320508075688772},"4":{"tf":2.0},"6":{"tf":2.23606797749979},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.0}}}},"y":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"13":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":6,"docs":{"1":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}}}}},"title":{"root":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"10":{"tf":1.0},"11":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"d":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}); \ No newline at end of file diff --git a/searchindex.json b/searchindex.json index 162eca1..04d9a14 100644 --- a/searchindex.json +++ b/searchindex.json @@ -1 +1 @@ -{"doc_urls":["index.html#chainerror","index.html#example","index.html#features","tutorial1.html#simple-string-errors","tutorial2.html#simple-chained-string-errors","tutorial2.html#what-did-we-do-here","tutorial3.html#mapping-errors","tutorial4.html#saving-coding-chars","tutorial5.html#the-source-of-errors","tutorial6.html#downcast-the-errors","tutorial7.html#the-root-cause-of-all-errors","tutorial8.html#finding-an-error-cause","tutorial9.html#selective-error-handling","tutorial10.html#errorkind-to-the-rescue","tutorial11.html#debug-for-the-errorkind","tutorial12.html#deref-for-the-errorkind","tutorial13.html#writing-a-library","end.html#the-end"],"index":{"documentStore":{"docInfo":{"0":{"body":60,"breadcrumbs":1,"title":1},"1":{"body":170,"breadcrumbs":1,"title":1},"10":{"body":1615,"breadcrumbs":3,"title":3},"11":{"body":1582,"breadcrumbs":3,"title":3},"12":{"body":1596,"breadcrumbs":3,"title":3},"13":{"body":1653,"breadcrumbs":2,"title":2},"14":{"body":1659,"breadcrumbs":2,"title":2},"15":{"body":1639,"breadcrumbs":2,"title":2},"16":{"body":1656,"breadcrumbs":2,"title":2},"17":{"body":18,"breadcrumbs":1,"title":1},"2":{"body":20,"breadcrumbs":1,"title":1},"3":{"body":94,"breadcrumbs":3,"title":3},"4":{"body":1553,"breadcrumbs":4,"title":4},"5":{"body":44,"breadcrumbs":1,"title":1},"6":{"body":1571,"breadcrumbs":2,"title":2},"7":{"body":1557,"breadcrumbs":3,"title":3},"8":{"body":1570,"breadcrumbs":2,"title":2},"9":{"body":1580,"breadcrumbs":2,"title":2}},"docs":{"0":{"body":"Build Status Crate Rust Documentation chainerror provides an error backtrace like failure without doing a real backtrace, so even after you strip your binaries, you still have the error backtrace. chainerror has no dependencies! chainerror uses .source() of std::error::Error along with line()! and file()! to provide a nice debug error backtrace. It encapsulates all types, which have Display + Debug and can store the error cause internally. Along with the ChainError struct, chainerror comes with some useful helper macros to save a lot of typing. Debug information is worth it! Now continue reading the Tutorial","breadcrumbs":"chainerror","id":"0","title":"chainerror"},"1":{"body":"Output: $ cargo run -q --example example\nMain Error Report: func1 error calling func2 Error reported by Func2Error: func2 error: calling func3 The root cause was: std::io::Error: Kind( NotFound\n) Debug Error:\nexamples/example.rs:45: func1 error calling func2\nCaused by:\nexamples/example.rs:20: Func2Error(func2 error: calling func3)\nCaused by:\nexamples/example.rs:13: Error reading 'foo.txt'\nCaused by:\nKind(NotFound) use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func3() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> ChainResult<(), Func2Error> { func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?; Ok(())\n} enum Func1Error { Func2, IO(String),\n} impl ::std::fmt::Display for Func1Error { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1Error::Func2 => write!(f, \"func1 error calling func2\"), Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1Error { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} fn func1() -> ChainResult<(), Func1Error> { func2().map_err(|e| cherr!(e, Func1Error::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; Ok(())\n} fn main() { if let Err(e) = func1() { match e.kind() { Func1Error::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1Error::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } if let Some(e) = e.root_cause() { let ioerror = e.downcast_ref::().unwrap(); eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror); } eprintln!(\"\\nDebug Error:\\n{:?}\", e); }\n}","breadcrumbs":"Example:","id":"1","title":"Example:"},"10":{"body":"chainerror also has some helper methods: fn is_chain(&self) -> bool\nfn downcast_chain_ref(&self) -> Option<&ChainError>\nfn downcast_chain_mut(&mut self) -> Option<&mut ChainError>\nfn root_cause(&self) -> Option<&(dyn Error + 'static)>\nfn find_cause(&self) -> Option<&U>\nfn find_chain_cause(&self) -> Option<&ChainError>\nfn kind<'a>(&'a self) -> &'a T Using downcast_chain_ref::() gives a ChainError , which can be used to call .find_cause::() . if let Some(s) = e.downcast_chain_ref::() { if let Some(ioerror) = s.find_cause::() { or to use .root_cause() , which of course can be of any type implementing std::error::Error . if let Some(e) = s.root_cause() { use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"Error: {}\", e); if let Some(s) = e.downcast_chain_ref::() { if let Some(ioerror) = s.find_cause::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } if let Some(e) = s.root_cause() { let ioerror = e.downcast_ref::().unwrap(); eprintln!(\"The root cause was: std::io::Error: {:#?}\", ioerror); } } } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"The root cause of all Errors","id":"10","title":"The root cause of all Errors"},"11":{"body":"To distinguish the errors occuring in various places, we can define named string errors with the \"new type\" pattern. derive_str_cherr!(Func2Error);\nderive_str_cherr!(Func1Error); Instead of ChainError we now have struct Func1Error(String) and ChainError . In the main function you can see, how we can match the different errors. Also see: if let Some(f2err) = f1err.find_chain_cause::() { as a shortcut to if let Some(f2err) = f1err.find_cause::>() { hiding the ChainError implementation detail. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func1Error); fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { if let Some(f1err) = e.downcast_chain_ref::() { eprintln!(\"Func1Error: {}\", f1err); if let Some(f2err) = f1err.find_cause::>() { eprintln!(\"Func2Error: {}\", f2err); } if let Some(f2err) = f1err.find_chain_cause::() { eprintln!(\"Debug Func2Error:\\n{:?}\", f2err); } } } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Finding an Error cause","id":"11","title":"Finding an Error cause"},"12":{"body":"What about functions returning different Error types? In this example func1() can return either Func1ErrorFunc2 or Func1ErrorIO . We might want to match on func1() with something like: fn main() -> Result<(), Box> { match func1() { Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!(\"Func1ErrorIO:\\n{:?}\", s), Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!(\"Func1ErrorFunc2:\\n{:?}\", s), Ok(_) => {}, } Ok(())\n} but this is not valid rust code, so we end up doing it the hard way. In the next chapter, we will see, how to solve this more elegantly. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func1ErrorFunc2);\nderive_str_cherr!(Func1ErrorIO); fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(Func1ErrorFunc2, \"func1 error calling func2\"))?; let filename = \"bar.txt\"; do_some_io().map_err(mstrerr!(Func1ErrorIO, \"Error reading '{}'\", filename))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { if let Some(s) = e.downcast_ref::>() { eprintln!(\"Func1ErrorIO:\\n{:?}\", s); } if let Some(s) = e.downcast_chain_ref::() { eprintln!(\"Func1ErrorFunc2:\\n{:?}\", s); } } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Selective Error Handling","id":"12","title":"Selective Error Handling"},"13":{"body":"To cope with different kind of errors, we introduce the kind of an error Func1ErrorKind with an enum. Because we derive Debug and implement Display our Func1ErrorKind enum, this enum can be used as a std::error::Error . Not using String errors anymore, the cherr!() macro seen in the beginning of the tutorial has to be used again. Only returning Func1ErrorKind in func1() now let us get rid of Result<(), Box> and we can use ChainResult<(), Func1ErrorKind> . In main we can now directly use the methods of ChainError without downcasting the error first. Also a nice match on ChainError.kind() is now possible, which returns &T , meaning &Func1ErrorKind here. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} #[derive(Debug)]\nenum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n}\nimpl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match e.kind() { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"ErrorKind to the rescue","id":"13","title":"ErrorKind to the rescue"},"14":{"body":"One small improvement at the end of the tutorial is to fix the debug output of Func1ErrorKind . As you probably noticed, the output doesn't say much of the enum. Debug Error:\nsrc/main.rs:35: Func2\n[…] As a lazy shortcut, we implement Debug by calling Display and end up with Debug Error:\nsrc/main.rs:40: func1 error calling func2\n[…} which gives us a lot more detail. To create your own Errors, you might find crates which create enum Display+Debug via derive macros. Also noteworthy is custom_error to define your custom errors, which can then be used with chainerror . use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} enum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} impl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match e.kind() { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Debug for the ErrorKind","id":"14","title":"Debug for the ErrorKind"},"15":{"body":"Because ChainError implements Deref to &T, we can also match on *e instead of e.kind() or call a function with &e use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} enum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} impl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn handle_func1errorkind(e: &Func1ErrorKind) { match e { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } }\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match *e { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } handle_func1errorkind(&e); if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Deref for the ErrorKind","id":"15","title":"Deref for the ErrorKind"},"16":{"body":"I would advise to only expose an mycrate::ErrorKind and type alias mycrate::Error to ChainError so you can tell your library users to use the .kind() method as std::io::Error does. If you later decide to make your own Error implementation, your library users don't have to change much or anything. # #[allow(dead_code)]\n# #[macro_use]\n# pub mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }\npub mod mycrate { use crate::chainerror::*; // omit the `crate::` part use std::io; fn do_some_io() -> std::result::Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } derive_str_cherr!(Func2Error); fn func2() -> std::result::Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(()) } #[derive(Debug)] pub enum ErrorKind { Func2, IO(String), } pub type Error = ChainError; pub type Result = std::result::Result; impl ::std::fmt::Display for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } } } pub fn func1() -> Result<()> { func2().map_err(|e| cherr!(e, ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, ErrorKind::IO(filename)))?; Ok(()) }\n} fn main() -> Result<(), Box> { use mycrate::func1; use mycrate::ErrorKind; use std::error::Error; use std::io; if let Err(e) = func1() { match e.kind() { ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } eprintln!(); let mut s : &Error = &e; while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}","breadcrumbs":"Writing a library","id":"16","title":"Writing a library"},"17":{"body":"That's it for now… Happy error handling! To report issues, submit pull request or for the source code, examples and the book source, visit the Git Repo .","breadcrumbs":"The End","id":"17","title":"The End"},"2":{"body":"no-fileline : completely turn off storing filename and line display-cause : turn on printing a backtrace of the errors in Display no-debug-cause : turn off printing a backtrace of the errors in Debug","breadcrumbs":"Features","id":"2","title":"Features"},"3":{"body":"An easy way of doing error handling in rust is by returning String as a Box . If the rust main function returns an Err() , this Err() will be displayed with std::fmt::Debug . As you can see by running the example (by pressing the \"Play\" button in upper right of the code block), this only prints out the last Error . Error: StringError(\"func1 error\") The next chapters of this tutorial show how chainerror adds more information and improves inspecting the sources of an error. You can also run the tutorial examples in the checked out chainerror git repo . $ cargo run -q --example tutorial1 use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { if let Err(_) = do_some_io() { Err(\"func2 error\")?; } Ok(())\n} fn func1() -> Result<(), Box> { if let Err(_) = func2() { Err(\"func1 error\")?; } Ok(())\n} fn main() -> Result<(), Box> { func1()\n}","breadcrumbs":"Simple String Errors","id":"3","title":"Simple String Errors"},"4":{"body":"With relatively small changes and the help of the cherr! macro of the chainerror crate the String errors are now chained together. Press the play button in the upper right corner and see the nice debug output. use chainerror::*; use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { if let Err(e) = do_some_io() { Err(cherr!(e, \"func2 error\"))?; } Ok(())\n} fn func1() -> Result<(), Box> { if let Err(e) = func2() { Err(cherr!(e, \"func1 error\"))?; } Ok(())\n} fn main() -> Result<(), Box> { func1()\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Simple Chained String Errors","id":"4","title":"Simple Chained String Errors"},"5":{"body":"if let Err(e) = do_some_io() { Err(cherr!(e, \"func2 error\"))?; } The macro cherr!(olderror, newerror) stores olderror as the source/cause of newerror along with the filename ( file!() ) and line number ( line!() ) and returns newerror . Err()? then returns the inner error applying .into() , so that we again have a Err(Box) as a result. The Debug implementation of ChainError (which is returned by cherr!() ) prints the Debug of T prefixed with the stored filename and line number. ChainError in our case is ChainError .","breadcrumbs":"What did we do here?","id":"5","title":"What did we do here?"},"6":{"body":"Now let's get more rust idiomatic by using .map_err() . use chainerror::*; use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { do_some_io().map_err(|e| cherr!(e, \"func2 error\"))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(|e| cherr!(e, \"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# } If you compare the output to the previous example, you will see, that: Error: src/main.rs:19: \"func1 error\" changed to just: src/main.rs:16: \"func1 error\" This is, because we caught the error of func1() in main() and print it out ourselves. We can now control, whether to output in Debug or Display mode. Maybe depending on --debug as a CLI argument.","breadcrumbs":"Mapping Errors","id":"6","title":"Mapping Errors"},"7":{"body":"Because decorating an error with more information should not let you jump through hoops, chainerror has a quick macro for that. mstrerror!() fits right into .map_err() letting you quickly add more debug strings. mstrerror!() even understands format!() syntax like println!() . use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{:?}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Saving coding chars","id":"7","title":"Saving coding chars"},"8":{"body":"Sometimes you want to inspect the source() of an Error . chainerror implements std::error::Error::source() , so you can get the cause of an error. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { if let Err(e) = func2() { if let Some(s) = e.source() { eprintln!(\"func2 failed because of '{}'\", s); Err(e).map_err(mstrerr!(\"func1 error\"))?; } } Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{}\", e); } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# } Note, that because we changed the output of the error in main() from Debug to Display , we don't see the error backtrace with filename and line number. To enable the Display backtrace, you have to enable the feature display-cause for chainerror .","breadcrumbs":"The source() of Errors","id":"8","title":"The source() of Errors"},"9":{"body":"std::error::Error comes with some helper methods to get to the original object of the &(dyn Error + 'static) returned by .source() . pub fn downcast_ref(&self) -> Option<&T>\npub fn downcast_mut(&mut self) -> Option<&mut T> This is how it looks like, when using those: use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"Error: {}\", e); let mut s = e.as_ref(); while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } } Ok(())\n} # #[allow(dead_code)]\n# mod chainerror {\n# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your\n# //! binaries, you still have the error backtrace.\n# //!\n# //! `chainerror` has no dependencies!\n# //!\n# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.\n# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.\n# //!\n# //! Along with the `ChainError` struct, `chainerror` comes with some useful helper macros to save a lot of typing.\n# //!\n# //! ## Features\n# //!\n# //! `no-fileline`\n# //! : completely turn off storing filename and line\n# //!\n# //! `display-cause`\n# //! : turn on printing a backtrace of the errors in `Display`\n# //!\n# //! `no-debug-cause`\n# //! : turn off printing a backtrace of the errors in `Debug`\n# //!\n# //!\n# //! # Tutorial\n# //!\n# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)\n# //!\n# //! # Examples\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func2() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func1() -> Result<(), Box> {\n# //! func2().map_err(mstrerr!(\"func1 error\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:20: func1 error\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# //!\n# //!\n# //! ~~~rust\n# //! use chainerror::*;\n# //! use std::error::Error;\n# //! use std::io;\n# //! use std::result::Result;\n# //!\n# //! fn do_some_io() -> Result<(), Box> {\n# //! Err(io::Error::from(io::ErrorKind::NotFound))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn func3() -> Result<(), Box> {\n# //! let filename = \"foo.txt\";\n# //! do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# //! Ok(())\n# //! }\n# //!\n# //! derive_str_cherr!(Func2Error);\n# //!\n# //! fn func2() -> ChainResult<(), Func2Error> {\n# //! func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?;\n# //! Ok(())\n# //! }\n# //!\n# //! enum Func1Error {\n# //! Func2,\n# //! IO(String),\n# //! }\n# //!\n# //! impl ::std::fmt::Display for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! match self {\n# //! Func1Error::Func2 => write!(f, \"func1 error calling func2\"),\n# //! Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# //! }\n# //! }\n# //! }\n# //!\n# //! impl ::std::fmt::Debug for Func1Error {\n# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# //! write!(f, \"{}\", self)\n# //! }\n# //! }\n# //!\n# //! fn func1() -> ChainResult<(), Func1Error> {\n# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?;\n# //! let filename = String::from(\"bar.txt\");\n# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;\n# //! Ok(())\n# //! }\n# //!\n# //! fn main() {\n# //! if let Err(e) = func1() {\n# //! assert!(\n# //! match e.kind() {\n# //! Func1Error::Func2 => {\n# //! eprintln!(\"Main Error Report: func1 error calling func2\");\n# //! true\n# //! }\n# //! Func1Error::IO(filename) => {\n# //! eprintln!(\"Main Error Report: func1 error reading '{}'\", filename);\n# //! false\n# //! }\n# //! }\n# //! );\n# //!\n# //! assert!(e.find_chain_cause::().is_some());\n# //!\n# //! if let Some(e) = e.find_chain_cause::() {\n# //! eprintln!(\"\\nError reported by Func2Error: {}\", e)\n# //! }\n# //!\n# //!\n# //! assert!(e.root_cause().is_some());\n# //!\n# //! if let Some(e) = e.root_cause() {\n# //! let ioerror = e.downcast_ref::().unwrap();\n# //! eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror);\n# //! }\n# //!\n# //! #[cfg(not(windows))]\n# //! assert_eq!(\n# //! format!(\"\\n{:?}\\n\", e), r#\"\n# //! src/lib.rs:47: func1 error calling func2\n# //! Caused by:\n# //! src/lib.rs:22: Func2Error(func2 error: calling func3)\n# //! Caused by:\n# //! src/lib.rs:15: Error reading 'foo.txt'\n# //! Caused by:\n# //! Kind(NotFound)\n# //! \"#\n# //! );\n# //! }\n# //! # else {\n# //! # unreachable!();\n# //! # }\n# //! }\n# //! ~~~\n# # use std::any::TypeId;\n# use std::error::Error;\n# use std::fmt::{Debug, Display, Formatter, Result};\n# # /// chains an inner error kind `T` with a causing error\n# pub struct ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# occurrence: Option<(u32, &'static str)>,\n# kind: T,\n# error_cause: Option>,\n# }\n# # /// convenience type alias\n# pub type ChainResult = std::result::Result>;\n# # impl ChainError {\n# #[cfg(not(feature = \"no-fileline\"))]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self {\n# occurrence,\n# kind,\n# error_cause,\n# }\n# }\n# # #[cfg(feature = \"no-fileline\")]\n# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly\n# pub fn new(\n# kind: T,\n# error_cause: Option>,\n# _occurrence: Option<(u32, &'static str)>,\n# ) -> Self {\n# Self { kind, error_cause }\n# }\n# # /// return the root cause of the error chain, if any exists\n# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {\n# self.iter().last()\n# }\n# # /// Find the first error cause of type U, if any exists\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// if let Some(f1err) = e.downcast_chain_ref::() {\n# ///\n# /// assert!(f1err.find_cause::().is_some());\n# ///\n# /// assert!(f1err.find_chain_cause::().is_some());\n# /// }\n# /// # else {\n# /// # panic!();\n# /// # }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn find_cause(&self) -> Option<&U> {\n# self.iter().filter_map(Error::downcast_ref::).next()\n# }\n# # /// Find the first error cause of type `ChainError`, if any exists\n# ///\n# /// Same as `find_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_cause::();\n# /// ~~~\n# pub fn find_chain_cause(&self) -> Option<&ChainError> {\n# self.iter()\n# .filter_map(Error::downcast_ref::>)\n# .next()\n# }\n# # /// Find the first error cause of type `ChainError` or `U`, if any exists and return `U`\n# ///\n# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError` implementation internals\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust,ignore\n# /// // Instead of writing\n# /// err.find_cause::>();\n# /// // and/or\n# /// err.find_chain_cause::();\n# /// // and/or\n# /// err.find_cause::();\n# ///\n# /// // leave out the ChainError implementation detail\n# /// err.find_chain_or_kind::();\n# /// ~~~\n# pub fn find_kind_or_cause(&self) -> Option<&U> {\n# self.iter()\n# .filter_map(|e| {\n# e.downcast_ref::>()\n# .map(|e| e.kind())\n# .or_else(|| e.downcast_ref::())\n# })\n# .next()\n# }\n# # /// Return a reference to T of `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// fn do_some_io() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// #[derive(Debug)]\n# /// enum Func1ErrorKind {\n# /// Func2,\n# /// IO(String),\n# /// }\n# ///\n# /// /// impl ::std::fmt::Display for Func1ErrorKind {…}\n# /// # impl ::std::fmt::Display for Func1ErrorKind {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"),\n# /// # Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// fn func1() -> ChainResult<(), Func1ErrorKind> {\n# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;\n# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(\"bar.txt\".into())))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn main() {\n# /// if let Err(e) = func1() {\n# /// match e.kind() {\n# /// Func1ErrorKind::Func2 => {},\n# /// Func1ErrorKind::IO(filename) => panic!(),\n# /// }\n# /// }\n# /// # else {\n# /// # unreachable!();\n# /// # }\n# /// }\n# /// ~~~\n# pub fn kind(&self) -> &T {\n# &self.kind\n# }\n# # /// Returns an Iterator over all error causes/sources\n# ///\n# /// # Example\n# ///\n# ///\n# pub fn iter(&self) -> impl Iterator {\n# ErrorIter {\n# current: Some(self),\n# }\n# }\n# }\n# # struct ErrorIter<'a> {\n# current: Option<&'a (dyn Error + 'static)>,\n# }\n# # impl<'a> Iterator for ErrorIter<'a> {\n# type Item = &'a (dyn Error + 'static);\n# # fn next(&mut self) -> Option {\n# let current = self.current;\n# self.current = self.current.and_then(Error::source);\n# current\n# }\n# }\n# # impl std::ops::Deref for ChainError {\n# type Target = T;\n# # fn deref(&self) -> &Self::Target {\n# &self.kind\n# }\n# }\n# # /// Convenience trait to hide the `ChainError` implementation internals\n# pub trait ChainErrorDown {\n# /// Test if of type `ChainError`\n# fn is_chain(&self) -> bool;\n# /// Downcast to a reference of `ChainError`\n# fn downcast_chain_ref(&self) -> Option<&ChainError>;\n# /// Downcast to a mutable reference of `ChainError`\n# fn downcast_chain_mut(&mut self) -> Option<&mut ChainError>;\n# }\n# # impl ChainErrorDown for ChainError {\n# fn is_chain(&self) -> bool {\n# TypeId::of::() == TypeId::of::()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&*(self as *const dyn Error as *const &ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# if self.is_chain::() {\n# #[allow(clippy::cast_ptr_alignment)]\n# unsafe {\n# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError))\n# }\n# } else {\n# None\n# }\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl ChainErrorDown for dyn Error + 'static + Send + Sync {\n# fn is_chain(&self) -> bool {\n# self.is::>()\n# }\n# # fn downcast_chain_ref(&self) -> Option<&ChainError> {\n# self.downcast_ref::>()\n# }\n# # fn downcast_chain_mut(&mut self) -> Option<&mut ChainError> {\n# self.downcast_mut::>()\n# }\n# }\n# # impl Error for ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Error for &mut ChainError {\n# fn source(&self) -> Option<&(dyn Error + 'static)> {\n# self.error_cause.as_ref().map(|e| e.as_ref())\n# }\n# }\n# # impl Display for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# write!(f, \"{}\", self.kind)?;\n# # #[cfg(feature = \"display-cause\")]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Display::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # impl Debug for ChainError {\n# fn fmt(&self, f: &mut Formatter) -> Result {\n# #[cfg(not(feature = \"no-fileline\"))]\n# {\n# if let Some(o) = self.occurrence {\n# write!(f, \"{}:{}: \", o.1, o.0)?;\n# }\n# }\n# # if self.is_chain::() {\n# Display::fmt(&self.kind, f)?;\n# } else {\n# Debug::fmt(&self.kind, f)?;\n# }\n# # #[cfg(not(feature = \"no-debug-cause\"))]\n# {\n# if let Some(e) = self.source() {\n# writeln!(f, \"\\nCaused by:\")?;\n# Debug::fmt(&e, f)?;\n# }\n# }\n# Ok(())\n# }\n# }\n# # pub trait ChainErrorFrom: Sized {\n# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # pub trait IntoChainError: Sized {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError;\n# }\n# # impl IntoChainError for T\n# where\n# U: ChainErrorFrom,\n# {\n# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# U::chain_error_from(self, line_filename)\n# }\n# }\n# # impl ChainErrorFrom for U\n# where\n# T: Into,\n# U: 'static + Display + Debug,\n# {\n# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError {\n# let e: U = t.into();\n# ChainError::<_>::new(e, None, line_filename)\n# }\n# }\n# # #[macro_export]\n# macro_rules! minto_cherr {\n# ( ) => {\n# |e| e.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # #[macro_export]\n# macro_rules! into_cherr {\n# ( $t:expr ) => {\n# $t.into_chain_error(Some((line!(), file!())))\n# };\n# }\n# # /// Creates a new `ChainError`\n# ///\n# /// # Examples\n# ///\n# /// Create a new ChainError, where `FooError` must implement `Display` and `Debug`.\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// #\n# /// # #[derive(Debug)]\n# /// enum FooError {\n# /// Bar,\n# /// Baz(&'static str),\n# /// }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# ///\n# /// // impl ::std::fmt::Display for FooError\n# ///\n# /// fn do_some_stuff() -> bool {\n# /// false\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// if ! do_some_stuff() {\n# /// Err(cherr!(FooError::Baz(\"Error\")))?;\n# /// }\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// Additionally an error cause can be added.\n# ///\n# /// ~~~rust\n# /// # use chainerror::*;\n# /// # use std::io;\n# /// # use std::error::Error;\n# /// #\n# /// # #[derive(Debug)]\n# /// # enum FooError {\n# /// # Bar,\n# /// # Baz(&'static str),\n# /// # }\n# /// #\n# /// # impl ::std::fmt::Display for FooError {\n# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# /// # match self {\n# /// # FooError::Bar => write!(f, \"Bar Error\"),\n# /// # FooError::Baz(s) => write!(f, \"Baz Error: '{}'\", s),\n# /// # }\n# /// # }\n# /// # }\n# /// #\n# /// fn do_some_stuff() -> Result<(), Box> {\n# /// Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func() -> ChainResult<(), FooError> {\n# /// do_some_stuff().map_err(\n# /// |e| cherr!(e, FooError::Baz(\"Error\"))\n# /// )?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # pub fn main() {\n# /// # match func().unwrap_err().kind() {\n# /// # FooError::Baz(s) if s == &\"Error\" => {},\n# /// # _ => panic!(),\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! cherr {\n# ( $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $k:expr ) => ({\n# ChainError::<_>::new($k, None, Some((line!(), file!())))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( None, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!(None, format!($fmt, $($arg)+ ))\n# });\n# ( $e:path, $k:expr ) => ({\n# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))\n# });\n# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($e, format!($fmt, $($arg)+ ))\n# });\n# # }\n# # /// Convenience macro for `|e| cherr!(e, format!(…))`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(\"func1 error\"))?;\n# /// Ok(())\n# /// }\n# ///\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # #[cfg(not(windows))]\n# /// # assert_eq!(\n# /// # format!(\"\\n{:?}\\n\", e), r#\"\n# /// # src/lib.rs:20: func1 error\n# /// # Caused by:\n# /// # src/lib.rs:15: Error reading 'foo.txt'\n# /// # Caused by:\n# /// # Kind(NotFound)\n# /// # \"#\n# /// # );\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# ///\n# /// `mstrerr!()` can also be used to map a new `ChainError`, where T was defined with\n# /// `derive_str_cherr!(T)`\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> Result<(), Box> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! mstrerr {\n# ( $t:path, $msg:expr ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# |e| cherr!(e, $t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# |e| cherr!(e, $t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# |e| cherr!(e, $msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# |e| cherr!(e, format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::result::Result;\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// Err(strerr!(Func2Error, \"Error reading '{}'\", filename))\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! strerr {\n# ( $t:path, $msg:expr ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $msg:expr, ) => ({\n# cherr!($t ($msg.to_string()))\n# });\n# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({\n# cherr!($t (format!($fmt, $($arg)+ )))\n# });\n# ($msg:expr) => ({\n# cherr!($msg.to_string())\n# });\n# ($msg:expr, ) => ({\n# cherr!($msg.to_string())\n# });\n# ($fmt:expr, $($arg:tt)+) => ({\n# cherr!(format!($fmt, $($arg)+ ))\n# });\n# }\n# # /// Convenience macro to create a \"new type\" T(String) and implement Display + Debug for T\n# ///\n# /// # Examples\n# ///\n# /// ~~~rust\n# /// # use crate::chainerror::*;\n# /// # use std::error::Error;\n# /// # use std::io;\n# /// # use std::result::Result;\n# /// #\n# /// # fn do_some_io() -> Result<(), Box> {\n# /// # Err(io::Error::from(io::ErrorKind::NotFound))?;\n# /// # Ok(())\n# /// # }\n# /// #\n# /// derive_str_cherr!(Func2Error);\n# ///\n# /// fn func2() -> ChainResult<(), Func2Error> {\n# /// let filename = \"foo.txt\";\n# /// do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?;\n# /// Ok(())\n# /// }\n# ///\n# /// derive_str_cherr!(Func1Error);\n# ///\n# /// fn func1() -> Result<(), Box> {\n# /// func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?;\n# /// Ok(())\n# /// }\n# /// #\n# /// # fn main() {\n# /// # if let Err(e) = func1() {\n# /// # if let Some(f1err) = e.downcast_chain_ref::() {\n# /// # assert!(f1err.find_cause::>().is_some());\n# /// # assert!(f1err.find_chain_cause::().is_some());\n# /// # } else {\n# /// # panic!();\n# /// # }\n# /// # } else {\n# /// # unreachable!();\n# /// # }\n# /// # }\n# /// ~~~\n# #[macro_export]\n# macro_rules! derive_str_cherr {\n# ($e:ident) => {\n# pub struct $e(pub String);\n# impl ::std::fmt::Display for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}\", self.0)\n# }\n# }\n# impl ::std::fmt::Debug for $e {\n# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {\n# write!(f, \"{}({})\", stringify!($e), self.0)\n# }\n# }\n# impl ::std::error::Error for $e {}\n# };\n# }\n# }","breadcrumbs":"Downcast the Errors","id":"9","title":"Downcast the Errors"}},"length":18,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"_":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}},"o":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"d":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{":":{":":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":14,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"n":{"d":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"g":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}},"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":14,"docs":{"0":{"tf":2.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.8284271247461903},"9":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"z":{"(":{"&":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.0}}},"l":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":14,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.898979485566356},"11":{"tf":4.898979485566356},"12":{"tf":5.0},"13":{"tf":4.898979485566356},"14":{"tf":4.795831523312719},"15":{"tf":4.795831523312719},"16":{"tf":4.47213595499958},"3":{"tf":2.0},"4":{"tf":4.898979485566356},"6":{"tf":4.898979485566356},"7":{"tf":4.898979485566356},"8":{"tf":4.898979485566356},"9":{"tf":4.898979485566356}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.7320508075688772},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"c":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":13,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":3.0},"11":{"tf":2.8284271247461903},"12":{"tf":3.0},"13":{"tf":3.1622776601683795},"14":{"tf":3.4641016151377544},"15":{"tf":3.4641016151377544},"16":{"tf":3.1622776601683795},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"s":{"df":15,"docs":{"0":{"tf":1.0},"1":{"tf":2.23606797749979},"10":{"tf":4.58257569495584},"11":{"tf":4.47213595499958},"12":{"tf":4.358898943540674},"13":{"tf":4.358898943540674},"14":{"tf":4.358898943540674},"15":{"tf":4.358898943540674},"16":{"tf":4.358898943540674},"2":{"tf":1.4142135623730951},"4":{"tf":4.358898943540674},"6":{"tf":4.358898943540674},"7":{"tf":4.358898943540674},"8":{"tf":4.58257569495584},"9":{"tf":4.358898943540674}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"16":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"_":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":2.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"<":{"_":{">":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"$":{"df":0,"docs":{},"k":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}},"t":{">":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":5.0},"11":{"tf":5.0},"12":{"tf":4.898979485566356},"13":{"tf":5.0},"14":{"tf":4.898979485566356},"15":{"tf":4.898979485566356},"16":{"tf":4.898979485566356},"4":{"tf":4.898979485566356},"5":{"tf":1.4142135623730951},"6":{"tf":4.898979485566356},"7":{"tf":4.898979485566356},"8":{"tf":4.898979485566356},"9":{"tf":4.898979485566356}}},"u":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}}},"df":15,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"10":{"tf":3.3166247903554},"11":{"tf":3.1622776601683795},"12":{"tf":3.1622776601683795},"13":{"tf":3.1622776601683795},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.0},"3":{"tf":1.4142135623730951},"4":{"tf":3.3166247903554},"6":{"tf":3.1622776601683795},"7":{"tf":3.3166247903554},"8":{"tf":3.4641016151377544},"9":{"tf":3.1622776601683795}},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":3.0},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.7416573867739413},"14":{"tf":3.7416573867739413},"15":{"tf":3.7416573867739413},"16":{"tf":3.7416573867739413},"4":{"tf":3.4641016151377544},"6":{"tf":3.7416573867739413},"7":{"tf":3.4641016151377544},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"$":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":2.23606797749979},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":3.4641016151377544},"11":{"tf":3.1622776601683795},"12":{"tf":3.1622776601683795},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"4":{"tf":3.1622776601683795},"6":{"tf":3.1622776601683795},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"10":{"tf":4.123105625617661},"11":{"tf":4.123105625617661},"12":{"tf":4.123105625617661},"13":{"tf":4.242640687119285},"14":{"tf":4.69041575982343},"15":{"tf":4.123105625617661},"16":{"tf":4.123105625617661},"2":{"tf":1.4142135623730951},"4":{"tf":4.242640687119285},"5":{"tf":1.4142135623730951},"6":{"tf":4.358898943540674},"7":{"tf":4.242640687119285},"8":{"tf":4.242640687119285},"9":{"tf":4.123105625617661}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.449489742783178},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.8284271247461903},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"+":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":5.916079783099616},"11":{"tf":5.656854249492381},"12":{"tf":5.656854249492381},"13":{"tf":5.744562646538029},"14":{"tf":5.744562646538029},"15":{"tf":5.656854249492381},"16":{"tf":5.656854249492381},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":5.656854249492381},"6":{"tf":5.744562646538029},"7":{"tf":5.656854249492381},"8":{"tf":5.916079783099616},"9":{"tf":5.656854249492381}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"3":{"tf":1.4142135623730951},"4":{"tf":3.0},"5":{"tf":1.0},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":3.0}}}}},"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},":":{"df":0,"docs":{},"i":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.358898943540674},"11":{"tf":4.242640687119285},"12":{"tf":4.242640687119285},"13":{"tf":4.47213595499958},"14":{"tf":4.47213595499958},"15":{"tf":4.898979485566356},"16":{"tf":4.47213595499958},"4":{"tf":4.242640687119285},"6":{"tf":4.358898943540674},"7":{"tf":4.358898943540674},"8":{"tf":4.358898943540674},"9":{"tf":4.358898943540674}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"df":3,"docs":{"12":{"tf":1.0},"14":{"tf":1.4142135623730951},"17":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.8284271247461903},"14":{"tf":2.6457513110645907},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":5,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"2":{"df":1,"docs":{"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":2.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"16":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"2":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"5":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.3166247903554},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.1622776601683795},"5":{"tf":1.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.1622776601683795},"9":{"tf":3.0}},"e":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"3":{"tf":1.4142135623730951},"5":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{":":{"\\":{"df":0,"docs":{},"n":{"df":5,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":18,"docs":{"0":{"tf":2.0},"1":{"tf":3.872983346207417},"10":{"tf":8.54400374531753},"11":{"tf":8.602325267042627},"12":{"tf":8.54400374531753},"13":{"tf":8.888194417315589},"14":{"tf":8.94427190999916},"15":{"tf":8.888194417315589},"16":{"tf":8.888194417315589},"17":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":2.8284271247461903},"4":{"tf":8.48528137423857},"5":{"tf":1.4142135623730951},"6":{"tf":8.660254037844387},"7":{"tf":8.366600265340756},"8":{"tf":8.602325267042627},"9":{"tf":8.54400374531753}},"i":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"<":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":15,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":3.1622776601683795},"11":{"tf":3.1622776601683795},"12":{"tf":3.3166247903554},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"17":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":3.1622776601683795},"6":{"tf":3.3166247903554},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"3":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.7416573867739413},"14":{"tf":3.872983346207417},"15":{"tf":3.872983346207417},"16":{"tf":3.7416573867739413},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.605551275463989}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"5":{"tf":1.0},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"2":{"tf":1.0},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":15,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":4.795831523312719},"11":{"tf":4.795831523312719},"12":{"tf":5.0},"13":{"tf":5.0990195135927845},"14":{"tf":5.0990195135927845},"15":{"tf":5.385164807134504},"16":{"tf":5.196152422706632},"2":{"tf":1.0},"4":{"tf":4.58257569495584},"5":{"tf":1.4142135623730951},"6":{"tf":4.58257569495584},"7":{"tf":4.795831523312719},"8":{"tf":4.898979485566356},"9":{"tf":4.795831523312719}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"|":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":2.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":2.0},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"t":{"df":1,"docs":{"7":{"tf":1.0}}},"x":{"df":1,"docs":{"14":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.1622776601683795},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.1622776601683795},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}}}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}},"n":{"df":14,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":9.486832980505138},"11":{"tf":9.1104335791443},"12":{"tf":9.16515138991168},"13":{"tf":9.16515138991168},"14":{"tf":9.219544457292887},"15":{"tf":9.273618495495704},"16":{"tf":9.16515138991168},"3":{"tf":2.0},"4":{"tf":9.1104335791443},"6":{"tf":9.1104335791443},"7":{"tf":9.1104335791443},"8":{"tf":9.1104335791443},"9":{"tf":9.219544457292887}}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.4641016151377544},"14":{"tf":3.4641016151377544},"15":{"tf":3.4641016151377544},"16":{"tf":3.4641016151377544},"4":{"tf":3.3166247903554},"6":{"tf":3.3166247903554},"7":{"tf":3.4641016151377544},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"a":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"z":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}}}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{":":{"?":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"$":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"c":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":14,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":5.385164807134504},"11":{"tf":5.477225575051661},"12":{"tf":5.744562646538029},"13":{"tf":5.744562646538029},"14":{"tf":5.744562646538029},"15":{"tf":5.830951894845301},"16":{"tf":5.656854249492381},"3":{"tf":1.4142135623730951},"4":{"tf":5.477225575051661},"6":{"tf":5.744562646538029},"7":{"tf":5.385164807134504},"8":{"tf":5.385164807134504},"9":{"tf":5.385164807134504}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":2.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":3.605551275463989},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}}}}}}}}},"2":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":2.8284271247461903},"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.123105625617661},"13":{"tf":4.358898943540674},"14":{"tf":4.58257569495584},"15":{"tf":4.47213595499958},"16":{"tf":4.358898943540674},"3":{"tf":1.4142135623730951},"4":{"tf":4.242640687119285},"5":{"tf":1.0},"6":{"tf":4.123105625617661},"7":{"tf":4.0},"8":{"tf":4.123105625617661},"9":{"tf":4.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"3":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":2.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"15":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"3":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"14":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":1,"docs":{"15":{"tf":1.0}}},"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":2.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.7416573867739413},"11":{"tf":3.7416573867739413},"12":{"tf":3.7416573867739413},"13":{"tf":4.0},"14":{"tf":4.123105625617661},"15":{"tf":4.123105625617661},"16":{"tf":3.872983346207417},"4":{"tf":3.7416573867739413},"6":{"tf":3.7416573867739413},"7":{"tf":3.7416573867739413},"8":{"tf":3.7416573867739413},"9":{"tf":3.7416573867739413}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":13,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"5":{"tf":1.0},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.8284271247461903},"9":{"tf":2.6457513110645907}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"d":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"o":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.23606797749979},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}}}},"s":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"r":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"k":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}}}}},"<":{"'":{"a":{">":{"(":{"&":{"'":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.8284271247461903},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.8284271247461903},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"v":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"6":{"tf":1.0}}},"df":1,"docs":{"7":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}}},"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.6457513110645907},"5":{"tf":1.0},"6":{"tf":2.449489742783178},"7":{"tf":2.6457513110645907},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":14,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.3166247903554},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.4641016151377544},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"4":{"tf":3.3166247903554},"6":{"tf":3.4641016151377544},"7":{"tf":3.3166247903554},"8":{"tf":3.4641016151377544},"9":{"tf":3.3166247903554}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"p":{"(":{"df":0,"docs":{},"|":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.1622776601683795},"13":{"tf":3.3166247903554},"14":{"tf":3.1622776601683795},"15":{"tf":3.4641016151377544},"16":{"tf":3.3166247903554},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":3.0}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.7416573867739413},"14":{"tf":3.872983346207417},"15":{"tf":3.872983346207417},"16":{"tf":3.872983346207417},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.7416573867739413}}}},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.6457513110645907},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.7320508075688772}}}}}}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":6,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"17":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"5":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{".":{"0":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"1":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"(":{"_":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":14,"docs":{"1":{"tf":2.0},"10":{"tf":5.656854249492381},"11":{"tf":5.656854249492381},"12":{"tf":5.744562646538029},"13":{"tf":5.656854249492381},"14":{"tf":5.656854249492381},"15":{"tf":5.656854249492381},"16":{"tf":5.656854249492381},"3":{"tf":1.7320508075688772},"4":{"tf":5.5677643628300215},"6":{"tf":5.656854249492381},"7":{"tf":5.656854249492381},"8":{"tf":5.656854249492381},"9":{"tf":5.656854249492381}}},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"n":{"df":1,"docs":{"14":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"&":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"(":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"t":{"df":13,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"y":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":13,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"b":{"df":12,"docs":{"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.0},"14":{"tf":4.0},"15":{"tf":4.0},"16":{"tf":4.69041575982343},"4":{"tf":4.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.242640687119285}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"q":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}},"e":{"a":{"d":{"df":14,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.123105625617661},"13":{"tf":4.242640687119285},"14":{"tf":4.242640687119285},"15":{"tf":4.358898943540674},"16":{"tf":4.242640687119285},"4":{"tf":3.872983346207417},"6":{"tf":3.872983346207417},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.0}}},"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"l":{"df":1,"docs":{"4":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":2,"docs":{"17":{"tf":1.0},"3":{"tf":1.0}},"r":{"df":0,"docs":{},"t":{"df":14,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.8284271247461903},"16":{"tf":2.23606797749979},"17":{"tf":1.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":15,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":5.196152422706632},"11":{"tf":5.196152422706632},"12":{"tf":5.291502622129181},"13":{"tf":5.196152422706632},"14":{"tf":5.0990195135927845},"15":{"tf":5.0990195135927845},"16":{"tf":5.0},"3":{"tf":2.0},"4":{"tf":5.196152422706632},"5":{"tf":1.0},"6":{"tf":5.196152422706632},"7":{"tf":5.196152422706632},"8":{"tf":5.196152422706632},"9":{"tf":5.196152422706632}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":14,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"3":{"tf":1.4142135623730951},"4":{"tf":2.0},"5":{"tf":1.7320508075688772},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.23606797749979}}}}}}},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"t":{",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":3.1622776601683795},"11":{"tf":3.1622776601683795},"12":{"tf":3.3166247903554},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"3":{"tf":1.4142135623730951},"4":{"tf":3.1622776601683795},"6":{"tf":3.3166247903554},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}}}}}},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.8284271247461903},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.449489742783178},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"e":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}},"f":{".":{"0":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"s":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"u":{">":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"o":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.242640687119285},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.123105625617661},"14":{"tf":4.242640687119285},"15":{"tf":4.242640687119285},"16":{"tf":4.123105625617661},"4":{"tf":4.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.123105625617661}}}},"n":{"d":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"&":{"*":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.8284271247461903},"11":{"tf":2.0},"12":{"tf":2.8284271247461903},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.23606797749979},"9":{"tf":2.0}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":2.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"16":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"/":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"5":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"2":{"0":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"2":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"4":{"7":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"3":{"5":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":6.928203230275509},"11":{"tf":6.6332495807108},"12":{"tf":6.6332495807108},"13":{"tf":6.6332495807108},"14":{"tf":6.6332495807108},"15":{"tf":6.6332495807108},"16":{"tf":6.6332495807108},"4":{"tf":6.6332495807108},"6":{"tf":6.6332495807108},"7":{"tf":6.6332495807108},"8":{"tf":6.6332495807108},"9":{"tf":6.708203932499369}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"d":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":3.7416573867739413},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.872983346207417},"14":{"tf":3.7416573867739413},"15":{"tf":3.7416573867739413},"16":{"tf":3.605551275463989},"3":{"tf":1.0},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.7416573867739413}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}}},"{":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"r":{"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"n":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}}}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":13,"docs":{"10":{"tf":4.123105625617661},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.123105625617661},"14":{"tf":4.0},"15":{"tf":4.123105625617661},"16":{"tf":4.0},"4":{"tf":4.0},"5":{"tf":1.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.123105625617661}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.3166247903554},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.7416573867739413},"4":{"tf":3.3166247903554},"6":{"tf":3.3166247903554},"7":{"tf":3.3166247903554},"8":{"tf":3.3166247903554},"9":{"tf":3.3166247903554}},"i":{"d":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":15,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"10":{"tf":7.0710678118654755},"11":{"tf":6.855654600401044},"12":{"tf":6.855654600401044},"13":{"tf":7.211102550927978},"14":{"tf":6.928203230275509},"15":{"tf":6.855654600401044},"16":{"tf":7.0710678118654755},"3":{"tf":1.7320508075688772},"4":{"tf":6.855654600401044},"6":{"tf":6.928203230275509},"7":{"tf":6.855654600401044},"8":{"tf":6.855654600401044},"9":{"tf":6.928203230275509}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.0}}}},"y":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.872983346207417},"14":{"tf":4.0},"15":{"tf":4.0},"16":{"tf":3.872983346207417},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.605551275463989}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"breadcrumbs":{"root":{"_":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}},"o":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"d":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{":":{":":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":14,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"n":{"d":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"g":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}},"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":14,"docs":{"0":{"tf":2.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.8284271247461903},"9":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"z":{"(":{"&":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.0}}},"l":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":14,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.898979485566356},"11":{"tf":4.898979485566356},"12":{"tf":5.0},"13":{"tf":4.898979485566356},"14":{"tf":4.795831523312719},"15":{"tf":4.795831523312719},"16":{"tf":4.47213595499958},"3":{"tf":2.0},"4":{"tf":4.898979485566356},"6":{"tf":4.898979485566356},"7":{"tf":4.898979485566356},"8":{"tf":4.898979485566356},"9":{"tf":4.898979485566356}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.7320508075688772},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"c":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":13,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":3.0},"11":{"tf":2.8284271247461903},"12":{"tf":3.0},"13":{"tf":3.1622776601683795},"14":{"tf":3.4641016151377544},"15":{"tf":3.4641016151377544},"16":{"tf":3.1622776601683795},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"s":{"df":15,"docs":{"0":{"tf":1.0},"1":{"tf":2.23606797749979},"10":{"tf":4.69041575982343},"11":{"tf":4.58257569495584},"12":{"tf":4.358898943540674},"13":{"tf":4.358898943540674},"14":{"tf":4.358898943540674},"15":{"tf":4.358898943540674},"16":{"tf":4.358898943540674},"2":{"tf":1.4142135623730951},"4":{"tf":4.358898943540674},"6":{"tf":4.358898943540674},"7":{"tf":4.358898943540674},"8":{"tf":4.58257569495584},"9":{"tf":4.358898943540674}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"16":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"_":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":2.23606797749979},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"<":{"_":{">":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"$":{"df":0,"docs":{},"k":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}},"t":{">":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":5.0},"11":{"tf":5.0},"12":{"tf":4.898979485566356},"13":{"tf":5.0},"14":{"tf":4.898979485566356},"15":{"tf":4.898979485566356},"16":{"tf":4.898979485566356},"4":{"tf":4.898979485566356},"5":{"tf":1.4142135623730951},"6":{"tf":4.898979485566356},"7":{"tf":4.898979485566356},"8":{"tf":4.898979485566356},"9":{"tf":4.898979485566356}}},"u":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}}},"df":15,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.0},"10":{"tf":3.3166247903554},"11":{"tf":3.1622776601683795},"12":{"tf":3.1622776601683795},"13":{"tf":3.1622776601683795},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.0},"3":{"tf":1.4142135623730951},"4":{"tf":3.3166247903554},"6":{"tf":3.1622776601683795},"7":{"tf":3.3166247903554},"8":{"tf":3.4641016151377544},"9":{"tf":3.1622776601683795}},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":3.0},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.7416573867739413},"14":{"tf":3.7416573867739413},"15":{"tf":3.7416573867739413},"16":{"tf":3.7416573867739413},"4":{"tf":3.4641016151377544},"6":{"tf":3.7416573867739413},"7":{"tf":3.4641016151377544},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"$":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":2.23606797749979},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":3.4641016151377544},"11":{"tf":3.1622776601683795},"12":{"tf":3.1622776601683795},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"4":{"tf":3.1622776601683795},"6":{"tf":3.1622776601683795},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"10":{"tf":4.123105625617661},"11":{"tf":4.123105625617661},"12":{"tf":4.123105625617661},"13":{"tf":4.242640687119285},"14":{"tf":4.795831523312719},"15":{"tf":4.123105625617661},"16":{"tf":4.123105625617661},"2":{"tf":1.4142135623730951},"4":{"tf":4.242640687119285},"5":{"tf":1.4142135623730951},"6":{"tf":4.358898943540674},"7":{"tf":4.242640687119285},"8":{"tf":4.242640687119285},"9":{"tf":4.123105625617661}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.7320508075688772}}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":2.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.449489742783178},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.8284271247461903},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"+":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":5.916079783099616},"11":{"tf":5.656854249492381},"12":{"tf":5.656854249492381},"13":{"tf":5.744562646538029},"14":{"tf":5.744562646538029},"15":{"tf":5.656854249492381},"16":{"tf":5.656854249492381},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":5.656854249492381},"6":{"tf":5.744562646538029},"7":{"tf":5.656854249492381},"8":{"tf":5.916079783099616},"9":{"tf":5.656854249492381}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"3":{"tf":1.4142135623730951},"4":{"tf":3.0},"5":{"tf":1.0},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":2.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":3.0}}}}},"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},":":{"df":0,"docs":{},"i":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.358898943540674},"11":{"tf":4.242640687119285},"12":{"tf":4.242640687119285},"13":{"tf":4.47213595499958},"14":{"tf":4.47213595499958},"15":{"tf":4.898979485566356},"16":{"tf":4.47213595499958},"4":{"tf":4.242640687119285},"6":{"tf":4.358898943540674},"7":{"tf":4.358898943540674},"8":{"tf":4.358898943540674},"9":{"tf":4.358898943540674}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"df":3,"docs":{"12":{"tf":1.0},"14":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.8284271247461903},"14":{"tf":2.6457513110645907},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":5,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"2":{"df":1,"docs":{"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":2.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"16":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"2":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"5":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.3166247903554},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.1622776601683795},"5":{"tf":1.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.1622776601683795},"9":{"tf":3.0}},"e":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"3":{"tf":1.4142135623730951},"5":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{":":{"\\":{"df":0,"docs":{},"n":{"df":5,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}},"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":18,"docs":{"0":{"tf":2.0},"1":{"tf":3.872983346207417},"10":{"tf":8.602325267042627},"11":{"tf":8.660254037844387},"12":{"tf":8.602325267042627},"13":{"tf":8.888194417315589},"14":{"tf":8.94427190999916},"15":{"tf":8.888194417315589},"16":{"tf":8.888194417315589},"17":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":3.0},"4":{"tf":8.54400374531753},"5":{"tf":1.4142135623730951},"6":{"tf":8.717797887081348},"7":{"tf":8.366600265340756},"8":{"tf":8.660254037844387},"9":{"tf":8.602325267042627}},"i":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"<":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":15,"docs":{"1":{"tf":2.0},"10":{"tf":3.1622776601683795},"11":{"tf":3.1622776601683795},"12":{"tf":3.3166247903554},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"17":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":3.1622776601683795},"6":{"tf":3.3166247903554},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"3":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.7416573867739413},"14":{"tf":3.872983346207417},"15":{"tf":3.872983346207417},"16":{"tf":3.7416573867739413},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.605551275463989}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"5":{"tf":1.0},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"2":{"tf":1.0},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":15,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":4.795831523312719},"11":{"tf":4.795831523312719},"12":{"tf":5.0},"13":{"tf":5.0990195135927845},"14":{"tf":5.0990195135927845},"15":{"tf":5.385164807134504},"16":{"tf":5.196152422706632},"2":{"tf":1.0},"4":{"tf":4.58257569495584},"5":{"tf":1.4142135623730951},"6":{"tf":4.58257569495584},"7":{"tf":4.795831523312719},"8":{"tf":4.898979485566356},"9":{"tf":4.795831523312719}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"|":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":2.23606797749979},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":2.0},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"t":{"df":1,"docs":{"7":{"tf":1.0}}},"x":{"df":1,"docs":{"14":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.1622776601683795},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.1622776601683795},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}}}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}},"n":{"df":14,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":9.486832980505138},"11":{"tf":9.1104335791443},"12":{"tf":9.16515138991168},"13":{"tf":9.16515138991168},"14":{"tf":9.219544457292887},"15":{"tf":9.273618495495704},"16":{"tf":9.16515138991168},"3":{"tf":2.0},"4":{"tf":9.1104335791443},"6":{"tf":9.1104335791443},"7":{"tf":9.1104335791443},"8":{"tf":9.1104335791443},"9":{"tf":9.219544457292887}}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.4641016151377544},"14":{"tf":3.4641016151377544},"15":{"tf":3.4641016151377544},"16":{"tf":3.4641016151377544},"4":{"tf":3.3166247903554},"6":{"tf":3.3166247903554},"7":{"tf":3.4641016151377544},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"b":{"a":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"z":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}}}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{":":{"?":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"$":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"c":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":14,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":5.385164807134504},"11":{"tf":5.477225575051661},"12":{"tf":5.744562646538029},"13":{"tf":5.744562646538029},"14":{"tf":5.744562646538029},"15":{"tf":5.830951894845301},"16":{"tf":5.656854249492381},"3":{"tf":1.4142135623730951},"4":{"tf":5.477225575051661},"6":{"tf":5.744562646538029},"7":{"tf":5.385164807134504},"8":{"tf":5.385164807134504},"9":{"tf":5.385164807134504}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":2.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"\"":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":3.605551275463989},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}}}}}}}}},"2":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":2.8284271247461903},"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.123105625617661},"13":{"tf":4.358898943540674},"14":{"tf":4.58257569495584},"15":{"tf":4.47213595499958},"16":{"tf":4.358898943540674},"3":{"tf":1.4142135623730951},"4":{"tf":4.242640687119285},"5":{"tf":1.0},"6":{"tf":4.123105625617661},"7":{"tf":4.0},"8":{"tf":4.123105625617661},"9":{"tf":4.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}}},"3":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":2.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"15":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"3":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"14":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"17":{"tf":1.0},"3":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":1,"docs":{"15":{"tf":1.0}}},"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":2.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.7416573867739413},"11":{"tf":3.7416573867739413},"12":{"tf":3.7416573867739413},"13":{"tf":4.0},"14":{"tf":4.123105625617661},"15":{"tf":4.123105625617661},"16":{"tf":3.872983346207417},"4":{"tf":3.7416573867739413},"6":{"tf":3.7416573867739413},"7":{"tf":3.7416573867739413},"8":{"tf":3.7416573867739413},"9":{"tf":3.7416573867739413}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":13,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"5":{"tf":1.0},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.8284271247461903},"9":{"tf":2.6457513110645907}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"d":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"o":{"<":{"df":0,"docs":{},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.23606797749979},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}}}},"s":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"r":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"k":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}}}}},"<":{"'":{"a":{">":{"(":{"&":{"'":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.8284271247461903},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.8284271247461903},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"v":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"6":{"tf":1.0}}},"df":1,"docs":{"7":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}},"df":0,"docs":{}}}}}}},"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.6457513110645907},"5":{"tf":1.0},"6":{"tf":2.449489742783178},"7":{"tf":2.6457513110645907},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":14,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.3166247903554},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.4641016151377544},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"4":{"tf":3.3166247903554},"6":{"tf":3.4641016151377544},"7":{"tf":3.3166247903554},"8":{"tf":3.4641016151377544},"9":{"tf":3.3166247903554}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"p":{"(":{"df":0,"docs":{},"|":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.1622776601683795},"13":{"tf":3.3166247903554},"14":{"tf":3.1622776601683795},"15":{"tf":3.4641016151377544},"16":{"tf":3.3166247903554},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":3.0}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.7416573867739413},"14":{"tf":3.872983346207417},"15":{"tf":3.872983346207417},"16":{"tf":3.872983346207417},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.7416573867739413}}}},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.6457513110645907},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.7320508075688772}}}}}}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":6,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"17":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"5":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{".":{"0":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"1":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"(":{"_":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":14,"docs":{"1":{"tf":2.0},"10":{"tf":5.656854249492381},"11":{"tf":5.656854249492381},"12":{"tf":5.744562646538029},"13":{"tf":5.656854249492381},"14":{"tf":5.656854249492381},"15":{"tf":5.656854249492381},"16":{"tf":5.656854249492381},"3":{"tf":1.7320508075688772},"4":{"tf":5.5677643628300215},"6":{"tf":5.656854249492381},"7":{"tf":5.656854249492381},"8":{"tf":5.656854249492381},"9":{"tf":5.656854249492381}}},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"n":{"df":1,"docs":{"14":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"&":{"'":{"a":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"(":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}},"u":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.23606797749979},"4":{"tf":2.23606797749979},"6":{"tf":2.23606797749979},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"t":{"df":13,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":12,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.6457513110645907},"14":{"tf":2.6457513110645907},"15":{"tf":2.6457513110645907},"16":{"tf":2.6457513110645907},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"y":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":13,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"b":{"df":12,"docs":{"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.0},"14":{"tf":4.0},"15":{"tf":4.0},"16":{"tf":4.69041575982343},"4":{"tf":4.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.242640687119285}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"q":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}},"e":{"a":{"d":{"df":14,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":4.0},"11":{"tf":4.0},"12":{"tf":4.123105625617661},"13":{"tf":4.242640687119285},"14":{"tf":4.242640687119285},"15":{"tf":4.358898943540674},"16":{"tf":4.242640687119285},"4":{"tf":3.872983346207417},"6":{"tf":3.872983346207417},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.0}}},"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"l":{"df":1,"docs":{"4":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":2,"docs":{"17":{"tf":1.0},"3":{"tf":1.0}},"r":{"df":0,"docs":{},"t":{"df":14,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.8284271247461903},"16":{"tf":2.23606797749979},"17":{"tf":1.0},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":15,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":5.196152422706632},"11":{"tf":5.196152422706632},"12":{"tf":5.291502622129181},"13":{"tf":5.196152422706632},"14":{"tf":5.0990195135927845},"15":{"tf":5.0990195135927845},"16":{"tf":5.0},"3":{"tf":2.0},"4":{"tf":5.196152422706632},"5":{"tf":1.0},"6":{"tf":5.196152422706632},"7":{"tf":5.196152422706632},"8":{"tf":5.196152422706632},"9":{"tf":5.196152422706632}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":14,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"3":{"tf":1.4142135623730951},"4":{"tf":2.0},"5":{"tf":1.7320508075688772},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.23606797749979}}}}}}},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.23606797749979},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"t":{",":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":3.1622776601683795},"11":{"tf":3.1622776601683795},"12":{"tf":3.3166247903554},"13":{"tf":3.1622776601683795},"14":{"tf":3.1622776601683795},"15":{"tf":3.1622776601683795},"16":{"tf":3.1622776601683795},"3":{"tf":1.4142135623730951},"4":{"tf":3.1622776601683795},"6":{"tf":3.3166247903554},"7":{"tf":3.1622776601683795},"8":{"tf":3.1622776601683795},"9":{"tf":3.1622776601683795}}}}}},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.7320508075688772},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.8284271247461903},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.449489742783178},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"e":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"f":{".":{"0":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"s":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"u":{">":{")":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"o":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},":":{":":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":4.242640687119285},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.123105625617661},"14":{"tf":4.242640687119285},"15":{"tf":4.242640687119285},"16":{"tf":4.123105625617661},"4":{"tf":4.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.123105625617661}}}},"n":{"d":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}}}},"z":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"&":{"*":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":2,"docs":{"16":{"tf":1.0},"9":{"tf":1.0}}},"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.8284271247461903},"11":{"tf":2.0},"12":{"tf":2.8284271247461903},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.23606797749979},"9":{"tf":2.0}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":2.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"16":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"/":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"5":{"df":12,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"2":{"0":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"2":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"4":{"7":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"3":{"5":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":2.23606797749979},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":6.928203230275509},"11":{"tf":6.6332495807108},"12":{"tf":6.6332495807108},"13":{"tf":6.6332495807108},"14":{"tf":6.6332495807108},"15":{"tf":6.6332495807108},"16":{"tf":6.6332495807108},"4":{"tf":6.6332495807108},"6":{"tf":6.6332495807108},"7":{"tf":6.6332495807108},"8":{"tf":6.6332495807108},"9":{"tf":6.708203932499369}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"d":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":3.7416573867739413},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.872983346207417},"14":{"tf":3.7416573867739413},"15":{"tf":3.7416573867739413},"16":{"tf":3.605551275463989},"3":{"tf":1.0},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.7416573867739413}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.6457513110645907},"11":{"tf":2.6457513110645907},"12":{"tf":2.6457513110645907},"13":{"tf":2.8284271247461903},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":2.8284271247461903},"4":{"tf":2.6457513110645907},"6":{"tf":2.6457513110645907},"7":{"tf":2.6457513110645907},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}}}}}}}},"{":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":14,"docs":{"1":{"tf":1.0},"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":15,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"r":{"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":2.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"p":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":2.23606797749979},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"n":{"c":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}}}}},".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":2.449489742783178},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178},"16":{"tf":2.449489742783178},"4":{"tf":2.449489742783178},"6":{"tf":2.449489742783178},"7":{"tf":2.449489742783178},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":13,"docs":{"10":{"tf":4.123105625617661},"11":{"tf":4.0},"12":{"tf":4.0},"13":{"tf":4.123105625617661},"14":{"tf":4.0},"15":{"tf":4.123105625617661},"16":{"tf":4.0},"4":{"tf":4.0},"5":{"tf":1.0},"6":{"tf":4.0},"7":{"tf":4.0},"8":{"tf":4.0},"9":{"tf":4.123105625617661}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":14,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":13,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":3.4641016151377544},"11":{"tf":3.4641016151377544},"12":{"tf":3.4641016151377544},"13":{"tf":3.3166247903554},"14":{"tf":3.3166247903554},"15":{"tf":3.3166247903554},"16":{"tf":3.7416573867739413},"4":{"tf":3.3166247903554},"6":{"tf":3.3166247903554},"7":{"tf":3.3166247903554},"8":{"tf":3.3166247903554},"9":{"tf":3.3166247903554}},"i":{"d":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"u":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":3.0},"11":{"tf":3.0},"12":{"tf":3.0},"13":{"tf":3.0},"14":{"tf":3.0},"15":{"tf":3.0},"16":{"tf":3.0},"4":{"tf":3.0},"6":{"tf":3.0},"7":{"tf":3.0},"8":{"tf":3.0},"9":{"tf":3.0}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":12,"docs":{"10":{"tf":2.8284271247461903},"11":{"tf":2.8284271247461903},"12":{"tf":2.8284271247461903},"13":{"tf":2.8284271247461903},"14":{"tf":2.8284271247461903},"15":{"tf":2.8284271247461903},"16":{"tf":2.8284271247461903},"4":{"tf":2.8284271247461903},"6":{"tf":2.8284271247461903},"7":{"tf":2.8284271247461903},"8":{"tf":2.8284271247461903},"9":{"tf":2.8284271247461903}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":15,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"10":{"tf":7.0710678118654755},"11":{"tf":6.855654600401044},"12":{"tf":6.855654600401044},"13":{"tf":7.211102550927978},"14":{"tf":6.928203230275509},"15":{"tf":6.855654600401044},"16":{"tf":7.0710678118654755},"3":{"tf":1.7320508075688772},"4":{"tf":6.855654600401044},"6":{"tf":6.928203230275509},"7":{"tf":6.855654600401044},"8":{"tf":6.855654600401044},"9":{"tf":6.928203230275509}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.0}}}},"y":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":13,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":3.605551275463989},"11":{"tf":3.605551275463989},"12":{"tf":3.605551275463989},"13":{"tf":3.872983346207417},"14":{"tf":4.0},"15":{"tf":4.0},"16":{"tf":3.872983346207417},"4":{"tf":3.605551275463989},"6":{"tf":3.605551275463989},"7":{"tf":3.605551275463989},"8":{"tf":3.605551275463989},"9":{"tf":3.605551275463989}}}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":2.0},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"df":0,"docs":{},"f":{"df":12,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"title":{"root":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"10":{"tf":1.0},"11":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}} \ No newline at end of file +{"doc_urls":["index.html#chainerror","index.html#example","index.html#features","tutorial1.html#simple-string-errors","tutorial2.html#simple-chained-string-errors","tutorial2.html#what-did-we-do-here","tutorial3.html#mapping-errors","tutorial4.html#saving-coding-chars","tutorial5.html#the-source-of-errors","tutorial6.html#downcast-the-errors","tutorial7.html#the-root-cause-of-all-errors","tutorial8.html#finding-an-error-cause","tutorial9.html#selective-error-handling","tutorial10.html#errorkind-to-the-rescue","tutorial11.html#debug-for-the-errorkind","tutorial12.html#deref-for-the-errorkind","tutorial13.html#writing-a-library","tutorial14.html#going-back-to-std","end.html#the-end"],"index":{"documentStore":{"docInfo":{"0":{"body":60,"breadcrumbs":1,"title":1},"1":{"body":174,"breadcrumbs":1,"title":1},"10":{"body":137,"breadcrumbs":3,"title":3},"11":{"body":104,"breadcrumbs":3,"title":3},"12":{"body":120,"breadcrumbs":3,"title":3},"13":{"body":175,"breadcrumbs":2,"title":2},"14":{"body":179,"breadcrumbs":2,"title":2},"15":{"body":159,"breadcrumbs":2,"title":2},"16":{"body":175,"breadcrumbs":2,"title":2},"17":{"body":345,"breadcrumbs":3,"title":3},"18":{"body":18,"breadcrumbs":1,"title":1},"2":{"body":20,"breadcrumbs":1,"title":1},"3":{"body":102,"breadcrumbs":3,"title":3},"4":{"body":75,"breadcrumbs":4,"title":4},"5":{"body":46,"breadcrumbs":1,"title":1},"6":{"body":93,"breadcrumbs":2,"title":2},"7":{"body":79,"breadcrumbs":3,"title":3},"8":{"body":92,"breadcrumbs":2,"title":2},"9":{"body":104,"breadcrumbs":2,"title":2}},"docs":{"0":{"body":"Build Status Crate Rust Documentation chainerror provides an error backtrace like failure without doing a real backtrace, so even after you strip your binaries, you still have the error backtrace. chainerror has no dependencies! chainerror uses .source() of std::error::Error along with line()! and file()! to provide a nice debug error backtrace. It encapsulates all types, which have Display + Debug and can store the error cause internally. Along with the ChainError struct, chainerror comes with some useful helper macros to save a lot of typing. Debug information is worth it! Now continue reading the Tutorial","breadcrumbs":"chainerror","id":"0","title":"chainerror"},"1":{"body":"Output: $ cargo run -q --example example\nMain Error Report: func1 error calling func2 Error reported by Func2Error: func2 error: calling func3 The root cause was: std::io::Error: Kind( NotFound\n) Debug Error:\nexamples/example.rs:45: func1 error calling func2\nCaused by:\nexamples/example.rs:20: Func2Error(func2 error: calling func3)\nCaused by:\nexamples/example.rs:13: Error reading 'foo.txt'\nCaused by:\nKind(NotFound) use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func3() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> ChainResult<(), Func2Error> { func3().map_err(mstrerr!(Func2Error, \"func2 error: calling func3\"))?; Ok(())\n} enum Func1Error { Func2, IO(String),\n} impl ::std::fmt::Display for Func1Error { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1Error::Func2 => write!(f, \"func1 error calling func2\"), Func1Error::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1Error { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} fn func1() -> ChainResult<(), Func1Error> { func2().map_err(|e| cherr!(e, Func1Error::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; Ok(())\n} fn main() { if let Err(e) = func1() { match e.kind() { Func1Error::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1Error::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } if let Some(e) = e.root_cause() { let ioerror = e.downcast_ref::().unwrap(); eprintln!(\"\\nThe root cause was: std::io::Error: {:#?}\", ioerror); } eprintln!(\"\\nDebug Error:\\n{:?}\", e); }\n}","breadcrumbs":"Example:","id":"1","title":"Example:"},"10":{"body":"chainerror also has some helper methods: fn is_chain(&self) -> bool\nfn downcast_chain_ref(&self) -> Option<&ChainError>\nfn downcast_chain_mut(&mut self) -> Option<&mut ChainError>\nfn root_cause(&self) -> Option<&(dyn Error + 'static)>\nfn find_cause(&self) -> Option<&U>\nfn find_chain_cause(&self) -> Option<&ChainError>\nfn kind<'a>(&'a self) -> &'a T Using downcast_chain_ref::() gives a ChainError, which can be used to call .find_cause::(). if let Some(s) = e.downcast_chain_ref::() { if let Some(ioerror) = s.find_cause::() { or to use .root_cause(), which of course can be of any type implementing std::error::Error. if let Some(e) = s.root_cause() { use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"Error: {}\", e); if let Some(s) = e.downcast_chain_ref::() { if let Some(ioerror) = s.find_cause::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } if let Some(e) = s.root_cause() { let ioerror = e.downcast_ref::().unwrap(); eprintln!(\"The root cause was: std::io::Error: {:#?}\", ioerror); } } } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"The root cause of all Errors","id":"10","title":"The root cause of all Errors"},"11":{"body":"To distinguish the errors occuring in various places, we can define named string errors with the \"new type\" pattern. derive_str_cherr!(Func2Error);\nderive_str_cherr!(Func1Error); Instead of ChainError we now have struct Func1Error(String) and ChainError. In the main function you can see, how we can match the different errors. Also see: if let Some(f2err) = f1err.find_chain_cause::() { as a shortcut to if let Some(f2err) = f1err.find_cause::>() { hiding the ChainError implementation detail. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func1Error); fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(Func1Error, \"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { if let Some(f1err) = e.downcast_chain_ref::() { eprintln!(\"Func1Error: {}\", f1err); if let Some(f2err) = f1err.find_cause::>() { eprintln!(\"Func2Error: {}\", f2err); } if let Some(f2err) = f1err.find_chain_cause::() { eprintln!(\"Debug Func2Error:\\n{:?}\", f2err); } } } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Finding an Error cause","id":"11","title":"Finding an Error cause"},"12":{"body":"What about functions returning different Error types? In this example func1() can return either Func1ErrorFunc2 or Func1ErrorIO. We might want to match on func1() with something like: fn main() -> Result<(), Box> { match func1() { Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!(\"Func1ErrorIO:\\n{:?}\", s), Err(e) if let Some(s) = e.downcast_chain_ref::() => eprintln!(\"Func1ErrorFunc2:\\n{:?}\", s), Ok(_) => {}, } Ok(())\n} but this is not valid rust code, so we end up doing it the hard way. In the next chapter, we will see, how to solve this more elegantly. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} derive_str_cherr!(Func1ErrorFunc2);\nderive_str_cherr!(Func1ErrorIO); fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(Func1ErrorFunc2, \"func1 error calling func2\"))?; let filename = \"bar.txt\"; do_some_io().map_err(mstrerr!(Func1ErrorIO, \"Error reading '{}'\", filename))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { if let Some(s) = e.downcast_ref::>() { eprintln!(\"Func1ErrorIO:\\n{:?}\", s); } if let Some(s) = e.downcast_chain_ref::() { eprintln!(\"Func1ErrorFunc2:\\n{:?}\", s); } } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Selective Error Handling","id":"12","title":"Selective Error Handling"},"13":{"body":"To cope with different kind of errors, we introduce the kind of an error Func1ErrorKind with an enum. Because we derive Debug and implement Display our Func1ErrorKind enum, this enum can be used as a std::error::Error. Not using String errors anymore, the cherr!() macro seen in the beginning of the tutorial has to be used again. Only returning Func1ErrorKind in func1() now let us get rid of Result<(), Box> and we can use ChainResult<(), Func1ErrorKind>. In main we can now directly use the methods of ChainError without downcasting the error first. Also a nice match on ChainError.kind() is now possible, which returns &T, meaning &Func1ErrorKind here. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} #[derive(Debug)]\nenum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n}\nimpl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match e.kind() { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"ErrorKind to the rescue","id":"13","title":"ErrorKind to the rescue"},"14":{"body":"One small improvement at the end of the tutorial is to fix the debug output of Func1ErrorKind. As you probably noticed, the output doesn't say much of the enum. Debug Error:\nsrc/main.rs:35: Func2\n[…] As a lazy shortcut, we implement Debug by calling Display and end up with Debug Error:\nsrc/main.rs:40: func1 error calling func2\n[…} which gives us a lot more detail. To create your own Errors, you might find crates which create enum Display+Debug via derive macros. Also noteworthy is custom_error to define your custom errors, which can then be used with chainerror. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} enum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} impl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match e.kind() { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Debug for the ErrorKind","id":"14","title":"Debug for the ErrorKind"},"15":{"body":"Because ChainError implements Deref to &T, we can also match on *e instead of e.kind() or call a function with &e use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} derive_str_cherr!(Func2Error); fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(())\n} enum Func1ErrorKind { Func2, IO(String),\n} impl ::std::fmt::Display for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match self { Func1ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), Func1ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } }\n} impl ::std::fmt::Debug for Func1ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, \"{}\", self) }\n} impl ::std::error::Error for Func1ErrorKind {} fn func1() -> ChainResult<(), Func1ErrorKind> { func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO(filename)))?; Ok(())\n} fn handle_func1errorkind(e: &Func1ErrorKind) { match e { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } }\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { match *e { Func1ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), Func1ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } handle_func1errorkind(&e); if let Some(e) = e.find_chain_cause::() { eprintln!(\"\\nError reported by Func2Error: {}\", e) } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Deref for the ErrorKind","id":"15","title":"Deref for the ErrorKind"},"16":{"body":"I would advise to only expose an mycrate::ErrorKind and type alias mycrate::Error to ChainError so you can tell your library users to use the .kind() method as std::io::Error does. If you later decide to make your own Error implementation, your library users don't have to change much or anything. # #[allow(dead_code)]\n# #[macro_use]\n# pub mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }\npub mod mycrate { use crate::chainerror::*; // omit the `crate::` part use std::io; fn do_some_io() -> std::result::Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } derive_str_cherr!(Func2Error); fn func2() -> std::result::Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(Func2Error, \"Error reading '{}'\", filename))?; Ok(()) } #[derive(Debug, Clone)] pub enum ErrorKind { Func2, IO(String), } derive_err_kind!(Error, ErrorKind); pub type Result = std::result::Result; impl std::fmt::Display for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result { match self { ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } } } pub fn func1() -> Result<()> { func2().map_err(|e| cherr!(e, ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(|e| cherr!(e, ErrorKind::IO(filename)))?; Ok(()) }\n} fn main() -> Result<(), Box> { use mycrate::func1; use mycrate::ErrorKind; use std::error::Error; use std::io; if let Err(e) = func1() { match e.kind() { ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } eprintln!(); let mut s: &Error = &e; while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}","breadcrumbs":"Writing a library","id":"16","title":"Writing a library"},"17":{"body":"Not using chainerror and going full std would look like this: Btw, the code size is bigger than using chainerror :-) pub mod mycrate { use std::error::Error as StdError; use func2mod::{do_some_io, func2}; pub mod func2mod { use std::error::Error as StdError; use std::io; pub enum ErrorKind { IO(String), } impl std::fmt::Display for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result { match self { ErrorKind::IO(s) => std::fmt::Display::fmt(s, f), } } } impl std::fmt::Debug for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result { match self { ErrorKind::IO(s) => std::fmt::Display::fmt(s, f), } } } macro_rules! mcherr { ( $k:expr ) => {{ |e| { Error( $k, Some(Box::from(e)), Some(concat!(file!(), \":\", line!(), \": \")), ) } }}; } pub struct Error( ErrorKind, Option>, Option<&'static str>, ); impl Error { pub fn kind(&self) -> &ErrorKind { &self.0 } } impl From for Error { fn from(e: ErrorKind) -> Self { Error(e, None, None) } } impl std::error::Error for Error { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { self.1.as_ref().map(|e| e.as_ref()) } } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { std::fmt::Display::fmt(&self.0, f) } } impl std::fmt::Debug for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { if let Some(ref o) = self.2 { std::fmt::Display::fmt(o, f)?; } std::fmt::Debug::fmt(&self.0, f)?; if let Some(e) = self.source() { std::fmt::Display::fmt(\"\\nCaused by:\\n\", f)?; std::fmt::Debug::fmt(&e, f)?; } Ok(()) } } pub fn do_some_io() -> std::result::Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } pub fn func2() -> std::result::Result<(), Error> { let filename = \"foo.txt\"; do_some_io().map_err(mcherr!(ErrorKind::IO(format!( \"Error reading '{}'\", filename ))))?; Ok(()) } } #[derive(Debug)] pub enum ErrorKind { Func2, IO(String), } impl std::fmt::Display for ErrorKind { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result { match self { ErrorKind::Func2 => write!(f, \"func1 error calling func2\"), ErrorKind::IO(filename) => write!(f, \"Error reading '{}'\", filename), } } } macro_rules! mcherr { ( $k:expr ) => {{ |e| { Error( $k, Some(Box::from(e)), Some(concat!(file!(), \":\", line!(), \": \")), ) } }}; } pub struct Error( ErrorKind, Option>, Option<&'static str>, ); impl Error { pub fn kind(&self) -> &ErrorKind { &self.0 } } impl From for Error { fn from(e: ErrorKind) -> Self { Error(e, None, None) } } impl std::error::Error for Error { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { self.1.as_ref().map(|e| e.as_ref()) } } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { std::fmt::Display::fmt(&self.0, f) } } impl std::fmt::Debug for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { if let Some(ref o) = self.2 { std::fmt::Display::fmt(o, f)?; } std::fmt::Debug::fmt(&self.0, f)?; if let Some(e) = self.source() { std::fmt::Display::fmt(\"\\nCaused by:\\n\", f)?; std::fmt::Debug::fmt(&e, f)?; } Ok(()) } } pub type Result = std::result::Result; pub fn func1() -> Result<()> { func2().map_err(mcherr!(ErrorKind::Func2))?; let filename = String::from(\"bar.txt\"); do_some_io().map_err(mcherr!(ErrorKind::IO(filename)))?; Ok(()) }\n} fn main() -> Result<(), Box> { use mycrate::func1; use mycrate::ErrorKind; use std::error::Error; use std::io; if let Err(e) = func1() { match e.kind() { ErrorKind::Func2 => eprintln!(\"Main Error Report: func1 error calling func2\"), ErrorKind::IO(ref filename) => { eprintln!(\"Main Error Report: func1 error reading '{}'\", filename) } } eprintln!(); let mut s: &Error = &e; while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } eprintln!(\"\\nDebug Error:\\n{:?}\", e); } Ok(())\n}","breadcrumbs":"Going back to std","id":"17","title":"Going back to std"},"18":{"body":"That's it for now… Happy error handling! To report issues, submit pull request or for the source code, examples and the book source, visit the Git Repo .","breadcrumbs":"The End","id":"18","title":"The End"},"2":{"body":"no-fileline : completely turn off storing filename and line display-cause : turn on printing a backtrace of the errors in Display no-debug-cause : turn off printing a backtrace of the errors in Debug","breadcrumbs":"Features","id":"2","title":"Features"},"3":{"body":"An easy way of doing error handling in rust is by returning String as a Box. If the rust main function returns an Err(), this Err() will be displayed with std::fmt::Debug. As you can see by running the example (by pressing the \"Play\" button in upper right of the code block), this only prints out the last Error. Error: StringError(\"func1 error\") The next chapters of this tutorial show how chainerror adds more information and improves inspecting the sources of an error. You can also run the tutorial examples in the checked out chainerror git repo . $ cargo run -q --example tutorial1 use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { if let Err(_) = do_some_io() { Err(\"func2 error\")?; } Ok(())\n} fn func1() -> Result<(), Box> { if let Err(_) = func2() { Err(\"func1 error\")?; } Ok(())\n} fn main() -> Result<(), Box> { func1()\n}","breadcrumbs":"Simple String Errors","id":"3","title":"Simple String Errors"},"4":{"body":"With relatively small changes and the help of the cherr! macro of the chainerror crate the String errors are now chained together. Press the play button in the upper right corner and see the nice debug output. use chainerror::*; use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { if let Err(e) = do_some_io() { Err(cherr!(e, \"func2 error\"))?; } Ok(())\n} fn func1() -> Result<(), Box> { if let Err(e) = func2() { Err(cherr!(e, \"func1 error\"))?; } Ok(())\n} fn main() -> Result<(), Box> { func1()\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Simple Chained String Errors","id":"4","title":"Simple Chained String Errors"},"5":{"body":"if let Err(e) = do_some_io() { Err(cherr!(e, \"func2 error\"))?; } The macro cherr!(olderror, newerror) stores olderror as the source/cause of newerror along with the filename (file!()) and line number (line!()) and returns newerror. Err()? then returns the inner error applying .into(), so that we again have a Err(Box) as a result. The Debug implementation of ChainError (which is returned by cherr!()) prints the Debug of T prefixed with the stored filename and line number. ChainError in our case is ChainError.","breadcrumbs":"What did we do here?","id":"5","title":"What did we do here?"},"6":{"body":"Now let's get more rust idiomatic by using .map_err(). use chainerror::*; use std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { do_some_io().map_err(|e| cherr!(e, \"func2 error\"))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(|e| cherr!(e, \"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# } If you compare the output to the previous example, you will see, that: Error: src/main.rs:19: \"func1 error\" changed to just: src/main.rs:16: \"func1 error\" This is, because we caught the error of func1() in main() and print it out ourselves. We can now control, whether to output in Debug or Display mode. Maybe depending on --debug as a CLI argument.","breadcrumbs":"Mapping Errors","id":"6","title":"Mapping Errors"},"7":{"body":"Because decorating an error with more information should not let you jump through hoops, chainerror has a quick macro for that. mstrerror!() fits right into .map_err() letting you quickly add more debug strings. mstrerror!() even understands format!() syntax like println!(). use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{:?}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Saving coding chars","id":"7","title":"Saving coding chars"},"8":{"body":"Sometimes you want to inspect the source() of an Error. chainerror implements std::error::Error::source(), so you can get the cause of an error. use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { if let Err(e) = func2() { if let Some(s) = e.source() { eprintln!(\"func2 failed because of '{}'\", s); Err(e).map_err(mstrerr!(\"func1 error\"))?; } } Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"{}\", e); } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# } Note, that because we changed the output of the error in main() from Debug to Display, we don't see the error backtrace with filename and line number. To enable the Display backtrace, you have to enable the feature display-cause for chainerror.","breadcrumbs":"The source() of Errors","id":"8","title":"The source() of Errors"},"9":{"body":"std::error::Error comes with some helper methods to get to the original object of the &(dyn Error + 'static) returned by .source(). pub fn downcast_ref(&self) -> Option<&T>\npub fn downcast_mut(&mut self) -> Option<&mut T> This is how it looks like, when using those: use chainerror::*;\nuse std::error::Error;\nuse std::io;\nuse std::result::Result; fn do_some_io() -> Result<(), Box> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(())\n} fn func2() -> Result<(), Box> { let filename = \"foo.txt\"; do_some_io().map_err(mstrerr!(\"Error reading '{}'\", filename))?; Ok(())\n} fn func1() -> Result<(), Box> { func2().map_err(mstrerr!(\"func1 error\"))?; Ok(())\n} fn main() -> Result<(), Box> { if let Err(e) = func1() { eprintln!(\"Error: {}\", e); let mut s : &(dyn Error) = e.as_ref(); while let Some(c) = s.source() { if let Some(ioerror) = c.downcast_ref::() { eprintln!(\"caused by: std::io::Error: {}\", ioerror); match ioerror.kind() { io::ErrorKind::NotFound => eprintln!(\"of kind: std::io::ErrorKind::NotFound\"), _ => {} } } else { eprintln!(\"caused by: {}\", c); } s = c; } } Ok(())\n}\n# #[allow(dead_code)]\n# mod chainerror {\n{{#includecomment ../src/lib.rs}}\n# }","breadcrumbs":"Downcast the Errors","id":"9","title":"Downcast the Errors"}},"length":19,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"_":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"a":{"d":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.0}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":3,"docs":{"0":{"tf":2.0},"2":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}},"l":{"df":1,"docs":{"10":{"tf":1.0}}}},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"3":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"w":{"df":1,"docs":{"17":{"tf":1.0}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}},"y":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"s":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"2":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}}}},"df":3,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}},"t":{">":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"5":{"tf":1.4142135623730951}}}},"df":16,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"9":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":2.23606797749979},"2":{"tf":1.4142135623730951},"4":{"tf":1.0},"5":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"0":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":3,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"1":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"+":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":3,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"13":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"1":{"tf":1.0},"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":11,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":1.4142135623730951},"17":{"tf":2.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"df":3,"docs":{"12":{"tf":1.0},"14":{"tf":1.4142135623730951},"18":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"2":{"df":1,"docs":{"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"2":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"3":{"tf":1.4142135623730951},"5":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},":":{"\\":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":0,"docs":{}},"df":19,"docs":{"0":{"tf":2.0},"1":{"tf":3.872983346207417},"10":{"tf":2.23606797749979},"11":{"tf":2.449489742783178},"12":{"tf":2.23606797749979},"13":{"tf":3.3166247903554},"14":{"tf":3.4641016151377544},"15":{"tf":3.3166247903554},"16":{"tf":3.1622776601683795},"17":{"tf":4.898979485566356},"18":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":2.8284271247461903},"4":{"tf":2.0},"5":{"tf":1.4142135623730951},"6":{"tf":2.6457513110645907},"7":{"tf":1.4142135623730951},"8":{"tf":2.449489742783178},"9":{"tf":2.449489742783178}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":2,"docs":{"16":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":3.3166247903554}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.0}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.7320508075688772},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"3":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":4.358898943540674}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"2":{"tf":1.0},"8":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"5":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":14,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":2.0},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.8284271247461903},"16":{"tf":2.449489742783178},"17":{"tf":2.449489742783178},"2":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":1,"docs":{"7":{"tf":1.0}}},"x":{"df":1,"docs":{"14":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":15,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":3.3166247903554},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":2.23606797749979},"17":{"tf":4.123105625617661},"3":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.449489742783178}}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":12,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}},"n":{"c":{"1":{"df":15,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":2.23606797749979},"17":{"tf":2.23606797749979},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":2.449489742783178},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":3,"docs":{"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":3.0},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}}}}}}},"2":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":3,"docs":{"10":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":2.8284271247461903},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.0},"14":{"tf":2.449489742783178},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"17":{"tf":2.23606797749979},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":4,"docs":{"1":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{":":{":":{"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}}}},"3":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":2.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"15":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"14":{"tf":1.0}}}}},"o":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":1,"docs":{"15":{"tf":1.0}}},"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":3.605551275463989}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"5":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"11":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"s":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"k":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"<":{"'":{"a":{">":{"(":{"&":{"'":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"6":{"tf":1.0}}},"df":1,"docs":{"7":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":5,"docs":{"0":{"tf":1.0},"17":{"tf":1.4142135623730951},"2":{"tf":1.0},"5":{"tf":1.7320508075688772},"8":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":2,"docs":{"0":{"tf":1.0},"14":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":6,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":15,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":1,"docs":{"6":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":10,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":2.0},"16":{"tf":1.7320508075688772},"17":{"tf":2.23606797749979},"9":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"d":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":2.8284271247461903},"9":{"tf":1.0}}}},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.7320508075688772}}}}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":2.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":6,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"18":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"5":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"k":{"(":{"_":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":2.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"17":{"tf":2.449489742783178},"3":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"n":{"df":1,"docs":{"14":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"&":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"(":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"t":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"6":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"y":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0}},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"0":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"b":{"df":3,"docs":{"16":{"tf":2.23606797749979},"17":{"tf":3.4641016151377544},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"q":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":13,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}},"r":{"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":2.23606797749979},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.0}}}}},"df":5,"docs":{"12":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":8,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.23606797749979},"9":{"tf":1.0}}}},"n":{"d":{"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":8,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.4142135623730951},"8":{"tf":1.0}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":2.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.4142135623730951},"3":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"/":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"3":{"5":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"10":{"tf":2.0},"17":{"tf":2.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.7320508075688772},"3":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"o":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"2":{"tf":1.0},"5":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":5,"docs":{"11":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"p":{"df":1,"docs":{"0":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"n":{"c":{"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":5,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":6,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"p":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":16,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":3.0},"14":{"tf":2.23606797749979},"15":{"tf":2.0},"16":{"tf":2.6457513110645907},"17":{"tf":3.1622776601683795},"3":{"tf":1.7320508075688772},"4":{"tf":2.0},"6":{"tf":2.23606797749979},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.0}}}},"y":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"13":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":6,"docs":{"1":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"16":{"tf":1.0}}}}}}}}},"breadcrumbs":{"root":{"_":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"a":{"d":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":3,"docs":{"0":{"tf":2.0},"2":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}},"l":{"df":1,"docs":{"10":{"tf":1.0}}}},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"3":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}}},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"w":{"df":1,"docs":{"17":{"tf":1.0}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}},"y":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"s":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":2.23606797749979},"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}}}},"df":3,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}},"t":{">":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"5":{"tf":1.4142135623730951}}}},"df":16,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"9":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"13":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"4":{"tf":1.0},"5":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"0":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":3,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"1":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"+":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}}},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":3,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"13":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{">":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"1":{"tf":1.0},"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":11,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":1.4142135623730951},"17":{"tf":2.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}},"d":{"df":3,"docs":{"12":{"tf":1.0},"14":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"2":{"df":1,"docs":{"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"2":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"3":{"tf":1.4142135623730951},"5":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},":":{"\\":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":0,"docs":{}},"df":19,"docs":{"0":{"tf":2.0},"1":{"tf":3.872983346207417},"10":{"tf":2.449489742783178},"11":{"tf":2.6457513110645907},"12":{"tf":2.449489742783178},"13":{"tf":3.3166247903554},"14":{"tf":3.4641016151377544},"15":{"tf":3.3166247903554},"16":{"tf":3.1622776601683795},"17":{"tf":4.898979485566356},"18":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":3.0},"4":{"tf":2.23606797749979},"5":{"tf":1.4142135623730951},"6":{"tf":2.8284271247461903},"7":{"tf":1.4142135623730951},"8":{"tf":2.6457513110645907},"9":{"tf":2.6457513110645907}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":2,"docs":{"16":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"17":{"tf":3.3166247903554}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.0}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":2.0},"12":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.7320508075688772},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"3":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":4.358898943540674}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"2":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"5":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":14,"docs":{"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":2.0},"13":{"tf":2.23606797749979},"14":{"tf":2.23606797749979},"15":{"tf":2.8284271247461903},"16":{"tf":2.449489742783178},"17":{"tf":2.449489742783178},"2":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"<":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"11":{"tf":1.4142135623730951},"14":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}},"t":{"df":1,"docs":{"7":{"tf":1.0}}},"x":{"df":1,"docs":{"14":{"tf":1.0}}}},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":15,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":3.3166247903554},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.23606797749979},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":2.23606797749979},"17":{"tf":4.123105625617661},"3":{"tf":2.0},"4":{"tf":2.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.449489742783178}}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":12,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.0}}}},"n":{"c":{"1":{"df":15,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"12":{"tf":2.449489742783178},"13":{"tf":2.449489742783178},"14":{"tf":2.449489742783178},"15":{"tf":2.6457513110645907},"16":{"tf":2.23606797749979},"17":{"tf":2.23606797749979},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"6":{"tf":2.449489742783178},"7":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":2.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":3,"docs":{"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":3.0},"14":{"tf":2.449489742783178},"15":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}}}}}}},"2":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":3,"docs":{"10":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"|":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":2.8284271247461903},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":2.0},"14":{"tf":2.449489742783178},"15":{"tf":2.23606797749979},"16":{"tf":2.0},"17":{"tf":2.23606797749979},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":4,"docs":{"1":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"o":{"d":{":":{":":{"df":0,"docs":{},"{":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}}}},"3":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":2.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"15":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"14":{"tf":1.0}}}}},"o":{"df":1,"docs":{"17":{"tf":1.7320508075688772}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"18":{"tf":1.0},"3":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":1,"docs":{"15":{"tf":1.0}}},"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"13":{"tf":1.0},"5":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":3.605551275463989}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"5":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"11":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}}},":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"s":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"k":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"d":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"<":{"'":{"a":{">":{"(":{"&":{"'":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":6,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"6":{"tf":1.0}}},"df":1,"docs":{"7":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":5,"docs":{"0":{"tf":1.0},"17":{"tf":1.4142135623730951},"2":{"tf":1.0},"5":{"tf":1.7320508075688772},"8":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":2,"docs":{"0":{"tf":1.0},"14":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":6,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":15,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"p":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":1,"docs":{"6":{"tf":1.4142135623730951}}},"t":{"c":{"df":0,"docs":{},"h":{"df":10,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":2.0},"16":{"tf":1.7320508075688772},"17":{"tf":2.23606797749979},"9":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"d":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"12":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":2.8284271247461903},"9":{"tf":1.0}}}},"y":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.7320508075688772}}}}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":2.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":6,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":1.7320508075688772},"18":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"5":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"k":{"(":{"_":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":2.0},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":2.0},"15":{"tf":2.0},"16":{"tf":2.0},"17":{"tf":2.449489742783178},"3":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"n":{"df":1,"docs":{"14":{"tf":1.0}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"&":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"(":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"u":{"df":1,"docs":{"10":{"tf":1.0}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"<":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"t":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"6":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"y":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0}},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"0":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"b":{"df":3,"docs":{"16":{"tf":2.23606797749979},"17":{"tf":3.4641016151377544},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"q":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":13,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.4142135623730951},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}},"r":{"df":0,"docs":{},"t":{"df":7,"docs":{"1":{"tf":2.23606797749979},"13":{"tf":1.7320508075688772},"14":{"tf":1.7320508075688772},"15":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":5,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772}}}}},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"3":{"tf":1.7320508075688772}}},"s":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{":":{":":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"df":5,"docs":{"12":{"tf":2.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":6,"docs":{"11":{"tf":1.4142135623730951},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"13":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"1":{".":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"(":{")":{".":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":8,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.23606797749979},"9":{"tf":1.0}}}},"n":{"d":{"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"17":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"12":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":8,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.4142135623730951},"8":{"tf":1.0}},"f":{"1":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"2":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":2.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.4142135623730951},"3":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}},"e":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"/":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"3":{"5":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{">":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"10":{"tf":2.0},"17":{"tf":2.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"0":{"tf":1.0}}}}},"d":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":3.1622776601683795},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"&":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":5,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.7320508075688772},"3":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"(":{"\"":{"\\":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}},"o":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":2.6457513110645907}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}},"df":15,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"17":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"2":{"tf":1.0},"5":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"17":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":5,"docs":{"11":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"p":{"df":1,"docs":{"0":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"u":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"n":{"c":{"df":16,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":2.0},"11":{"tf":2.0},"12":{"tf":2.23606797749979},"13":{"tf":2.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":2.0},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":5,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":6,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"p":{"df":2,"docs":{"12":{"tf":1.0},"14":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"s":{"df":16,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"10":{"tf":2.6457513110645907},"11":{"tf":2.0},"12":{"tf":2.0},"13":{"tf":3.0},"14":{"tf":2.23606797749979},"15":{"tf":2.0},"16":{"tf":2.6457513110645907},"17":{"tf":3.1622776601683795},"3":{"tf":1.7320508075688772},"4":{"tf":2.0},"6":{"tf":2.23606797749979},"7":{"tf":2.0},"8":{"tf":2.0},"9":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.0}}}},"y":{"df":2,"docs":{"12":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"13":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"df":6,"docs":{"1":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}}}}},"title":{"root":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"10":{"tf":1.0},"11":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"u":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"d":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}} \ No newline at end of file diff --git a/tomorrow-night.css b/tomorrow-night.css index 9788e08..f719792 100644 --- a/tomorrow-night.css +++ b/tomorrow-night.css @@ -94,3 +94,11 @@ .xml .hljs-cdata { opacity: 0.5; } + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/tutorial1.html b/tutorial1.html index 6d7354d..e5a8629 100644 --- a/tutorial1.html +++ b/tutorial1.html @@ -1,9 +1,11 @@ - + Simple String Errors - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,17 +148,17 @@
-

Simple String Errors

+

Simple String Errors

An easy way of doing error handling in rust is by returning String as a Box<std::error::Error>.

If the rust main function returns an Err(), this Err() will be displayed with std::fmt::Debug.

-

As you can see by running the example (by pressing the "Play" button in upper right of the code block), -this only +

As you can see by running the example (by pressing the "Play" button in upper right of the code block), +this only prints out the last Error.

Error: StringError("func1 error")
 

The next chapters of this tutorial show how chainerror adds more information and improves inspecting the sources of an error.

-

You can also run the tutorial examples in the checked out +

You can also run the tutorial examples in the checked out chainerror git repo.

$ cargo run -q --example tutorial1
 
@@ -158,29 +166,28 @@ and improves inspecting the sources of an error.

use std::io; use std::result::Result; -fn do_some_io() -> Result<(), Box<Error>> { +fn do_some_io() -> Result<(), Box<Error + Send + Sync>> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } -fn func2() -> Result<(), Box<Error>> { +fn func2() -> Result<(), Box<Error + Send + Sync>> { if let Err(_) = do_some_io() { Err("func2 error")?; } Ok(()) } -fn func1() -> Result<(), Box<Error>> { +fn func1() -> Result<(), Box<Error + Send + Sync>> { if let Err(_) = func2() { Err("func1 error")?; } Ok(()) } -fn main() -> Result<(), Box<Error>> { +fn main() -> Result<(), Box<Error + Send + Sync>> { func1() } -
@@ -225,6 +232,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial10.html b/tutorial10.html index 3df3f98..89e9aa2 100644 --- a/tutorial10.html +++ b/tutorial10.html @@ -1,9 +1,11 @@ - + ErrorKind to the rescue - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,30 +148,30 @@
-

ErrorKind to the rescue

+

ErrorKind to the rescue

To cope with different kind of errors, we introduce the kind of an error Func1ErrorKind with an enum.

Because we derive Debug and implement Display our Func1ErrorKind enum, this enum can be used as a std::error::Error.

Not using String errors anymore, the cherr!() macro seen in the beginning of the tutorial has to be used again.

-

Only returning Func1ErrorKind in func1() now let us get rid of Result<(), Box<Error>> and we can +

Only returning Func1ErrorKind in func1() now let us get rid of Result<(), Box<Error + Send + Sync>> and we can use ChainResult<(), Func1ErrorKind>.

In main we can now directly use the methods of ChainError<T> without downcasting the error first.

-

Also a nice match on ChainError<T>.kind() is now possible, which returns &T, meaning +

Also a nice match on ChainError<T>.kind() is now possible, which returns &T, meaning &Func1ErrorKind here.

use chainerror::*;
 use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -192,7 +200,7 @@ fn func1() -> ChainResult<(), Func1ErrorKind> {
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         match e.kind() {
             Func1ErrorKind::Func2 => eprintln!("Main Error Report: func1 error calling func2"),
@@ -209,932 +217,11 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
@@ -1178,6 +265,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial11.html b/tutorial11.html index 4713c46..d49a6ac 100644 --- a/tutorial11.html +++ b/tutorial11.html @@ -1,9 +1,11 @@ - + Debug for the ErrorKind - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

Debug for the ErrorKind

+

Debug for the ErrorKind

One small improvement at the end of the tutorial is to fix the debug output of Func1ErrorKind. As you probably noticed, the output doesn't say much of the enum.

Debug Error:
@@ -161,14 +169,14 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -203,7 +211,7 @@ fn func1() -> ChainResult<(), Func1ErrorKind> {
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         match e.kind() {
             Func1ErrorKind::Func2 => eprintln!("Main Error Report: func1 error calling func2"),
@@ -220,932 +228,11 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
@@ -1189,6 +276,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial12.html b/tutorial12.html index dac3303..85bd9f1 100644 --- a/tutorial12.html +++ b/tutorial12.html @@ -1,9 +1,11 @@ - + Deref for the ErrorKind - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

Deref for the ErrorKind

+

Deref for the ErrorKind

Because ChainError implements Deref to &T, we can also match on *e instead of e.kind() or call a function with &e

use chainerror::*;
@@ -148,14 +156,14 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -199,7 +207,7 @@ fn handle_func1errorkind(e: &Func1ErrorKind) {
     }
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         match *e {
             Func1ErrorKind::Func2 => eprintln!("Main Error Report: func1 error calling func2"),
@@ -218,932 +226,11 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
@@ -1187,6 +274,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial13.html b/tutorial13.html index 9fb6750..9e5f91a 100644 --- a/tutorial13.html +++ b/tutorial13.html @@ -1,9 +1,11 @@ - + Writing a library - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,964 +148,45 @@
-

Writing a library

+

Writing a library

I would advise to only expose an mycrate::ErrorKind and type alias mycrate::Error to ChainError<mycrate::ErrorKind> so you can tell your library users to use the .kind() method as std::io::Error does.

If you later decide to make your own Error implementation, your library users don't have to change much or anything.

-
# #[allow(dead_code)]
-# #[macro_use]
-# pub mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-pub mod mycrate {
+
#[allow(dead_code)]
+#[macro_use]
+pub mod chainerror {
+{{#includecomment ../src/lib.rs}}
+}
+pub mod mycrate {
     use crate::chainerror::*; // omit the `crate::` part
     use std::io;
 
-    fn do_some_io() -> std::result::Result<(), Box<std::error::Error>> {
+    fn do_some_io() -> std::result::Result<(), Box<std::error::Error + Send + Sync>> {
         Err(io::Error::from(io::ErrorKind::NotFound))?;
         Ok(())
     }
 
     derive_str_cherr!(Func2Error);
 
-    fn func2() -> std::result::Result<(), Box<std::error::Error>> {
+    fn func2() -> std::result::Result<(), Box<std::error::Error + Send + Sync>> {
         let filename = "foo.txt";
         do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
         Ok(())
     }
 
-    #[derive(Debug)]
+    #[derive(Debug, Clone)]
     pub enum ErrorKind {
         Func2,
         IO(String),
     }
 
-    pub type Error = ChainError<ErrorKind>;
+    derive_err_kind!(Error, ErrorKind);
+
     pub type Result<T> = std::result::Result<T, Error>;
 
-    impl ::std::fmt::Display for ErrorKind {
-        fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+    impl std::fmt::Display for ErrorKind {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result {
             match self {
                 ErrorKind::Func2 => write!(f, "func1 error calling func2"),
                 ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
@@ -1113,7 +202,7 @@ pub mod mycrate {
     }
 }
 
-fn main() -> Result<(), Box<std::error::Error>> {
+fn main() -> Result<(), Box<std::error::Error + Send + Sync>> {
     use mycrate::func1;
     use mycrate::ErrorKind;
     use std::error::Error;
@@ -1128,7 +217,7 @@ fn main() -> Result<(), Box<std::error::Error>> {
         }
 
         eprintln!();
-        let mut s : &Error = &e;
+        let mut s: &Error = &e;
         while let Some(c) = s.source() {
             if let Some(ioerror) = c.downcast_ref::<io::Error>() {
                 eprintln!("caused by: std::io::Error: {}", ioerror);
@@ -1159,7 +248,7 @@ fn main() -> Result<(), Box<std::error::Error>> {
                         
 
                         
-                            
                         
@@ -1177,7 +266,7 @@ fn main() -> Result<(), Box<std::error::Error>> {
                 
 
                 
-                    
                 
@@ -1190,6 +279,14 @@ fn main() -> Result<(), Box<std::error::Error>> {
         
 
         
+        
+        
+        
+        
+
+        
 
         
         
diff --git a/tutorial14.html b/tutorial14.html
new file mode 100644
index 0000000..2fd64e2
--- /dev/null
+++ b/tutorial14.html
@@ -0,0 +1,440 @@
+
+
+    
+        
+        
+        Going back to std - chainerror
+        
+
+        
+        
+        
+        
+
+        
+        
+        
+        
+        
+
+        
+        
+        
+        
+
+        
+        
+        
+        
+
+        
+        
+
+        
+    
+    
+        
+        
+
+        
+        
+
+        
+        
+
+        
+        
+
+        
+
+        
+ +
+ + + + + + + + + + +
+
+

Going back to std

+

Not using chainerror and going full std would look like this:

+

Btw, the code size is bigger than using chainerror :-)

+
pub mod mycrate {
+    use std::error::Error as StdError;
+
+    use func2mod::{do_some_io, func2};
+
+    pub mod func2mod {
+        use std::error::Error as StdError;
+        use std::io;
+
+        pub enum ErrorKind {
+            IO(String),
+        }
+
+        impl std::fmt::Display for ErrorKind {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result {
+                match self {
+                    ErrorKind::IO(s) => std::fmt::Display::fmt(s, f),
+                }
+            }
+        }
+
+        impl std::fmt::Debug for ErrorKind {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result {
+                match self {
+                    ErrorKind::IO(s) => std::fmt::Display::fmt(s, f),
+                }
+            }
+        }
+
+        macro_rules! mcherr {
+            ( $k:expr ) => {{
+                |e| {
+                    Error(
+                        $k,
+                        Some(Box::from(e)),
+                        Some(concat!(file!(), ":", line!(), ": ")),
+                    )
+                }
+            }};
+        }
+
+        pub struct Error(
+            ErrorKind,
+            Option<Box<dyn std::error::Error + 'static>>,
+            Option<&'static str>,
+        );
+
+        impl Error {
+            pub fn kind(&self) -> &ErrorKind {
+                &self.0
+            }
+        }
+
+        impl From<ErrorKind> for Error {
+            fn from(e: ErrorKind) -> Self {
+                Error(e, None, None)
+            }
+        }
+
+        impl std::error::Error for Error {
+            fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
+                self.1.as_ref().map(|e| e.as_ref())
+            }
+        }
+
+        impl std::fmt::Display for Error {
+            fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+                std::fmt::Display::fmt(&self.0, f)
+            }
+        }
+
+        impl std::fmt::Debug for Error {
+            fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+                if let Some(ref o) = self.2 {
+                    std::fmt::Display::fmt(o, f)?;
+                }
+
+                std::fmt::Debug::fmt(&self.0, f)?;
+
+                if let Some(e) = self.source() {
+                    std::fmt::Display::fmt("\nCaused by:\n", f)?;
+                    std::fmt::Debug::fmt(&e, f)?;
+                }
+                Ok(())
+            }
+        }
+
+        pub fn do_some_io() -> std::result::Result<(), Box<dyn std::error::Error>> {
+            Err(io::Error::from(io::ErrorKind::NotFound))?;
+            Ok(())
+        }
+
+        pub fn func2() -> std::result::Result<(), Error> {
+            let filename = "foo.txt";
+            do_some_io().map_err(mcherr!(ErrorKind::IO(format!(
+                "Error reading '{}'",
+                filename
+            ))))?;
+            Ok(())
+        }
+    }
+
+    #[derive(Debug)]
+    pub enum ErrorKind {
+        Func2,
+        IO(String),
+    }
+
+    impl std::fmt::Display for ErrorKind {
+        fn fmt(&self, f: &mut ::std::fmt::Formatter) -> std::fmt::Result {
+            match self {
+                ErrorKind::Func2 => write!(f, "func1 error calling func2"),
+                ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
+            }
+        }
+    }
+
+    macro_rules! mcherr {
+        ( $k:expr ) => {{
+            |e| {
+                Error(
+                    $k,
+                    Some(Box::from(e)),
+                    Some(concat!(file!(), ":", line!(), ": ")),
+                )
+            }
+        }};
+    }
+
+    pub struct Error(
+        ErrorKind,
+        Option<Box<dyn std::error::Error + 'static>>,
+        Option<&'static str>,
+    );
+
+    impl Error {
+        pub fn kind(&self) -> &ErrorKind {
+            &self.0
+        }
+    }
+
+    impl From<ErrorKind> for Error {
+        fn from(e: ErrorKind) -> Self {
+            Error(e, None, None)
+        }
+    }
+
+    impl std::error::Error for Error {
+        fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
+            self.1.as_ref().map(|e| e.as_ref())
+        }
+    }
+
+    impl std::fmt::Display for Error {
+        fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+            std::fmt::Display::fmt(&self.0, f)
+        }
+    }
+
+    impl std::fmt::Debug for Error {
+        fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+            if let Some(ref o) = self.2 {
+                std::fmt::Display::fmt(o, f)?;
+            }
+
+            std::fmt::Debug::fmt(&self.0, f)?;
+            if let Some(e) = self.source() {
+                std::fmt::Display::fmt("\nCaused by:\n", f)?;
+                std::fmt::Debug::fmt(&e, f)?;
+            }
+            Ok(())
+        }
+    }
+
+    pub type Result<T> = std::result::Result<T, Error>;
+
+    pub fn func1() -> Result<()> {
+        func2().map_err(mcherr!(ErrorKind::Func2))?;
+        let filename = String::from("bar.txt");
+        do_some_io().map_err(mcherr!(ErrorKind::IO(filename)))?;
+        Ok(())
+    }
+}
+
+fn main() -> Result<(), Box<std::error::Error + Send + Sync>> {
+    use mycrate::func1;
+    use mycrate::ErrorKind;
+    use std::error::Error;
+    use std::io;
+
+    if let Err(e) = func1() {
+        match e.kind() {
+            ErrorKind::Func2 => eprintln!("Main Error Report: func1 error calling func2"),
+            ErrorKind::IO(ref filename) => {
+                eprintln!("Main Error Report: func1 error reading '{}'", filename)
+            }
+        }
+
+        eprintln!();
+        let mut s: &Error = &e;
+        while let Some(c) = s.source() {
+            if let Some(ioerror) = c.downcast_ref::<io::Error>() {
+                eprintln!("caused by: std::io::Error: {}", ioerror);
+                match ioerror.kind() {
+                    io::ErrorKind::NotFound => eprintln!("of kind: std::io::ErrorKind::NotFound"),
+                    _ => {}
+                }
+            } else {
+                eprintln!("caused by: {}", c);
+            }
+            s = c;
+        }
+
+        eprintln!("\nDebug Error:\n{:?}", e);
+    }
+    Ok(())
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorial2.html b/tutorial2.html index a901049..975f677 100644 --- a/tutorial2.html +++ b/tutorial2.html @@ -1,9 +1,11 @@ - + Simple Chained String Errors - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

Simple Chained String Errors

+

Simple Chained String Errors

With relatively small changes and the help of the cherr! macro of the chainerror crate the String errors are now chained together.

Press the play button in the upper right corner and see the nice debug output.

@@ -150,964 +158,43 @@ use std::error::Error; use std::io; use std::result::Result; -fn do_some_io() -> Result<(), Box<Error>> { +fn do_some_io() -> Result<(), Box<Error + Send + Sync>> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } -fn func2() -> Result<(), Box<Error>> { +fn func2() -> Result<(), Box<Error + Send + Sync>> { if let Err(e) = do_some_io() { Err(cherr!(e, "func2 error"))?; } Ok(()) } -fn func1() -> Result<(), Box<Error>> { +fn func1() -> Result<(), Box<Error + Send + Sync>> { if let Err(e) = func2() { Err(cherr!(e, "func1 error"))?; } Ok(()) } -fn main() -> Result<(), Box<Error>> { +fn main() -> Result<(), Box<Error + Send + Sync>> { func1() } - -# #[allow(dead_code)] -# mod chainerror { -# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your -# //! binaries, you still have the error backtrace. -# //! -# //! `chainerror` has no dependencies! -# //! -# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace. -# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally. -# //! -# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing. -# //! -# //! ## Features -# //! -# //! `no-fileline` -# //! : completely turn off storing filename and line -# //! -# //! `display-cause` -# //! : turn on printing a backtrace of the errors in `Display` -# //! -# //! `no-debug-cause` -# //! : turn off printing a backtrace of the errors in `Debug` -# //! -# //! -# //! # Tutorial -# //! -# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html) -# //! -# //! # Examples -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func2() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! fn func1() -> Result<(), Box<Error>> { -# //! func2().map_err(mstrerr!("func1 error"))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:20: func1 error -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# //! -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func3() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! derive_str_cherr!(Func2Error); -# //! -# //! fn func2() -> ChainResult<(), Func2Error> { -# //! func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?; -# //! Ok(()) -# //! } -# //! -# //! enum Func1Error { -# //! Func2, -# //! IO(String), -# //! } -# //! -# //! impl ::std::fmt::Display for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! match self { -# //! Func1Error::Func2 => write!(f, "func1 error calling func2"), -# //! Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename), -# //! } -# //! } -# //! } -# //! -# //! impl ::std::fmt::Debug for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! write!(f, "{}", self) -# //! } -# //! } -# //! -# //! fn func1() -> ChainResult<(), Func1Error> { -# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?; -# //! let filename = String::from("bar.txt"); -# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! assert!( -# //! match e.kind() { -# //! Func1Error::Func2 => { -# //! eprintln!("Main Error Report: func1 error calling func2"); -# //! true -# //! } -# //! Func1Error::IO(filename) => { -# //! eprintln!("Main Error Report: func1 error reading '{}'", filename); -# //! false -# //! } -# //! } -# //! ); -# //! -# //! assert!(e.find_chain_cause::<Func2Error>().is_some()); -# //! -# //! if let Some(e) = e.find_chain_cause::<Func2Error>() { -# //! eprintln!("\nError reported by Func2Error: {}", e) -# //! } -# //! -# //! -# //! assert!(e.root_cause().is_some()); -# //! -# //! if let Some(e) = e.root_cause() { -# //! let ioerror = e.downcast_ref::<io::Error>().unwrap(); -# //! eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror); -# //! } -# //! -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:47: func1 error calling func2 -# //! Caused by: -# //! src/lib.rs:22: Func2Error(func2 error: calling func3) -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# -# use std::any::TypeId; -# use std::error::Error; -# use std::fmt::{Debug, Display, Formatter, Result}; -# -# /// chains an inner error kind `T` with a causing error -# pub struct ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# occurrence: Option<(u32, &'static str)>, -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# } -# -# /// convenience type alias -# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>; -# -# impl<T: 'static + Display + Debug> ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { -# occurrence, -# kind, -# error_cause, -# } -# } -# -# #[cfg(feature = "no-fileline")] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# _occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { kind, error_cause } -# } -# -# /// return the root cause of the error chain, if any exists -# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> { -# self.iter().last() -# } -# -# /// Find the first error cause of type U, if any exists -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// -# /// assert!(f1err.find_cause::<io::Error>().is_some()); -# /// -# /// assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// } -# /// # else { -# /// # panic!(); -# /// # } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter().filter_map(Error::downcast_ref::<U>).next() -# } -# -# /// Find the first error cause of type `ChainError<U>`, if any exists -# /// -# /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooError>>(); -# /// -# /// // leave out the ChainError<FooError> implementation detail -# /// err.find_chain_cause::<FooError>(); -# /// ~~~ -# pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> { -# self.iter() -# .filter_map(Error::downcast_ref::<ChainError<U>>) -# .next() -# } -# -# /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U` -# /// -# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooErrorKind>>(); -# /// // and/or -# /// err.find_chain_cause::<FooErrorKind>(); -# /// // and/or -# /// err.find_cause::<FooErrorKind>(); -# /// -# /// // leave out the ChainError<FooErrorKind> implementation detail -# /// err.find_chain_or_kind::<FooErrorKind>(); -# /// ~~~ -# pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter() -# .filter_map(|e| { -# e.downcast_ref::<ChainError<U>>() -# .map(|e| e.kind()) -# .or_else(|| e.downcast_ref::<U>()) -# }) -# .next() -# } -# -# /// Return a reference to T of `ChainError<T>` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// #[derive(Debug)] -# /// enum Func1ErrorKind { -# /// Func2, -# /// IO(String), -# /// } -# /// -# /// /// impl ::std::fmt::Display for Func1ErrorKind {…} -# /// # impl ::std::fmt::Display for Func1ErrorKind { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"), -# /// # Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename), -# /// # } -# /// # } -# /// # } -# /// -# /// fn func1() -> ChainResult<(), Func1ErrorKind> { -# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; -# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// match e.kind() { -# /// Func1ErrorKind::Func2 => {}, -# /// Func1ErrorKind::IO(filename) => panic!(), -# /// } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn kind(&self) -> &T { -# &self.kind -# } -# -# /// Returns an Iterator over all error causes/sources -# /// -# /// # Example -# /// -# /// -# pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> { -# ErrorIter { -# current: Some(self), -# } -# } -# } -# -# struct ErrorIter<'a> { -# current: Option<&'a (dyn Error + 'static)>, -# } -# -# impl<'a> Iterator for ErrorIter<'a> { -# type Item = &'a (dyn Error + 'static); -# -# fn next(&mut self) -> Option<Self::Item> { -# let current = self.current; -# self.current = self.current.and_then(Error::source); -# current -# } -# } -# -# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> { -# type Target = T; -# -# fn deref(&self) -> &Self::Target { -# &self.kind -# } -# } -# -# /// Convenience trait to hide the `ChainError<T>` implementation internals -# pub trait ChainErrorDown { -# /// Test if of type `ChainError<T>` -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool; -# /// Downcast to a reference of `ChainError<T>` -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>; -# /// Downcast to a mutable reference of `ChainError<T>` -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>; -# } -# -# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# TypeId::of::<T>() == TypeId::of::<U>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&*(self as *const dyn Error as *const &ChainError<T>)) -# } -# } else { -# None -# } -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>)) -# } -# } else { -# None -# } -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send + Sync { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl<T: 'static + Display + Debug> Error for ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Display for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# write!(f, "{}", self.kind)?; -# -# #[cfg(feature = "display-cause")] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Display::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# impl<T: 'static + Display + Debug> Debug for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# #[cfg(not(feature = "no-fileline"))] -# { -# if let Some(o) = self.occurrence { -# write!(f, "{}:{}: ", o.1, o.0)?; -# } -# } -# -# if self.is_chain::<String>() { -# Display::fmt(&self.kind, f)?; -# } else { -# Debug::fmt(&self.kind, f)?; -# } -# -# #[cfg(not(feature = "no-debug-cause"))] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Debug::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# pub trait ChainErrorFrom<T>: Sized { -# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>; -# } -# -# pub trait IntoChainError<T>: Sized { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>; -# } -# -# impl<T, U> IntoChainError<U> for T -# where -# U: ChainErrorFrom<T>, -# { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> { -# U::chain_error_from(self, line_filename) -# } -# } -# -# impl<T, U> ChainErrorFrom<T> for U -# where -# T: Into<U>, -# U: 'static + Display + Debug, -# { -# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> { -# let e: U = t.into(); -# ChainError::<_>::new(e, None, line_filename) -# } -# } -# -# #[macro_export] -# macro_rules! minto_cherr { -# ( ) => { -# |e| e.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# #[macro_export] -# macro_rules! into_cherr { -# ( $t:expr ) => { -# $t.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# /// Creates a new `ChainError<T>` -# /// -# /// # Examples -# /// -# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`. -# /// ~~~rust -# /// # use chainerror::*; -# /// # -# /// # #[derive(Debug)] -# /// enum FooError { -# /// Bar, -# /// Baz(&'static str), -# /// } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// -# /// // impl ::std::fmt::Display for FooError -# /// -# /// fn do_some_stuff() -> bool { -# /// false -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// if ! do_some_stuff() { -# /// Err(cherr!(FooError::Baz("Error")))?; -# /// } -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# /// -# /// Additionally an error cause can be added. -# /// -# /// ~~~rust -# /// # use chainerror::*; -# /// # use std::io; -# /// # use std::error::Error; -# /// # -# /// # #[derive(Debug)] -# /// # enum FooError { -# /// # Bar, -# /// # Baz(&'static str), -# /// # } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// # -# /// fn do_some_stuff() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// do_some_stuff().map_err( -# /// |e| cherr!(e, FooError::Baz("Error")) -# /// )?; -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! cherr { -# ( $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( $e:path, $k:expr ) => ({ -# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!()))) -# }); -# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($e, format!($fmt, $($arg)+ )) -# }); -# -# } -# -# /// Convenience macro for `|e| cherr!(e, format!(…))` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!("func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # #[cfg(not(windows))] -# /// # assert_eq!( -# /// # format!("\n{:?}\n", e), r#" -# /// # src/lib.rs:20: func1 error -# /// # Caused by: -# /// # src/lib.rs:15: Error reading 'foo.txt' -# /// # Caused by: -# /// # Kind(NotFound) -# /// # "# -# /// # ); -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# /// -# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with -# /// `derive_str_cherr!(T)` -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! mstrerr { -# ( $t:path, $msg:expr ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# |e| cherr!(e, $t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# |e| cherr!(e, format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::result::Result; -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// Err(strerr!(Func2Error, "Error reading '{}'", filename)) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! strerr { -# ( $t:path, $msg:expr ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# cherr!($msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# cherr!($msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# cherr!(format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! derive_str_cherr { -# ($e:ident) => { -# pub struct $e(pub String); -# impl ::std::fmt::Display for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}", self.0) -# } -# } -# impl ::std::fmt::Debug for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}({})", stringify!($e), self.0) -# } -# } -# impl ::std::error::Error for $e {} -# }; -# } -# } -
-

What did we do here?

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
+

What did we do here?

    if let Err(e) = do_some_io() {
         Err(cherr!(e, "func2 error"))?;
     }
 
-

The macro cherr!(olderror, newerror) stores olderror as the source/cause of newerror +

The macro cherr!(olderror, newerror) stores olderror as the source/cause of newerror along with the filename (file!()) and line number (line!()) and returns newerror.

Err()? then returns the inner error applying .into(), so that we -again have a Err(Box<Error>) as a result.

+again have a Err(Box<Error + Send + Sync>) as a result.

The Debug implementation of ChainError<T> (which is returned by cherr!()) prints the Debug of T prefixed with the stored filename and line number.

ChainError<T> in our case is ChainError<String>.

@@ -1154,6 +241,14 @@ prints the Debug of T prefixed with the stored filenam + + + + + + diff --git a/tutorial3.html b/tutorial3.html index ad15d97..08cbfaf 100644 --- a/tutorial3.html +++ b/tutorial3.html @@ -1,9 +1,11 @@ - + Mapping Errors - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

Mapping Errors

+

Mapping Errors

Now let's get more rust idiomatic by using .map_err().

use chainerror::*;
 
@@ -148,953 +156,32 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     do_some_io().map_err(|e| cherr!(e, "func2 error"))?;
     Ok(())
 }
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     func2().map_err(|e| cherr!(e, "func1 error"))?;
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         eprintln!("{:?}", e);
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +

If you compare the output to the previous example, you will see, that:

Error: src/main.rs:19: "func1 error"
@@ -1148,6 +235,14 @@ Maybe depending on --debug as a CLI argument.

+ + + + + + diff --git a/tutorial4.html b/tutorial4.html index 2a2d408..e97f04a 100644 --- a/tutorial4.html +++ b/tutorial4.html @@ -1,9 +1,11 @@ - + Saving coding chars - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

Saving coding chars

+

Saving coding chars

Because decorating an error with more information should not let you jump through hoops, chainerror has a quick macro for that.

mstrerror!() fits right into .map_err() letting you quickly add @@ -151,954 +159,33 @@ use std::error::Error; use std::io; use std::result::Result; -fn do_some_io() -> Result<(), Box<Error>> { +fn do_some_io() -> Result<(), Box<Error + Send + Sync>> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } -fn func2() -> Result<(), Box<Error>> { +fn func2() -> Result<(), Box<Error + Send + Sync>> { let filename = "foo.txt"; do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; Ok(()) } -fn func1() -> Result<(), Box<Error>> { +fn func1() -> Result<(), Box<Error + Send + Sync>> { func2().map_err(mstrerr!("func1 error"))?; Ok(()) } -fn main() -> Result<(), Box<Error>> { +fn main() -> Result<(), Box<Error + Send + Sync>> { if let Err(e) = func1() { eprintln!("{:?}", e); } Ok(()) } - -# #[allow(dead_code)] -# mod chainerror { -# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your -# //! binaries, you still have the error backtrace. -# //! -# //! `chainerror` has no dependencies! -# //! -# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace. -# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally. -# //! -# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing. -# //! -# //! ## Features -# //! -# //! `no-fileline` -# //! : completely turn off storing filename and line -# //! -# //! `display-cause` -# //! : turn on printing a backtrace of the errors in `Display` -# //! -# //! `no-debug-cause` -# //! : turn off printing a backtrace of the errors in `Debug` -# //! -# //! -# //! # Tutorial -# //! -# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html) -# //! -# //! # Examples -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func2() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! fn func1() -> Result<(), Box<Error>> { -# //! func2().map_err(mstrerr!("func1 error"))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:20: func1 error -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# //! -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func3() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! derive_str_cherr!(Func2Error); -# //! -# //! fn func2() -> ChainResult<(), Func2Error> { -# //! func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?; -# //! Ok(()) -# //! } -# //! -# //! enum Func1Error { -# //! Func2, -# //! IO(String), -# //! } -# //! -# //! impl ::std::fmt::Display for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! match self { -# //! Func1Error::Func2 => write!(f, "func1 error calling func2"), -# //! Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename), -# //! } -# //! } -# //! } -# //! -# //! impl ::std::fmt::Debug for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! write!(f, "{}", self) -# //! } -# //! } -# //! -# //! fn func1() -> ChainResult<(), Func1Error> { -# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?; -# //! let filename = String::from("bar.txt"); -# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! assert!( -# //! match e.kind() { -# //! Func1Error::Func2 => { -# //! eprintln!("Main Error Report: func1 error calling func2"); -# //! true -# //! } -# //! Func1Error::IO(filename) => { -# //! eprintln!("Main Error Report: func1 error reading '{}'", filename); -# //! false -# //! } -# //! } -# //! ); -# //! -# //! assert!(e.find_chain_cause::<Func2Error>().is_some()); -# //! -# //! if let Some(e) = e.find_chain_cause::<Func2Error>() { -# //! eprintln!("\nError reported by Func2Error: {}", e) -# //! } -# //! -# //! -# //! assert!(e.root_cause().is_some()); -# //! -# //! if let Some(e) = e.root_cause() { -# //! let ioerror = e.downcast_ref::<io::Error>().unwrap(); -# //! eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror); -# //! } -# //! -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:47: func1 error calling func2 -# //! Caused by: -# //! src/lib.rs:22: Func2Error(func2 error: calling func3) -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# -# use std::any::TypeId; -# use std::error::Error; -# use std::fmt::{Debug, Display, Formatter, Result}; -# -# /// chains an inner error kind `T` with a causing error -# pub struct ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# occurrence: Option<(u32, &'static str)>, -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# } -# -# /// convenience type alias -# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>; -# -# impl<T: 'static + Display + Debug> ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { -# occurrence, -# kind, -# error_cause, -# } -# } -# -# #[cfg(feature = "no-fileline")] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# _occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { kind, error_cause } -# } -# -# /// return the root cause of the error chain, if any exists -# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> { -# self.iter().last() -# } -# -# /// Find the first error cause of type U, if any exists -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// -# /// assert!(f1err.find_cause::<io::Error>().is_some()); -# /// -# /// assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// } -# /// # else { -# /// # panic!(); -# /// # } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter().filter_map(Error::downcast_ref::<U>).next() -# } -# -# /// Find the first error cause of type `ChainError<U>`, if any exists -# /// -# /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooError>>(); -# /// -# /// // leave out the ChainError<FooError> implementation detail -# /// err.find_chain_cause::<FooError>(); -# /// ~~~ -# pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> { -# self.iter() -# .filter_map(Error::downcast_ref::<ChainError<U>>) -# .next() -# } -# -# /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U` -# /// -# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooErrorKind>>(); -# /// // and/or -# /// err.find_chain_cause::<FooErrorKind>(); -# /// // and/or -# /// err.find_cause::<FooErrorKind>(); -# /// -# /// // leave out the ChainError<FooErrorKind> implementation detail -# /// err.find_chain_or_kind::<FooErrorKind>(); -# /// ~~~ -# pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter() -# .filter_map(|e| { -# e.downcast_ref::<ChainError<U>>() -# .map(|e| e.kind()) -# .or_else(|| e.downcast_ref::<U>()) -# }) -# .next() -# } -# -# /// Return a reference to T of `ChainError<T>` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// #[derive(Debug)] -# /// enum Func1ErrorKind { -# /// Func2, -# /// IO(String), -# /// } -# /// -# /// /// impl ::std::fmt::Display for Func1ErrorKind {…} -# /// # impl ::std::fmt::Display for Func1ErrorKind { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"), -# /// # Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename), -# /// # } -# /// # } -# /// # } -# /// -# /// fn func1() -> ChainResult<(), Func1ErrorKind> { -# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; -# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// match e.kind() { -# /// Func1ErrorKind::Func2 => {}, -# /// Func1ErrorKind::IO(filename) => panic!(), -# /// } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn kind(&self) -> &T { -# &self.kind -# } -# -# /// Returns an Iterator over all error causes/sources -# /// -# /// # Example -# /// -# /// -# pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> { -# ErrorIter { -# current: Some(self), -# } -# } -# } -# -# struct ErrorIter<'a> { -# current: Option<&'a (dyn Error + 'static)>, -# } -# -# impl<'a> Iterator for ErrorIter<'a> { -# type Item = &'a (dyn Error + 'static); -# -# fn next(&mut self) -> Option<Self::Item> { -# let current = self.current; -# self.current = self.current.and_then(Error::source); -# current -# } -# } -# -# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> { -# type Target = T; -# -# fn deref(&self) -> &Self::Target { -# &self.kind -# } -# } -# -# /// Convenience trait to hide the `ChainError<T>` implementation internals -# pub trait ChainErrorDown { -# /// Test if of type `ChainError<T>` -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool; -# /// Downcast to a reference of `ChainError<T>` -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>; -# /// Downcast to a mutable reference of `ChainError<T>` -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>; -# } -# -# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# TypeId::of::<T>() == TypeId::of::<U>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&*(self as *const dyn Error as *const &ChainError<T>)) -# } -# } else { -# None -# } -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>)) -# } -# } else { -# None -# } -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send + Sync { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl<T: 'static + Display + Debug> Error for ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Display for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# write!(f, "{}", self.kind)?; -# -# #[cfg(feature = "display-cause")] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Display::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# impl<T: 'static + Display + Debug> Debug for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# #[cfg(not(feature = "no-fileline"))] -# { -# if let Some(o) = self.occurrence { -# write!(f, "{}:{}: ", o.1, o.0)?; -# } -# } -# -# if self.is_chain::<String>() { -# Display::fmt(&self.kind, f)?; -# } else { -# Debug::fmt(&self.kind, f)?; -# } -# -# #[cfg(not(feature = "no-debug-cause"))] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Debug::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# pub trait ChainErrorFrom<T>: Sized { -# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>; -# } -# -# pub trait IntoChainError<T>: Sized { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>; -# } -# -# impl<T, U> IntoChainError<U> for T -# where -# U: ChainErrorFrom<T>, -# { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> { -# U::chain_error_from(self, line_filename) -# } -# } -# -# impl<T, U> ChainErrorFrom<T> for U -# where -# T: Into<U>, -# U: 'static + Display + Debug, -# { -# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> { -# let e: U = t.into(); -# ChainError::<_>::new(e, None, line_filename) -# } -# } -# -# #[macro_export] -# macro_rules! minto_cherr { -# ( ) => { -# |e| e.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# #[macro_export] -# macro_rules! into_cherr { -# ( $t:expr ) => { -# $t.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# /// Creates a new `ChainError<T>` -# /// -# /// # Examples -# /// -# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`. -# /// ~~~rust -# /// # use chainerror::*; -# /// # -# /// # #[derive(Debug)] -# /// enum FooError { -# /// Bar, -# /// Baz(&'static str), -# /// } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// -# /// // impl ::std::fmt::Display for FooError -# /// -# /// fn do_some_stuff() -> bool { -# /// false -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// if ! do_some_stuff() { -# /// Err(cherr!(FooError::Baz("Error")))?; -# /// } -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# /// -# /// Additionally an error cause can be added. -# /// -# /// ~~~rust -# /// # use chainerror::*; -# /// # use std::io; -# /// # use std::error::Error; -# /// # -# /// # #[derive(Debug)] -# /// # enum FooError { -# /// # Bar, -# /// # Baz(&'static str), -# /// # } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// # -# /// fn do_some_stuff() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// do_some_stuff().map_err( -# /// |e| cherr!(e, FooError::Baz("Error")) -# /// )?; -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! cherr { -# ( $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( $e:path, $k:expr ) => ({ -# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!()))) -# }); -# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($e, format!($fmt, $($arg)+ )) -# }); -# -# } -# -# /// Convenience macro for `|e| cherr!(e, format!(…))` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!("func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # #[cfg(not(windows))] -# /// # assert_eq!( -# /// # format!("\n{:?}\n", e), r#" -# /// # src/lib.rs:20: func1 error -# /// # Caused by: -# /// # src/lib.rs:15: Error reading 'foo.txt' -# /// # Caused by: -# /// # Kind(NotFound) -# /// # "# -# /// # ); -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# /// -# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with -# /// `derive_str_cherr!(T)` -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! mstrerr { -# ( $t:path, $msg:expr ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# |e| cherr!(e, $t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# |e| cherr!(e, format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::result::Result; -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// Err(strerr!(Func2Error, "Error reading '{}'", filename)) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! strerr { -# ( $t:path, $msg:expr ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# cherr!($msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# cherr!($msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# cherr!(format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! derive_str_cherr { -# ($e:ident) => { -# pub struct $e(pub String); -# impl ::std::fmt::Display for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}", self.0) -# } -# } -# impl ::std::fmt::Debug for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}({})", stringify!($e), self.0) -# } -# } -# impl ::std::error::Error for $e {} -# }; -# } -# } -

+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
@@ -1142,6 +229,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial5.html b/tutorial5.html index 6dc0a6c..832ab3e 100644 --- a/tutorial5.html +++ b/tutorial5.html @@ -1,9 +1,11 @@ - + The source() of Errors - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

The source() of Errors

+

The source() of Errors

Sometimes you want to inspect the source() of an Error. chainerror implements std::error::Error::source(), so you can get the cause of an error.

use chainerror::*;
@@ -148,18 +156,18 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
     Ok(())
 }
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func2() {
         if let Some(s) = e.source() {
             eprintln!("func2 failed because of '{}'", s);
@@ -169,939 +177,18 @@ fn func1() -> Result<(), Box<Error>> {
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         eprintln!("{}", e);
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
-

Note, that because we changed the output of the error in main() from +#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} + +

Note, that because we changed the output of the error in main() from Debug to Display, we don't see the error backtrace with filename and line number.

To enable the Display backtrace, you have to enable the feature display-cause for chainerror.

@@ -1147,6 +234,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial6.html b/tutorial6.html index 813b1f3..64677cc 100644 --- a/tutorial6.html +++ b/tutorial6.html @@ -1,9 +1,11 @@ - + Downcast the Errors - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,8 +148,8 @@
-

Downcast the Errors

-

std::error::Error comes with some helper methods to get to the original object of the +

Downcast the Errors

+

std::error::Error comes with some helper methods to get to the original object of the &(dyn Error + 'static) returned by .source().

pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T>
 pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T>
@@ -152,26 +160,26 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
     Ok(())
 }
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     func2().map_err(mstrerr!("func1 error"))?;
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         eprintln!("Error: {}", e);
-        let mut s = e.as_ref();
+        let mut s : &(dyn Error) = e.as_ref();
         while let Some(c) = s.source() {
             if let Some(ioerror) = c.downcast_ref::<io::Error>() {
                 eprintln!("caused by: std::io::Error: {}", ioerror);
@@ -187,932 +195,11 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
@@ -1156,6 +243,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial7.html b/tutorial7.html index dd93bcb..2ee56a2 100644 --- a/tutorial7.html +++ b/tutorial7.html @@ -1,9 +1,11 @@ - + The root cause of all Errors - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

The root cause of all Errors

+

The root cause of all Errors

chainerror also has some helper methods:

fn is_chain<T: 'static + Display + Debug>(&self) -> bool
 fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>
@@ -151,7 +159,7 @@ fn find_chain_cause<U: Error + 'static>(&self) -> Option<&Ch
 fn kind<'a>(&'a self) -> &'a T
 

Using downcast_chain_ref::<String>() gives a ChainError<String>, which can be used -to call .find_cause::<io::Error>().

+to call .find_cause::<io::Error>().

        if let Some(s) = e.downcast_chain_ref::<String>() {
             if let Some(ioerror) = s.find_cause::<io::Error>() {
 
@@ -163,23 +171,23 @@ use std::error::Error; use std::io; use std::result::Result; -fn do_some_io() -> Result<(), Box<Error>> { +fn do_some_io() -> Result<(), Box<Error + Send + Sync>> { Err(io::Error::from(io::ErrorKind::NotFound))?; Ok(()) } -fn func2() -> Result<(), Box<Error>> { +fn func2() -> Result<(), Box<Error + Send + Sync>> { let filename = "foo.txt"; do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; Ok(()) } -fn func1() -> Result<(), Box<Error>> { +fn func1() -> Result<(), Box<Error + Send + Sync>> { func2().map_err(mstrerr!("func1 error"))?; Ok(()) } -fn main() -> Result<(), Box<Error>> { +fn main() -> Result<(), Box<Error + Send + Sync>> { if let Err(e) = func1() { eprintln!("Error: {}", e); if let Some(s) = e.downcast_chain_ref::<String>() { @@ -199,932 +207,11 @@ fn main() -> Result<(), Box<Error>> { } Ok(()) } - -# #[allow(dead_code)] -# mod chainerror { -# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your -# //! binaries, you still have the error backtrace. -# //! -# //! `chainerror` has no dependencies! -# //! -# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace. -# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally. -# //! -# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing. -# //! -# //! ## Features -# //! -# //! `no-fileline` -# //! : completely turn off storing filename and line -# //! -# //! `display-cause` -# //! : turn on printing a backtrace of the errors in `Display` -# //! -# //! `no-debug-cause` -# //! : turn off printing a backtrace of the errors in `Debug` -# //! -# //! -# //! # Tutorial -# //! -# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html) -# //! -# //! # Examples -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func2() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! fn func1() -> Result<(), Box<Error>> { -# //! func2().map_err(mstrerr!("func1 error"))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:20: func1 error -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# //! -# //! -# //! ~~~rust -# //! use chainerror::*; -# //! use std::error::Error; -# //! use std::io; -# //! use std::result::Result; -# //! -# //! fn do_some_io() -> Result<(), Box<Error>> { -# //! Err(io::Error::from(io::ErrorKind::NotFound))?; -# //! Ok(()) -# //! } -# //! -# //! fn func3() -> Result<(), Box<Error>> { -# //! let filename = "foo.txt"; -# //! do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# //! Ok(()) -# //! } -# //! -# //! derive_str_cherr!(Func2Error); -# //! -# //! fn func2() -> ChainResult<(), Func2Error> { -# //! func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?; -# //! Ok(()) -# //! } -# //! -# //! enum Func1Error { -# //! Func2, -# //! IO(String), -# //! } -# //! -# //! impl ::std::fmt::Display for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! match self { -# //! Func1Error::Func2 => write!(f, "func1 error calling func2"), -# //! Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename), -# //! } -# //! } -# //! } -# //! -# //! impl ::std::fmt::Debug for Func1Error { -# //! fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# //! write!(f, "{}", self) -# //! } -# //! } -# //! -# //! fn func1() -> ChainResult<(), Func1Error> { -# //! func2().map_err(|e| cherr!(e, Func1Error::Func2))?; -# //! let filename = String::from("bar.txt"); -# //! do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?; -# //! Ok(()) -# //! } -# //! -# //! fn main() { -# //! if let Err(e) = func1() { -# //! assert!( -# //! match e.kind() { -# //! Func1Error::Func2 => { -# //! eprintln!("Main Error Report: func1 error calling func2"); -# //! true -# //! } -# //! Func1Error::IO(filename) => { -# //! eprintln!("Main Error Report: func1 error reading '{}'", filename); -# //! false -# //! } -# //! } -# //! ); -# //! -# //! assert!(e.find_chain_cause::<Func2Error>().is_some()); -# //! -# //! if let Some(e) = e.find_chain_cause::<Func2Error>() { -# //! eprintln!("\nError reported by Func2Error: {}", e) -# //! } -# //! -# //! -# //! assert!(e.root_cause().is_some()); -# //! -# //! if let Some(e) = e.root_cause() { -# //! let ioerror = e.downcast_ref::<io::Error>().unwrap(); -# //! eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror); -# //! } -# //! -# //! #[cfg(not(windows))] -# //! assert_eq!( -# //! format!("\n{:?}\n", e), r#" -# //! src/lib.rs:47: func1 error calling func2 -# //! Caused by: -# //! src/lib.rs:22: Func2Error(func2 error: calling func3) -# //! Caused by: -# //! src/lib.rs:15: Error reading 'foo.txt' -# //! Caused by: -# //! Kind(NotFound) -# //! "# -# //! ); -# //! } -# //! # else { -# //! # unreachable!(); -# //! # } -# //! } -# //! ~~~ -# -# use std::any::TypeId; -# use std::error::Error; -# use std::fmt::{Debug, Display, Formatter, Result}; -# -# /// chains an inner error kind `T` with a causing error -# pub struct ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# occurrence: Option<(u32, &'static str)>, -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# } -# -# /// convenience type alias -# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>; -# -# impl<T: 'static + Display + Debug> ChainError<T> { -# #[cfg(not(feature = "no-fileline"))] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { -# occurrence, -# kind, -# error_cause, -# } -# } -# -# #[cfg(feature = "no-fileline")] -# /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly -# pub fn new( -# kind: T, -# error_cause: Option<Box<dyn Error + 'static>>, -# _occurrence: Option<(u32, &'static str)>, -# ) -> Self { -# Self { kind, error_cause } -# } -# -# /// return the root cause of the error chain, if any exists -# pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> { -# self.iter().last() -# } -# -# /// Find the first error cause of type U, if any exists -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// -# /// assert!(f1err.find_cause::<io::Error>().is_some()); -# /// -# /// assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// } -# /// # else { -# /// # panic!(); -# /// # } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter().filter_map(Error::downcast_ref::<U>).next() -# } -# -# /// Find the first error cause of type `ChainError<U>`, if any exists -# /// -# /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooError>>(); -# /// -# /// // leave out the ChainError<FooError> implementation detail -# /// err.find_chain_cause::<FooError>(); -# /// ~~~ -# pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> { -# self.iter() -# .filter_map(Error::downcast_ref::<ChainError<U>>) -# .next() -# } -# -# /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U` -# /// -# /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals -# /// -# /// # Examples -# /// -# /// ~~~rust,ignore -# /// // Instead of writing -# /// err.find_cause::<ChainError<FooErrorKind>>(); -# /// // and/or -# /// err.find_chain_cause::<FooErrorKind>(); -# /// // and/or -# /// err.find_cause::<FooErrorKind>(); -# /// -# /// // leave out the ChainError<FooErrorKind> implementation detail -# /// err.find_chain_or_kind::<FooErrorKind>(); -# /// ~~~ -# pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> { -# self.iter() -# .filter_map(|e| { -# e.downcast_ref::<ChainError<U>>() -# .map(|e| e.kind()) -# .or_else(|| e.downcast_ref::<U>()) -# }) -# .next() -# } -# -# /// Return a reference to T of `ChainError<T>` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// fn do_some_io() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// #[derive(Debug)] -# /// enum Func1ErrorKind { -# /// Func2, -# /// IO(String), -# /// } -# /// -# /// /// impl ::std::fmt::Display for Func1ErrorKind {…} -# /// # impl ::std::fmt::Display for Func1ErrorKind { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"), -# /// # Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename), -# /// # } -# /// # } -# /// # } -# /// -# /// fn func1() -> ChainResult<(), Func1ErrorKind> { -# /// func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?; -# /// do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?; -# /// Ok(()) -# /// } -# /// -# /// fn main() { -# /// if let Err(e) = func1() { -# /// match e.kind() { -# /// Func1ErrorKind::Func2 => {}, -# /// Func1ErrorKind::IO(filename) => panic!(), -# /// } -# /// } -# /// # else { -# /// # unreachable!(); -# /// # } -# /// } -# /// ~~~ -# pub fn kind(&self) -> &T { -# &self.kind -# } -# -# /// Returns an Iterator over all error causes/sources -# /// -# /// # Example -# /// -# /// -# pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> { -# ErrorIter { -# current: Some(self), -# } -# } -# } -# -# struct ErrorIter<'a> { -# current: Option<&'a (dyn Error + 'static)>, -# } -# -# impl<'a> Iterator for ErrorIter<'a> { -# type Item = &'a (dyn Error + 'static); -# -# fn next(&mut self) -> Option<Self::Item> { -# let current = self.current; -# self.current = self.current.and_then(Error::source); -# current -# } -# } -# -# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> { -# type Target = T; -# -# fn deref(&self) -> &Self::Target { -# &self.kind -# } -# } -# -# /// Convenience trait to hide the `ChainError<T>` implementation internals -# pub trait ChainErrorDown { -# /// Test if of type `ChainError<T>` -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool; -# /// Downcast to a reference of `ChainError<T>` -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>; -# /// Downcast to a mutable reference of `ChainError<T>` -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>; -# } -# -# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# TypeId::of::<T>() == TypeId::of::<U>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&*(self as *const dyn Error as *const &ChainError<T>)) -# } -# } else { -# None -# } -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# if self.is_chain::<T>() { -# #[allow(clippy::cast_ptr_alignment)] -# unsafe { -# Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>)) -# } -# } else { -# None -# } -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl ChainErrorDown for dyn Error + 'static + Send + Sync { -# fn is_chain<T: 'static + Display + Debug>(&self) -> bool { -# self.is::<ChainError<T>>() -# } -# -# fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> { -# self.downcast_ref::<ChainError<T>>() -# } -# -# fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> { -# self.downcast_mut::<ChainError<T>>() -# } -# } -# -# impl<T: 'static + Display + Debug> Error for ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> { -# fn source(&self) -> Option<&(dyn Error + 'static)> { -# self.error_cause.as_ref().map(|e| e.as_ref()) -# } -# } -# -# impl<T: 'static + Display + Debug> Display for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# write!(f, "{}", self.kind)?; -# -# #[cfg(feature = "display-cause")] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Display::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# impl<T: 'static + Display + Debug> Debug for ChainError<T> { -# fn fmt(&self, f: &mut Formatter) -> Result { -# #[cfg(not(feature = "no-fileline"))] -# { -# if let Some(o) = self.occurrence { -# write!(f, "{}:{}: ", o.1, o.0)?; -# } -# } -# -# if self.is_chain::<String>() { -# Display::fmt(&self.kind, f)?; -# } else { -# Debug::fmt(&self.kind, f)?; -# } -# -# #[cfg(not(feature = "no-debug-cause"))] -# { -# if let Some(e) = self.source() { -# writeln!(f, "\nCaused by:")?; -# Debug::fmt(&e, f)?; -# } -# } -# Ok(()) -# } -# } -# -# pub trait ChainErrorFrom<T>: Sized { -# fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>; -# } -# -# pub trait IntoChainError<T>: Sized { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>; -# } -# -# impl<T, U> IntoChainError<U> for T -# where -# U: ChainErrorFrom<T>, -# { -# fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> { -# U::chain_error_from(self, line_filename) -# } -# } -# -# impl<T, U> ChainErrorFrom<T> for U -# where -# T: Into<U>, -# U: 'static + Display + Debug, -# { -# fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> { -# let e: U = t.into(); -# ChainError::<_>::new(e, None, line_filename) -# } -# } -# -# #[macro_export] -# macro_rules! minto_cherr { -# ( ) => { -# |e| e.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# #[macro_export] -# macro_rules! into_cherr { -# ( $t:expr ) => { -# $t.into_chain_error(Some((line!(), file!()))) -# }; -# } -# -# /// Creates a new `ChainError<T>` -# /// -# /// # Examples -# /// -# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`. -# /// ~~~rust -# /// # use chainerror::*; -# /// # -# /// # #[derive(Debug)] -# /// enum FooError { -# /// Bar, -# /// Baz(&'static str), -# /// } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// -# /// // impl ::std::fmt::Display for FooError -# /// -# /// fn do_some_stuff() -> bool { -# /// false -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// if ! do_some_stuff() { -# /// Err(cherr!(FooError::Baz("Error")))?; -# /// } -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# /// -# /// Additionally an error cause can be added. -# /// -# /// ~~~rust -# /// # use chainerror::*; -# /// # use std::io; -# /// # use std::error::Error; -# /// # -# /// # #[derive(Debug)] -# /// # enum FooError { -# /// # Bar, -# /// # Baz(&'static str), -# /// # } -# /// # -# /// # impl ::std::fmt::Display for FooError { -# /// # fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# /// # match self { -# /// # FooError::Bar => write!(f, "Bar Error"), -# /// # FooError::Baz(s) => write!(f, "Baz Error: '{}'", s), -# /// # } -# /// # } -# /// # } -# /// # -# /// fn do_some_stuff() -> Result<(), Box<Error>> { -# /// Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// Ok(()) -# /// } -# /// -# /// fn func() -> ChainResult<(), FooError> { -# /// do_some_stuff().map_err( -# /// |e| cherr!(e, FooError::Baz("Error")) -# /// )?; -# /// Ok(()) -# /// } -# /// # -# /// # pub fn main() { -# /// # match func().unwrap_err().kind() { -# /// # FooError::Baz(s) if s == &"Error" => {}, -# /// # _ => panic!(), -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! cherr { -# ( $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $k:expr ) => ({ -# ChainError::<_>::new($k, None, Some((line!(), file!()))) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( None, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!(None, format!($fmt, $($arg)+ )) -# }); -# ( $e:path, $k:expr ) => ({ -# ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!()))) -# }); -# ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($e, format!($fmt, $($arg)+ )) -# }); -# -# } -# -# /// Convenience macro for `|e| cherr!(e, format!(…))` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!("func1 error"))?; -# /// Ok(()) -# /// } -# /// -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # #[cfg(not(windows))] -# /// # assert_eq!( -# /// # format!("\n{:?}\n", e), r#" -# /// # src/lib.rs:20: func1 error -# /// # Caused by: -# /// # src/lib.rs:15: Error reading 'foo.txt' -# /// # Caused by: -# /// # Kind(NotFound) -# /// # "# -# /// # ); -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# /// -# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with -# /// `derive_str_cherr!(T)` -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> Result<(), Box<Error>> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! mstrerr { -# ( $t:path, $msg:expr ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# |e| cherr!(e, $t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# |e| cherr!(e, $t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# |e| cherr!(e, $msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# |e| cherr!(e, format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)` -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::result::Result; -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// Err(strerr!(Func2Error, "Error reading '{}'", filename)) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! strerr { -# ( $t:path, $msg:expr ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $msg:expr, ) => ({ -# cherr!($t ($msg.to_string())) -# }); -# ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({ -# cherr!($t (format!($fmt, $($arg)+ ))) -# }); -# ($msg:expr) => ({ -# cherr!($msg.to_string()) -# }); -# ($msg:expr, ) => ({ -# cherr!($msg.to_string()) -# }); -# ($fmt:expr, $($arg:tt)+) => ({ -# cherr!(format!($fmt, $($arg)+ )) -# }); -# } -# -# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T -# /// -# /// # Examples -# /// -# /// ~~~rust -# /// # use crate::chainerror::*; -# /// # use std::error::Error; -# /// # use std::io; -# /// # use std::result::Result; -# /// # -# /// # fn do_some_io() -> Result<(), Box<Error>> { -# /// # Err(io::Error::from(io::ErrorKind::NotFound))?; -# /// # Ok(()) -# /// # } -# /// # -# /// derive_str_cherr!(Func2Error); -# /// -# /// fn func2() -> ChainResult<(), Func2Error> { -# /// let filename = "foo.txt"; -# /// do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?; -# /// Ok(()) -# /// } -# /// -# /// derive_str_cherr!(Func1Error); -# /// -# /// fn func1() -> Result<(), Box<Error>> { -# /// func2().map_err(mstrerr!(Func1Error, "func1 error"))?; -# /// Ok(()) -# /// } -# /// # -# /// # fn main() { -# /// # if let Err(e) = func1() { -# /// # if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() { -# /// # assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some()); -# /// # assert!(f1err.find_chain_cause::<Func2Error>().is_some()); -# /// # } else { -# /// # panic!(); -# /// # } -# /// # } else { -# /// # unreachable!(); -# /// # } -# /// # } -# /// ~~~ -# #[macro_export] -# macro_rules! derive_str_cherr { -# ($e:ident) => { -# pub struct $e(pub String); -# impl ::std::fmt::Display for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}", self.0) -# } -# } -# impl ::std::fmt::Debug for $e { -# fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { -# write!(f, "{}({})", stringify!($e), self.0) -# } -# } -# impl ::std::error::Error for $e {} -# }; -# } -# } - +#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
@@ -1168,6 +255,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial8.html b/tutorial8.html index 4582b1e..c628b2a 100644 --- a/tutorial8.html +++ b/tutorial8.html @@ -1,9 +1,11 @@ - + Finding an Error cause - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,7 +148,7 @@
-

Finding an Error cause

+

Finding an Error cause

To distinguish the errors occuring in various places, we can define named string errors with the "new type" pattern.

derive_str_cherr!(Func2Error);
@@ -160,14 +168,14 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -175,12 +183,12 @@ fn func2() -> Result<(), Box<Error>> {
 
 derive_str_cherr!(Func1Error);
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
             eprintln!("Func1Error: {}", f1err);
@@ -196,932 +204,11 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
@@ -1165,6 +252,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + + diff --git a/tutorial9.html b/tutorial9.html index d07e88b..4e6dbf0 100644 --- a/tutorial9.html +++ b/tutorial9.html @@ -1,9 +1,11 @@ - + Selective Error Handling - chainerror + + @@ -30,11 +32,11 @@ - + @@ -56,10 +58,13 @@ @@ -75,7 +80,10 @@
@@ -105,7 +113,7 @@
-

chainerror

+

chainerror

@@ -140,11 +148,11 @@
-

Selective Error Handling

+

Selective Error Handling

What about functions returning different Error types?

In this example func1() can return either Func1ErrorFunc2 or Func1ErrorIO.

We might want to match on func1() with something like:

-
fn main() -> Result<(), Box<Error>> {
+
fn main() -> Result<(), Box<Error + Send + Sync>> {
     match func1() {
         Err(e) if let Some(s) = e.downcast_chain_ref::<Func1ErrorIO>() =>
         eprintln!("Func1ErrorIO:\n{:?}", s),
@@ -164,14 +172,14 @@ use std::error::Error;
 use std::io;
 use std::result::Result;
 
-fn do_some_io() -> Result<(), Box<Error>> {
+fn do_some_io() -> Result<(), Box<Error + Send + Sync>> {
     Err(io::Error::from(io::ErrorKind::NotFound))?;
     Ok(())
 }
 
 derive_str_cherr!(Func2Error);
 
-fn func2() -> Result<(), Box<Error>> {
+fn func2() -> Result<(), Box<Error + Send + Sync>> {
     let filename = "foo.txt";
     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
     Ok(())
@@ -180,14 +188,14 @@ fn func2() -> Result<(), Box<Error>> {
 derive_str_cherr!(Func1ErrorFunc2);
 derive_str_cherr!(Func1ErrorIO);
 
-fn func1() -> Result<(), Box<Error>> {
+fn func1() -> Result<(), Box<Error + Send + Sync>> {
     func2().map_err(mstrerr!(Func1ErrorFunc2, "func1 error calling func2"))?;
     let filename = "bar.txt";
     do_some_io().map_err(mstrerr!(Func1ErrorIO, "Error reading '{}'", filename))?;
     Ok(())
 }
 
-fn main() -> Result<(), Box<Error>> {
+fn main() -> Result<(), Box<Error + Send + Sync>> {
     if let Err(e) = func1() {
         if let Some(s) = e.downcast_ref::<ChainError<Func1ErrorIO>>() {
             eprintln!("Func1ErrorIO:\n{:?}", s);
@@ -199,932 +207,11 @@ fn main() -> Result<(), Box<Error>> {
     }
     Ok(())
 }
-
-# #[allow(dead_code)]
-# mod chainerror {
-# //! `chainerror` provides an error backtrace without doing a real backtrace, so even after you `strip` your
-# //! binaries, you still have the error backtrace.
-# //!
-# //! `chainerror` has no dependencies!
-# //!
-# //! `chainerror` uses `.source()` of `std::error::Error` along with `line()!` and `file()!` to provide a nice debug error backtrace.
-# //! It encapsulates all types, which have `Display + Debug` and can store the error cause internally.
-# //!
-# //! Along with the `ChainError<T>` struct, `chainerror` comes with some useful helper macros to save a lot of typing.
-# //!
-# //! ## Features
-# //!
-# //! `no-fileline`
-# //! : completely turn off storing filename and line
-# //!
-# //! `display-cause`
-# //! : turn on printing a backtrace of the errors in `Display`
-# //!
-# //! `no-debug-cause`
-# //! : turn off printing a backtrace of the errors in `Debug`
-# //!
-# //!
-# //! # Tutorial
-# //!
-# //! Read the [Tutorial](https://haraldh.github.io/chainerror/tutorial1.html)
-# //!
-# //! # Examples
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func2() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func1() -> Result<(), Box<Error>> {
-# //!     func2().map_err(mstrerr!("func1 error"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:20: func1 error
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# //!
-# //!
-# //! ~~~rust
-# //! use chainerror::*;
-# //! use std::error::Error;
-# //! use std::io;
-# //! use std::result::Result;
-# //!
-# //! fn do_some_io() -> Result<(), Box<Error>> {
-# //!     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn func3() -> Result<(), Box<Error>> {
-# //!     let filename = "foo.txt";
-# //!     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! derive_str_cherr!(Func2Error);
-# //!
-# //! fn func2() -> ChainResult<(), Func2Error> {
-# //!     func3().map_err(mstrerr!(Func2Error, "func2 error: calling func3"))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! enum Func1Error {
-# //!     Func2,
-# //!     IO(String),
-# //! }
-# //!
-# //! impl ::std::fmt::Display for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         match self {
-# //!             Func1Error::Func2 => write!(f, "func1 error calling func2"),
-# //!             Func1Error::IO(filename) => write!(f, "Error reading '{}'", filename),
-# //!         }
-# //!     }
-# //! }
-# //!
-# //! impl ::std::fmt::Debug for Func1Error {
-# //!     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# //!         write!(f, "{}", self)
-# //!     }
-# //! }
-# //!
-# //! fn func1() -> ChainResult<(), Func1Error> {
-# //!     func2().map_err(|e| cherr!(e, Func1Error::Func2))?;
-# //!     let filename = String::from("bar.txt");
-# //!     do_some_io().map_err(|e| cherr!(e, Func1Error::IO(filename)))?;
-# //!     Ok(())
-# //! }
-# //!
-# //! fn main() {
-# //!     if let Err(e) = func1() {
-# //!         assert!(
-# //!             match e.kind() {
-# //!                 Func1Error::Func2 => {
-# //!                     eprintln!("Main Error Report: func1 error calling func2");
-# //!                     true
-# //!                 }
-# //!                 Func1Error::IO(filename) => {
-# //!                     eprintln!("Main Error Report: func1 error reading '{}'", filename);
-# //!                     false
-# //!                 }
-# //!             }
-# //!         );
-# //!
-# //!         assert!(e.find_chain_cause::<Func2Error>().is_some());
-# //!
-# //!         if let Some(e) = e.find_chain_cause::<Func2Error>() {
-# //!             eprintln!("\nError reported by Func2Error: {}", e)
-# //!         }
-# //!
-# //!
-# //!         assert!(e.root_cause().is_some());
-# //!
-# //!         if let Some(e) = e.root_cause() {
-# //!             let ioerror = e.downcast_ref::<io::Error>().unwrap();
-# //!             eprintln!("\nThe root cause was: std::io::Error: {:#?}", ioerror);
-# //!         }
-# //!
-# //!         #[cfg(not(windows))]
-# //!         assert_eq!(
-# //!             format!("\n{:?}\n", e), r#"
-# //! src/lib.rs:47: func1 error calling func2
-# //! Caused by:
-# //! src/lib.rs:22: Func2Error(func2 error: calling func3)
-# //! Caused by:
-# //! src/lib.rs:15: Error reading 'foo.txt'
-# //! Caused by:
-# //! Kind(NotFound)
-# //! "#
-# //!         );
-# //!     }
-# //! #    else {
-# //! #        unreachable!();
-# //! #    }
-# //! }
-# //! ~~~
-# 
-# use std::any::TypeId;
-# use std::error::Error;
-# use std::fmt::{Debug, Display, Formatter, Result};
-# 
-# /// chains an inner error kind `T` with a causing error
-# pub struct ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     occurrence: Option<(u32, &'static str)>,
-#     kind: T,
-#     error_cause: Option<Box<dyn Error + 'static>>,
-# }
-# 
-# /// convenience type alias
-# pub type ChainResult<O, E> = std::result::Result<O, ChainError<E>>;
-# 
-# impl<T: 'static + Display + Debug> ChainError<T> {
-#     #[cfg(not(feature = "no-fileline"))]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self {
-#             occurrence,
-#             kind,
-#             error_cause,
-#         }
-#     }
-# 
-#     #[cfg(feature = "no-fileline")]
-#     /// Use the `cherr!()` or `mstrerr!()` macro instead of calling this directly
-#     pub fn new(
-#         kind: T,
-#         error_cause: Option<Box<dyn Error + 'static>>,
-#         _occurrence: Option<(u32, &'static str)>,
-#     ) -> Self {
-#         Self { kind, error_cause }
-#     }
-# 
-#     /// return the root cause of the error chain, if any exists
-#     pub fn root_cause(&self) -> Option<&(dyn Error + 'static)> {
-#         self.iter().last()
-#     }
-# 
-#     /// Find the first error cause of type U, if any exists
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func1Error);
-#     ///
-#     /// fn func1() -> Result<(), Box<Error>> {
-#     ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-#     ///
-#     ///             assert!(f1err.find_cause::<io::Error>().is_some());
-#     ///
-#     ///             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-#     ///         }
-#     /// #        else {
-#     /// #            panic!();
-#     /// #        }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn find_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter().filter_map(Error::downcast_ref::<U>).next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>`, if any exists
-#     ///
-#     /// Same as `find_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooError>>();
-#     ///
-#     /// // leave out the ChainError<FooError> implementation detail
-#     /// err.find_chain_cause::<FooError>();
-#     /// ~~~
-#     pub fn find_chain_cause<U: Error + 'static>(&self) -> Option<&ChainError<U>> {
-#         self.iter()
-#             .filter_map(Error::downcast_ref::<ChainError<U>>)
-#             .next()
-#     }
-# 
-#     /// Find the first error cause of type `ChainError<U>` or `U`, if any exists and return `U`
-#     ///
-#     /// Same as `find_cause` and `find_chain_cause`, but hides the `ChainError<U>` implementation internals
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust,ignore
-#     /// // Instead of writing
-#     /// err.find_cause::<ChainError<FooErrorKind>>();
-#     /// // and/or
-#     /// err.find_chain_cause::<FooErrorKind>();
-#     /// // and/or
-#     /// err.find_cause::<FooErrorKind>();
-#     ///
-#     /// // leave out the ChainError<FooErrorKind> implementation detail
-#     /// err.find_chain_or_kind::<FooErrorKind>();
-#     /// ~~~
-#     pub fn find_kind_or_cause<U: Error + 'static>(&self) -> Option<&U> {
-#         self.iter()
-#             .filter_map(|e| {
-#                 e.downcast_ref::<ChainError<U>>()
-#                     .map(|e| e.kind())
-#                     .or_else(|| e.downcast_ref::<U>())
-#             })
-#             .next()
-#     }
-# 
-#     /// Return a reference to T of `ChainError<T>`
-#     ///
-#     /// # Examples
-#     ///
-#     /// ~~~rust
-#     /// # use crate::chainerror::*;
-#     /// # use std::error::Error;
-#     /// # use std::io;
-#     /// # use std::result::Result;
-#     /// #
-#     /// fn do_some_io() -> Result<(), Box<Error>> {
-#     ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// derive_str_cherr!(Func2Error);
-#     ///
-#     /// fn func2() -> Result<(), Box<Error>> {
-#     ///     let filename = "foo.txt";
-#     ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// #[derive(Debug)]
-#     /// enum Func1ErrorKind {
-#     ///     Func2,
-#     ///     IO(String),
-#     /// }
-#     ///
-#     /// /// impl ::std::fmt::Display for Func1ErrorKind {…}
-#     /// # impl ::std::fmt::Display for Func1ErrorKind {
-#     /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#     /// #         match self {
-#     /// #             Func1ErrorKind::Func2 => write!(f, "func1 error calling func2"),
-#     /// #             Func1ErrorKind::IO(filename) => write!(f, "Error reading '{}'", filename),
-#     /// #         }
-#     /// #     }
-#     /// # }
-#     ///
-#     /// fn func1() -> ChainResult<(), Func1ErrorKind> {
-#     ///     func2().map_err(|e| cherr!(e, Func1ErrorKind::Func2))?;
-#     ///     do_some_io().map_err(|e| cherr!(e, Func1ErrorKind::IO("bar.txt".into())))?;
-#     ///     Ok(())
-#     /// }
-#     ///
-#     /// fn main() {
-#     ///     if let Err(e) = func1() {
-#     ///         match e.kind() {
-#     ///             Func1ErrorKind::Func2 => {},
-#     ///             Func1ErrorKind::IO(filename) => panic!(),
-#     ///         }
-#     ///     }
-#     /// #    else {
-#     /// #         unreachable!();
-#     /// #    }
-#     /// }
-#     /// ~~~
-#     pub fn kind(&self) -> &T {
-#         &self.kind
-#     }
-# 
-#     /// Returns an Iterator over all error causes/sources
-#     ///
-#     /// # Example
-#     ///
-#     ///
-#     pub fn iter(&self) -> impl Iterator<Item = &(dyn Error + 'static)> {
-#         ErrorIter {
-#             current: Some(self),
-#         }
-#     }
-# }
-# 
-# struct ErrorIter<'a> {
-#     current: Option<&'a (dyn Error + 'static)>,
-# }
-# 
-# impl<'a> Iterator for ErrorIter<'a> {
-#     type Item = &'a (dyn Error + 'static);
-# 
-#     fn next(&mut self) -> Option<Self::Item> {
-#         let current = self.current;
-#         self.current = self.current.and_then(Error::source);
-#         current
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> std::ops::Deref for ChainError<T> {
-#     type Target = T;
-# 
-#     fn deref(&self) -> &Self::Target {
-#         &self.kind
-#     }
-# }
-# 
-# /// Convenience trait to hide the `ChainError<T>` implementation internals
-# pub trait ChainErrorDown {
-#     /// Test if of type `ChainError<T>`
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool;
-#     /// Downcast to a reference of `ChainError<T>`
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>>;
-#     /// Downcast to a mutable reference of `ChainError<T>`
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>>;
-# }
-# 
-# impl<U: 'static + Display + Debug> ChainErrorDown for ChainError<U> {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         TypeId::of::<T>() == TypeId::of::<U>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&*(self as *const dyn Error as *const &ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         if self.is_chain::<T>() {
-#             #[allow(clippy::cast_ptr_alignment)]
-#             unsafe {
-#                 Some(&mut *(self as *mut dyn Error as *mut &mut ChainError<T>))
-#             }
-#         } else {
-#             None
-#         }
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl ChainErrorDown for dyn Error + 'static + Send + Sync {
-#     fn is_chain<T: 'static + Display + Debug>(&self) -> bool {
-#         self.is::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_ref<T: 'static + Display + Debug>(&self) -> Option<&ChainError<T>> {
-#         self.downcast_ref::<ChainError<T>>()
-#     }
-# 
-#     fn downcast_chain_mut<T: 'static + Display + Debug>(&mut self) -> Option<&mut ChainError<T>> {
-#         self.downcast_mut::<ChainError<T>>()
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Error for &mut ChainError<T> {
-#     fn source(&self) -> Option<&(dyn Error + 'static)> {
-#         self.error_cause.as_ref().map(|e| e.as_ref())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Display for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         write!(f, "{}", self.kind)?;
-# 
-#         #[cfg(feature = "display-cause")]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Display::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# impl<T: 'static + Display + Debug> Debug for ChainError<T> {
-#     fn fmt(&self, f: &mut Formatter) -> Result {
-#         #[cfg(not(feature = "no-fileline"))]
-#         {
-#             if let Some(o) = self.occurrence {
-#                 write!(f, "{}:{}: ", o.1, o.0)?;
-#             }
-#         }
-# 
-#         if self.is_chain::<String>() {
-#             Display::fmt(&self.kind, f)?;
-#         } else {
-#             Debug::fmt(&self.kind, f)?;
-#         }
-# 
-#         #[cfg(not(feature = "no-debug-cause"))]
-#         {
-#             if let Some(e) = self.source() {
-#                 writeln!(f, "\nCaused by:")?;
-#                 Debug::fmt(&e, f)?;
-#             }
-#         }
-#         Ok(())
-#     }
-# }
-# 
-# pub trait ChainErrorFrom<T>: Sized {
-#     fn chain_error_from(_: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self>;
-# }
-# 
-# pub trait IntoChainError<T>: Sized {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<T>;
-# }
-# 
-# impl<T, U> IntoChainError<U> for T
-# where
-#     U: ChainErrorFrom<T>,
-# {
-#     fn into_chain_error(self, line_filename: Option<(u32, &'static str)>) -> ChainError<U> {
-#         U::chain_error_from(self, line_filename)
-#     }
-# }
-# 
-# impl<T, U> ChainErrorFrom<T> for U
-# where
-#     T: Into<U>,
-#     U: 'static + Display + Debug,
-# {
-#     fn chain_error_from(t: T, line_filename: Option<(u32, &'static str)>) -> ChainError<Self> {
-#         let e: U = t.into();
-#         ChainError::<_>::new(e, None, line_filename)
-#     }
-# }
-# 
-# #[macro_export]
-# macro_rules! minto_cherr {
-#     ( ) => {
-#         |e| e.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# #[macro_export]
-# macro_rules! into_cherr {
-#     ( $t:expr ) => {
-#         $t.into_chain_error(Some((line!(), file!())))
-#     };
-# }
-# 
-# /// Creates a new `ChainError<T>`
-# ///
-# /// # Examples
-# ///
-# /// Create a new ChainError<FooError>, where `FooError` must implement `Display` and `Debug`.
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// #
-# /// # #[derive(Debug)]
-# /// enum FooError {
-# ///     Bar,
-# ///     Baz(&'static str),
-# /// }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# ///
-# /// //  impl ::std::fmt::Display for FooError
-# ///
-# /// fn do_some_stuff() -> bool {
-# ///     false
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     if ! do_some_stuff() {
-# ///         Err(cherr!(FooError::Baz("Error")))?;
-# ///     }
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// Additionally an error cause can be added.
-# ///
-# /// ~~~rust
-# /// # use chainerror::*;
-# /// # use std::io;
-# /// # use std::error::Error;
-# /// #
-# /// # #[derive(Debug)]
-# /// # enum FooError {
-# /// #     Bar,
-# /// #     Baz(&'static str),
-# /// # }
-# /// #
-# /// # impl ::std::fmt::Display for FooError {
-# /// #     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-# /// #         match self {
-# /// #             FooError::Bar => write!(f, "Bar Error"),
-# /// #             FooError::Baz(s) => write!(f, "Baz Error: '{}'", s),
-# /// #         }
-# /// #     }
-# /// # }
-# /// #
-# /// fn do_some_stuff() -> Result<(), Box<Error>> {
-# ///     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func() -> ChainResult<(), FooError> {
-# ///     do_some_stuff().map_err(
-# ///         |e| cherr!(e, FooError::Baz("Error"))
-# ///     )?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # pub fn main() {
-# /// #     match func().unwrap_err().kind() {
-# /// #         FooError::Baz(s) if s == &"Error" => {},
-# /// #         _ => panic!(),
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! cherr {
-#     ( $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $k:expr ) => ({
-#         ChainError::<_>::new($k, None, Some((line!(), file!())))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( None, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!(None, format!($fmt, $($arg)+ ))
-#     });
-#     ( $e:path, $k:expr ) => ({
-#         ChainError::<_>::new($k, Some(Box::from($e)), Some((line!(), file!())))
-#     });
-#     ( $e:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($e, format!($fmt, $($arg)+ ))
-#     });
-# 
-# }
-# 
-# /// Convenience macro for `|e| cherr!(e, format!(…))`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!("Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!("func1 error"))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         #[cfg(not(windows))]
-# /// #         assert_eq!(
-# /// #             format!("\n{:?}\n", e), r#"
-# /// # src/lib.rs:20: func1 error
-# /// # Caused by:
-# /// # src/lib.rs:15: Error reading 'foo.txt'
-# /// # Caused by:
-# /// # Kind(NotFound)
-# /// # "#
-# /// #         );
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# ///
-# /// `mstrerr!()` can also be used to map a new `ChainError<T>`, where T was defined with
-# /// `derive_str_cherr!(T)`
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> Result<(), Box<Error>> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! mstrerr {
-#     ( $t:path, $msg:expr ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         |e| cherr!(e, $t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         |e| cherr!(e, $t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         |e| cherr!(e, $msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         |e| cherr!(e, format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro for `cherr!(T(format!(…)))` where `T(String)`
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::result::Result;
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     Err(strerr!(Func2Error, "Error reading '{}'", filename))
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! strerr {
-#     ( $t:path, $msg:expr ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $msg:expr, ) => ({
-#         cherr!($t ($msg.to_string()))
-#     });
-#     ( $t:path, $fmt:expr, $($arg:tt)+ ) => ({
-#         cherr!($t (format!($fmt, $($arg)+ )))
-#     });
-#     ($msg:expr) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($msg:expr, ) => ({
-#         cherr!($msg.to_string())
-#     });
-#     ($fmt:expr, $($arg:tt)+) => ({
-#         cherr!(format!($fmt, $($arg)+ ))
-#     });
-# }
-# 
-# /// Convenience macro to create a "new type" T(String) and implement Display + Debug for T
-# ///
-# /// # Examples
-# ///
-# /// ~~~rust
-# /// # use crate::chainerror::*;
-# /// # use std::error::Error;
-# /// # use std::io;
-# /// # use std::result::Result;
-# /// #
-# /// # fn do_some_io() -> Result<(), Box<Error>> {
-# /// #     Err(io::Error::from(io::ErrorKind::NotFound))?;
-# /// #     Ok(())
-# /// # }
-# /// #
-# /// derive_str_cherr!(Func2Error);
-# ///
-# /// fn func2() -> ChainResult<(), Func2Error> {
-# ///     let filename = "foo.txt";
-# ///     do_some_io().map_err(mstrerr!(Func2Error, "Error reading '{}'", filename))?;
-# ///     Ok(())
-# /// }
-# ///
-# /// derive_str_cherr!(Func1Error);
-# ///
-# /// fn func1() -> Result<(), Box<Error>> {
-# ///     func2().map_err(mstrerr!(Func1Error, "func1 error"))?;
-# ///     Ok(())
-# /// }
-# /// #
-# /// # fn main() {
-# /// #     if let Err(e) = func1() {
-# /// #         if let Some(f1err) = e.downcast_chain_ref::<Func1Error>() {
-# /// #             assert!(f1err.find_cause::<ChainError<Func2Error>>().is_some());
-# /// #             assert!(f1err.find_chain_cause::<Func2Error>().is_some());
-# /// #         } else {
-# /// #             panic!();
-# /// #         }
-# /// #     } else {
-# /// #         unreachable!();
-# /// #     }
-# /// # }
-# /// ~~~
-# #[macro_export]
-# macro_rules! derive_str_cherr {
-#     ($e:ident) => {
-#         pub struct $e(pub String);
-#         impl ::std::fmt::Display for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}", self.0)
-#             }
-#         }
-#         impl ::std::fmt::Debug for $e {
-#             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-#                 write!(f, "{}({})", stringify!($e), self.0)
-#             }
-#         }
-#         impl ::std::error::Error for $e {}
-#     };
-# }
-# }
-
+#[allow(dead_code)] +mod chainerror { +{{#includecomment ../src/lib.rs}} +} +
@@ -1168,6 +255,14 @@ fn main() -> Result<(), Box<Error>> { + + + + + +