diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
new file mode 100644
index 0000000..555d0e6
--- /dev/null
+++ b/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "d5351f7215c6c5bca11f704ed41d9ae768b43007"
+  },
+  "path_in_vcs": "mockall"
+}
\ No newline at end of file
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..b195dda
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,29 @@
+// This file is generated by cargo2android.py --config cargo2android.json.
+// Do not modify this file as changes will be overridden on upgrade.
+
+
+
+rust_library {
+    name: "libmockall",
+    host_supported: true,
+    crate_name: "mockall",
+    cargo_env_compat: true,
+    cargo_pkg_version: "0.11.4",
+    srcs: ["src/lib.rs"],
+    edition: "2018",
+    rustlibs: [
+        "libcfg_if",
+        "libdowncast",
+        "libfragile",
+        "liblazy_static",
+        "libpredicates",
+        "libpredicates_tree",
+    ],
+    proc_macros: ["libmockall_derive"],
+    apex_available: [
+        "//apex_available:platform",
+        "//apex_available:anyapex",
+    ],
+    product_available: true,
+    vendor_available: true,
+}
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..d1116b2
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,424 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "difflib"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+
+[[package]]
+name = "downcast"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "float-cmp"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "fragile"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
+
+[[package]]
+name = "futures"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2"
+
+[[package]]
+name = "futures-task"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a"
+
+[[package]]
+name = "futures-util"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "mockall"
+version = "0.11.4"
+dependencies = [
+ "async-trait",
+ "cfg-if",
+ "downcast",
+ "fragile",
+ "futures",
+ "lazy_static",
+ "mockall_derive",
+ "mockall_double",
+ "predicates",
+ "predicates-tree",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tracing",
+]
+
+[[package]]
+name = "mockall_derive"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb"
+dependencies = [
+ "cfg-if",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "mockall_double"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae71c7bb287375187c775cf82e2dcf1bef3388aaf58f0789a77f9c7ab28466f6"
+dependencies = [
+ "cfg-if",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "normalize-line-endings"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "predicates"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95e5a7689e456ab905c22c2b48225bb921aba7c8dfa58440d68ba13f6222a715"
+dependencies = [
+ "difflib",
+ "float-cmp",
+ "itertools",
+ "normalize-line-endings",
+ "predicates-core",
+ "regex",
+]
+
+[[package]]
+name = "predicates-core"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb"
+
+[[package]]
+name = "predicates-tree"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032"
+dependencies = [
+ "predicates-core",
+ "termtree",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "serde"
+version = "1.0.158"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
+
+[[package]]
+name = "serde_derive"
+version = "1.0.156"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.94"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "termtree"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..8b09c17
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,109 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2018"
+rust-version = "1.45"
+name = "mockall"
+version = "0.11.4"
+authors = ["Alan Somers <asomers@gmail.com>"]
+exclude = [
+    "examples/*",
+    "tests/*",
+    "tools/*",
+]
+description = """
+A powerful mock object library for Rust.
+"""
+documentation = "https://docs.rs/mockall"
+readme = "README.md"
+keywords = [
+    "mock",
+    "mocking",
+    "testing",
+]
+categories = ["development-tools::testing"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/asomers/mockall"
+
+[package.metadata.docs.rs]
+features = ["nightly"]
+
+[package.metadata.release]
+tag-prefix = ""
+
+[[package.metadata.release.pre-release-replacements]]
+file = "../README.md"
+replace = "mockall = \"{{version}}\""
+search = 'mockall = "[a-z0-9\.-]+"'
+
+[[package.metadata.release.pre-release-replacements]]
+file = "../CHANGELOG.md"
+replace = "{{version}}"
+search = "Unreleased"
+
+[[package.metadata.release.pre-release-replacements]]
+file = "../CHANGELOG.md"
+replace = "{{date}}"
+search = "ReleaseDate"
+
+[[example]]
+name = "serde"
+crate-type = ["lib"]
+path = "examples/serde.rs"
+
+[dependencies.cfg-if]
+version = "1.0"
+
+[dependencies.downcast]
+version = "0.11"
+
+[dependencies.fragile]
+version = "2.0"
+
+[dependencies.lazy_static]
+version = "1.1"
+
+[dependencies.mockall_derive]
+version = "=0.11.4"
+
+[dependencies.predicates]
+version = "2.0.1"
+
+[dependencies.predicates-tree]
+version = "1.0"
+
+[dev-dependencies.async-trait]
+version = "0.1.38"
+
+[dev-dependencies.futures]
+version = "0.3.7"
+
+[dev-dependencies.mockall_double]
+version = "^0.3.0"
+
+[dev-dependencies.serde]
+version = "1.0"
+
+[dev-dependencies.serde_derive]
+version = "1.0"
+
+[dev-dependencies.serde_json]
+version = "1.0"
+
+[dev-dependencies.tracing]
+version = "0.1.23"
+
+[features]
+nightly = [
+    "mockall_derive/nightly_derive",
+    "downcast/nightly",
+]
diff --git a/LICENSE b/LICENSE
new file mode 120000
index 0000000..6b579aa
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1 @@
+LICENSE-APACHE
\ No newline at end of file
diff --git a/LICENSE-APACHE b/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/LICENSE-MIT b/LICENSE-MIT
new file mode 100644
index 0000000..39df3da
--- /dev/null
+++ b/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2019 Alan Somers
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/METADATA b/METADATA
new file mode 100644
index 0000000..f164e23
--- /dev/null
+++ b/METADATA
@@ -0,0 +1,20 @@
+name: "mockall"
+description: "()"
+third_party {
+  identifier {
+    type: "crates.io"
+    value: "https://crates.io/crates/mockall"
+  }
+  identifier {
+    type: "Archive"
+    value: "https://static.crates.io/crates/mockall/mockall-0.11.4.crate"
+  }
+  version: "0.11.4"
+  # Dual-licensed, using the least restrictive per go/thirdpartylicenses#same.
+  license_type: NOTICE
+  last_upgrade_date {
+    year: 2023
+    month: 11
+    day: 6
+  }
+}
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_APACHE2
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..48bea6e
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 688011
+include platform/prebuilts/rust:main:/OWNERS
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2bce129
--- /dev/null
+++ b/README.md
@@ -0,0 +1,84 @@
+# Mockall
+
+A powerful mock object library for Rust.
+
+[![Build Status](https://api.cirrus-ci.com/github/asomers/mockall.svg)](https://cirrus-ci.com/github/asomers/mockall)
+[![Crates.io](https://img.shields.io/crates/v/mockall.svg)](https://crates.io/crates/mockall)
+[![Documentation](https://docs.rs/mockall/badge.svg)](https://docs.rs/mockall)
+
+## Overview
+
+Mock objects are a powerful technique for unit testing software.  A mock object
+is an object with the same interface as a real object, but whose responses are
+all manually controlled by test code.  They can be used to test the upper and
+middle layers of an application without instantiating the lower ones, or to
+inject edge and error cases that would be difficult or impossible to create
+when using the full stack.
+
+Statically typed languages are inherently more difficult to
+mock than dynamically typed languages. Since Rust is a statically typed language, 
+previous attempts at creating a mock object library have had mixed results. Mockall 
+incorporates the best elements of previous designs, resulting in it having a rich 
+feature set with a terse and ergonomic interface. Mockall is written in 100% *safe* 
+and *stable* Rust.
+
+## Usage
+
+Typically mockall is only used by unit tests.  To use it this way, add this to
+your `Cargo.toml`:
+
+```toml
+[dev-dependencies]
+mockall = "0.11.4"
+```
+
+Then use it like this:
+
+```rust
+#[cfg(test)]
+use mockall::{automock, mock, predicate::*};
+#[cfg_attr(test, automock)]
+trait MyTrait {
+    fn foo(&self, x: u32) -> u32;
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn mytest() {
+        let mut mock = MockMyTrait::new();
+        mock.expect_foo()
+            .with(eq(4))
+            .times(1)
+            .returning(|x| x + 1);
+        assert_eq!(5, mock.foo(4));
+    }
+}
+```
+
+See the [API docs](https://docs.rs/mockall) for more information.
+
+# Minimum Supported Rust Version (MSRV)
+
+Mockall is supported on Rust 1.42.0 and higher.  Mockall's MSRV will not be
+changed in the future without bumping the major or minor version.
+
+# License
+
+`mockall` is primarily distributed under the terms of both the MIT license
+and the Apache License (Version 2.0).
+
+See LICENSE-APACHE, and LICENSE-MIT for details
+
+# Acknowledgements
+
+Mockall was not built in a day.  JMock was probably the first popular mock
+object library.  Many ports and imitations have been made, including GoogleMock
+for C++.  Mockers, inspired by GoogleMock, was the first attempt to bring the
+concept to Rust.  The now-defunct Mock_derive was the first library to generate
+mock objects with procedural macros, greatly reducing the user's workload.
+Mockall also uses proc macros, and copies many of Mockers' features and
+conventions.  Mockall also takes inspiration from Simulacrum's internal design,
+and its technique for mocking generic methods.
diff --git a/cargo2android.json b/cargo2android.json
new file mode 100644
index 0000000..bf78496
--- /dev/null
+++ b/cargo2android.json
@@ -0,0 +1,4 @@
+{
+  "device": true,
+  "run": true
+}
\ No newline at end of file
diff --git a/src/examples.rs b/src/examples.rs
new file mode 100644
index 0000000..a630752
--- /dev/null
+++ b/src/examples.rs
@@ -0,0 +1,62 @@
+// vim: tw=80
+//! Examples of Mockall's generated code
+use mockall::{mock, automock};
+
+/// Mock of a basic trait with several kinds of method.
+///
+/// It is mocked by the [`MockFoo`](struct.MockFoo.html) struct.
+#[automock]
+pub trait Foo {
+    /// A method with a `'static` return type
+    fn foo(&self, x: i32, y: i16) -> i32;
+
+    /// A method returning a reference
+    fn bar(&self, x: i32) -> &i32;
+
+    /// A method returning a mutable reference
+    fn baz(&mut self, x: i32) -> &mut i32;
+
+    /// A method returning a `'static` reference
+    fn bean(&self) -> &'static i32;
+
+    /// A static method
+    fn bang(x: i32) -> i32;
+}
+
+/// A trait implemented by a Struct we want to mock
+pub trait Bah {
+    /// Some trait method
+    fn bah(&self);
+}
+
+mock! {
+    /// Mock of a struct
+    ///
+    /// Structs can be mocked with [`mock!`].
+    /// Their mock methods have an identical API to the methods generated by
+    /// [`#[automock]`](automock).
+    pub Boo {
+        /// A method on a struct
+        fn boo(&self);
+    }
+    /// An implementation of a trait on a mocked struct
+    trait Bah {
+        fn bah(&self);
+    }
+}
+
+#[automock(mod mock_ffi;)]
+extern "C" {
+    /// A foreign "C" function.
+    pub fn ffi_func();
+}
+
+#[cfg(feature = "nightly")]
+/// Mock this entire module
+#[automock]
+pub mod my_module {
+    /// A function in a mocked module
+    pub fn modfunc() {
+        unimplemented!()
+    }
+}
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..121fff3
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,1699 @@
+// vim: tw=80
+//! A powerful mock object library for Rust.
+//!
+//! Mockall provides tools to create mock versions of almost any trait
+//! or struct. They can be used in unit tests as a stand-in for the real
+//! object.
+//!
+//! # Usage
+//!
+//! There are two ways to use Mockall.  The easiest is to use
+//! [`#[automock]`](attr.automock.html).  It can mock most traits, or structs
+//! that only have a single `impl` block.  For things it can't handle, there is
+//! [`mock!`].
+//!
+//! Whichever method is used, the basic idea is the same.
+//! * Create a mock struct.  It's name will be the same as the original, with
+//!   "Mock" prepended.
+//! * In your test, instantiate the mock struct with its `new` or `default`
+//!   method.
+//! * Set expectations on the mock struct.  Each expectation can have required
+//!   argument matchers, a required call count, and a required position in a
+//!   [`Sequence`].  Each expectation must also have a return value.
+//! * Supply the mock object to the code that you're testing.  It will return
+//!   the preprogrammed return values supplied in the previous step.  Any
+//!   accesses contrary to your expectations will cause a panic.
+//!
+//! # User Guide
+//!
+//! * [`Getting started`](#getting-started)
+//! * [`Static Return values`](#static-return-values)
+//! * [`Matching arguments`](#matching-arguments)
+//! * [`Call counts`](#call-counts)
+//! * [`Sequences`](#sequences)
+//! * [`Checkpoints`](#checkpoints)
+//! * [`Reference arguments`](#reference-arguments)
+//! * [`Reference return values`](#reference-return-values)
+//! * [`impl Trait`](#impl-trait)
+//! * [`Mocking structs`](#mocking-structs)
+//! * [`Generic methods`](#generic-methods)
+//! * [`Methods with generic lifetimes`](#methods-with-generic-lifetimes)
+//! * [`Generic traits and structs`](#generic-traits-and-structs)
+//! * [`Associated types`](#associated-types)
+//! * [`Multiple and inherited traits`](#multiple-and-inherited-traits)
+//! * [`External traits`](#external-traits)
+//! * [`Static methods`](#static-methods)
+//! * [`Modules`](#modules)
+//! * [`Foreign functions`](#foreign-functions)
+//! * [`Debug`](#debug)
+//! * [`Async Traits`](#async-traits)
+//! * [`Crate features`](#crate-features)
+//! * [`Examples`](#examples)
+//!
+//! ## Getting Started
+//! ```
+//! use mockall::*;
+//! use mockall::predicate::*;
+//! #[automock]
+//! trait MyTrait {
+//!     fn foo(&self, x: u32) -> u32;
+//! }
+//!
+//! fn call_with_four(x: &MyTrait) -> u32 {
+//!     x.foo(4)
+//! }
+//!
+//! let mut mock = MockMyTrait::new();
+//! mock.expect_foo()
+//!     .with(predicate::eq(4))
+//!     .times(1)
+//!     .returning(|x| x + 1);
+//! assert_eq!(5, call_with_four(&mock));
+//! ```
+//!
+//! ## Static Return values
+//!
+//! Every expectation must have an associated return value (though when the
+//! **nightly** feature is enabled expectations will automatically return the
+//! default values of their return types, if their return types implement
+//! `Default`.).  For methods that return a `static` value, the macros will
+//! generate an `Expectation` struct like
+//! [`this`](examples::__mock_MockFoo_Foo::__foo::Expectation).
+//! There are two ways to set such an expectation's return value: with a
+//! constant
+//! ([`return_const`](examples::__mock_MockFoo_Foo::__foo::Expectation::return_const))
+//! or a closure
+//! ([`returning`](examples::__mock_MockFoo_Foo::__foo::Expectation::returning)).
+//! A closure will take the method's arguments by value.
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock]
+//! trait MyTrait {
+//!     fn foo(&self) -> u32;
+//!     fn bar(&self, x: u32, y: u32) -> u32;
+//! }
+//!
+//! let mut mock = MockMyTrait::new();
+//! mock.expect_foo()
+//!     .return_const(42u32);
+//! mock.expect_bar()
+//!     .returning(|x, y| x + y);
+//! ```
+//!
+//! Additionally, constants that aren't `Clone` can be returned with the
+//! [`return_once`](examples::__mock_MockFoo_Foo::__foo::Expectation::return_once)
+//! method.
+//!
+//! ```
+//! # use mockall::*;
+//! struct NonClone();
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self) -> NonClone;
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! let r = NonClone{};
+//! mock.expect_foo()
+//!     .return_once(move || r);
+//! # }
+//! ```
+//!
+//! `return_once` can also be used for computing the return value with an
+//! `FnOnce` closure.  This is useful for returning a non-`Clone` value and also
+//! triggering side effects at the same time.
+//!
+//! ```
+//! # use mockall::*;
+//! fn do_something() {}
+//!
+//! struct NonClone();
+//!
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self) -> NonClone;
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! let r = NonClone{};
+//! mock.expect_foo()
+//!     .return_once(move || {
+//!         do_something();
+//!         r
+//!     });
+//! # }
+//! ```
+//!
+//! Mock objects are always `Send`.  If you need to use a return type that
+//! isn't, you can use the
+//! [`return_const_st`](examples::__mock_MockFoo_Foo::__foo::Expectation::return_const_st),
+//! [`returning_st`](examples::__mock_MockFoo_Foo::__foo::Expectation::returning_st),
+//! or
+//! [`return_once_st`](examples::__mock_MockFoo_Foo::__foo::Expectation::return_once_st),
+//! methods. If you need to match arguments that are not `Send`, you can use the
+//! [`withf_st`](examples::__mock_MockFoo_Foo::__foo::Expectation::withf_st)
+//! These take a non-`Send` object and add runtime access checks.  The wrapped
+//! object will be `Send`, but accessing it from multiple threads will cause a
+//! runtime panic.
+//!
+//! ```
+//! # use mockall::*;
+//! # use std::rc::Rc;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self, x: Rc<u32>) -> Rc<u32>;   // Rc<u32> isn't Send
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! let x = Rc::new(5);
+//! let argument = x.clone();
+//! mock.expect_foo()
+//!     .withf_st(move |x| *x == argument)
+//!     .returning_st(move |_| Rc::new(42u32));
+//! assert_eq!(42, *mock.foo(x));
+//! # }
+//! ```
+//!
+//! ## Matching arguments
+//!
+//! Optionally, expectations may have argument matchers set.  A matcher will
+//! verify that the expectation was called with the expected arguments, or panic
+//! otherwise.  A matcher is anything that implements the [`Predicate`] trait.
+//! For example:
+//!
+//! ```should_panic
+//! # use mockall::*;
+//! # use mockall::predicate::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self, x: u32);
+//! }
+//!
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .with(eq(42))
+//!     .return_const(());
+//!
+//! mock.foo(0);    // Panics!
+//! ```
+//!
+//! See [`predicate`] for a list of Mockall's builtin predicate functions.
+//! For convenience,
+//! [`withf`](examples::__mock_MockFoo_Foo::__foo::Expectation::withf)
+//! is a shorthand for setting the commonly used
+//! [`function`] predicate.  The arguments to the predicate function are the
+//! method's arguments, *by reference*.  For example:
+//!
+//! ```should_panic
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self, x: u32, y: u32);
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .withf(|x: &u32, y: &u32| x == y)
+//!     .return_const(());
+//!
+//! mock.foo(2 + 2, 5);    // Panics!
+//! # }
+//! ```
+//!
+//! ### Matching multiple calls
+//!
+//! Matchers can also be used to discriminate between different invocations of
+//! the same function.  Used that way, they can provide different return values
+//! for different arguments.  The way this works is that on a method call, all
+//! expectations set on a given method are evaluated in FIFO order.  The first
+//! matching expectation is used.  Only if none of the expectations match does
+//! Mockall panic.  For example:
+//!
+//! ```
+//! # use mockall::*;
+//! # use mockall::predicate::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self, x: u32) -> u32;
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .with(eq(5))
+//!     .return_const(50u32);
+//! mock.expect_foo()
+//!     .with(eq(6))
+//!     .return_const(60u32);
+//! # }
+//! ```
+//!
+//! One common pattern is to use multiple expectations in order of decreasing
+//! specificity.  The last expectation can provide a default or fallback value,
+//! and earlier ones can be more specific.  For example:
+//!
+//! ```
+//! # use mockall::*;
+//! # use mockall::predicate::*;
+//! #[automock]
+//! trait Foo {
+//!     fn open(&self, path: String) -> Option<u32>;
+//! }
+//!
+//! let mut mock = MockFoo::new();
+//! mock.expect_open()
+//!     .with(eq(String::from("something.txt")))
+//!     .returning(|_| Some(5));
+//! mock.expect_open()
+//!     .return_const(None);
+//! ```
+//!
+//! ## Call counts
+//!
+//! By default, every expectation is allowed to be called an unlimited number of
+//! times.  But Mockall can optionally verify that an expectation was called a
+//! fixed number of times, or any number of times within a given range.
+//!
+//! ```should_panic
+//! # use mockall::*;
+//! # use mockall::predicate::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self, x: u32);
+//! }
+//!
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .times(1)
+//!     .return_const(());
+//!
+//! mock.foo(0);    // Ok
+//! mock.foo(1);    // Panics!
+//! ```
+//!
+//! See also
+//! [`never`](examples::__mock_MockFoo_Foo::__foo::Expectation::never) and
+//! [`times`](examples::__mock_MockFoo_Foo::__foo::Expectation::times).
+//!
+//! ## Sequences
+//!
+//! By default expectations may be matched in any order.  But it's possible to
+//! specify the order by using a [`Sequence`].  Any expectations may be added to
+//! the same sequence.  They don't even need to come from the same object.
+//!
+//! ```should_panic(expected = "Method sequence violation")
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self);
+//! }
+//!
+//! # fn main() {
+//! let mut seq = Sequence::new();
+//!
+//! let mut mock1 = MockFoo::new();
+//! mock1.expect_foo()
+//!     .times(1)
+//!     .in_sequence(&mut seq)
+//!     .returning(|| ());
+//!
+//! let mut mock2 = MockFoo::new();
+//! mock2.expect_foo()
+//!     .times(1)
+//!     .in_sequence(&mut seq)
+//!     .returning(|| ());
+//!
+//! mock2.foo();    // Panics!  mock1.foo should've been called first.
+//! # }
+//! ```
+//!
+//! ## Checkpoints
+//!
+//! Sometimes its useful to validate all expectations mid-test, throw them away,
+//! and add new ones.  That's what checkpoints do.  Every mock object has a
+//! `checkpoint` method.  When called, it will immediately validate all methods'
+//! expectations.  So any expectations that haven't satisfied their call count
+//! will panic.  Afterwards, those expectations will be cleared so you can add
+//! new expectations and keep testing.
+//!
+//! ```should_panic
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self);
+//! }
+//!
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .times(2)
+//!     .returning(|| ());
+//!
+//! mock.foo();
+//! mock.checkpoint();  // Panics!  foo hasn't yet been called twice.
+//! ```
+//!
+//! ```should_panic
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self);
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .times(1)
+//!     .returning(|| ());
+//!
+//! mock.foo();
+//! mock.checkpoint();
+//! mock.foo();         // Panics!  The expectation has been cleared.
+//! # }
+//! ```
+//!
+//! ## Reference arguments
+//!
+//! Mockall can mock methods with reference arguments, too.  There's one catch:
+//! the matcher [`Predicate`] will take reference arguments by value, not by
+//! reference.
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self, x: &u32) -> u32;
+//! }
+//!
+//! let mut mock = MockFoo::new();
+//! let e = mock.expect_foo()
+//!     // Note that x is a &u32, not a &&u32
+//!     .withf(|x: &u32| *x == 5)
+//!     .returning(|x: &u32| *x + 1);
+//!
+//! assert_eq!(6, mock.foo(&5));
+//! ```
+//!
+//! ## Reference return values
+//!
+//! Mockall can also use reference return values.  There is one restriction: the
+//! lifetime of the returned reference must be either the same as the lifetime
+//! of the mock object, or `'static`.
+//!
+//! Mockall creates different expectation types for methods that return
+//! references.  Their API is the same as the basic `Expectation`, except for
+//! setting return values.
+//!
+//! Methods that return `'static` references work just like methods that return
+//! any other `'static` value.
+//! ```
+//! # use mockall::*;
+//! struct Thing(u32);
+//!
+//! #[automock]
+//! trait Container {
+//!     fn get(&self, i: u32) -> &'static Thing;
+//! }
+//!
+//! # fn main() {
+//! const THING: Thing = Thing(42);
+//! let mut mock = MockContainer::new();
+//! mock.expect_get()
+//!     .return_const(&THING);
+//!
+//! assert_eq!(42, mock.get(0).0);
+//! # }
+//! ```
+//!
+//! Methods that take a `&self` argument use an `Expectation` class like
+//! [this](examples::__mock_MockFoo_Foo::__bar::Expectation),
+//! which
+//! gets its return value from the
+//! [`return_const`](examples::__mock_MockFoo_Foo::__bar::Expectation::return_const) method.
+//!
+//! ```
+//! # use mockall::*;
+//! struct Thing(u32);
+//!
+//! #[automock]
+//! trait Container {
+//!     fn get(&self, i: u32) -> &Thing;
+//! }
+//!
+//! # fn main() {
+//! let thing = Thing(42);
+//! let mut mock = MockContainer::new();
+//! mock.expect_get()
+//!     .return_const(thing);
+//!
+//! assert_eq!(42, mock.get(0).0);
+//! # }
+//! ```
+//!
+//! Methods that take a `&mut self` argument use an `Expectation` class like
+//! [this](examples::__mock_MockFoo_Foo::__baz::Expectation),
+//! class, regardless of whether the return value is actually mutable.  They can
+//! take their return value either from the
+//! [`return_var`](examples::__mock_MockFoo_Foo::__baz::Expectation::return_var)
+//! or
+//! [`returning`](examples::__mock_MockFoo_Foo::__baz::Expectation::returning)
+//! methods.
+//!
+//! ```
+//! # use mockall::*;
+//! struct Thing(u32);
+//!
+//! #[automock]
+//! trait Container {
+//!     fn get_mut(&mut self, i: u32) -> &mut Thing;
+//! }
+//!
+//! # fn main() {
+//! let thing = Thing(42);
+//! let mut mock = MockContainer::new();
+//! mock.expect_get_mut()
+//!     .return_var(thing);
+//!
+//! mock.get_mut(0).0 = 43;
+//! assert_eq!(43, mock.get_mut(0).0);
+//! # }
+//! ```
+//!
+//! Unsized types that are common targets for
+//! [`Deref`](core::ops::Deref)
+//! are special.  Mockall
+//! will automatically use the type's owned form for the Expectation.
+//! Currently, the
+//! [`CStr`](std::ffi::CStr),
+//! [`OsStr`](std::ffi::OsStr),
+//! [`Path`](std::path::Path),
+//! [`Slice`][std::slice],
+//! and
+//! [`str`](std::str)
+//! types are supported.  Using this feature is automatic:
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo {
+//!     fn name(&self) -> &str;
+//! }
+//!
+//! let mut mock = MockFoo::new();
+//! mock.expect_name().return_const("abcd".to_owned());
+//! assert_eq!("abcd", mock.name());
+//! ```
+//!
+//! Similarly, Mockall will use a Boxed trait object for the Expectation of
+//! methods that return references to trait objects.
+//!
+//! ```
+//! # use mockall::*;
+//! # use std::fmt::Display;
+//! #[automock]
+//! trait Foo {
+//!     fn name(&self) -> &dyn Display;
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! mock.expect_name().return_const(Box::new("abcd"));
+//! assert_eq!("abcd", format!("{}", mock.name()));
+//! # }
+//! ```
+//!
+//!
+//! ## Impl Trait
+//!
+//! Rust 1.26.0 introduced the `impl Trait` feature.  It allows functions to
+//! return concrete but unnamed types (and, less usefully, to take them as
+//! arguments).  It's *almost* the same as `Box<dyn Trait>` but without the
+//! extra allocation.  Mockall supports deriving mocks for methods that return
+//! `impl Trait`, with limitations.  When you derive the mock for such a method,
+//! Mockall internally transforms the Expectation's return type to `Box<dyn
+//! Trait>`, without changing the mock method's signature.  So you can use it
+//! like this:
+//!
+//! ```
+//! # use mockall::*;
+//! # use std::fmt::Debug;
+//! struct Foo {}
+//! #[automock]
+//! impl Foo {
+//!     fn foo(&self) -> impl Debug {
+//!         // ...
+//!         # 4
+//!     }
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .returning(|| Box::new(String::from("Hello, World!")));
+//! println!("{:?}", mock.foo());
+//! # }
+//! ```
+//!
+//! However, `impl Trait` isn't *exactly* equivalent to `Box<dyn Trait>` but
+//! with fewer allocations.  There are some things the former can do but the
+//! latter can't.  For one thing, you can't build a trait object out of a
+//! `Sized` trait.  So this won't work:
+//!
+//! ```compile_fail
+//! # use mockall::*;
+//! struct Foo {}
+//! #[automock]
+//! impl Foo {
+//!     fn foo(&self) -> impl Clone {
+//!         // ...
+//!         # 4
+//!     }
+//! }
+//! ```
+//!
+//! Nor can you create a trait object that implements two or more non-auto
+//! types.  So this won't work either:
+//!
+//! ```compile_fail
+//! # use mockall::*;
+//! struct Foo {}
+//! #[automock]
+//! impl Foo {
+//!     fn foo(&self) -> impl Debug + Display {
+//!         // ...
+//!         # 4
+//!     }
+//! }
+//! ```
+//!
+//! For such cases, there is no magic bullet.  The best way to mock methods like
+//! those would be to refactor them to return named (but possibly opaque) types
+//! instead.
+//!
+//! See Also [`impl-trait-for-returning-complex-types-with-ease.html`](https://rust-lang-nursery.github.io/edition-guide/rust-2018/trait-system/impl-trait-for-returning-complex-types-with-ease)
+//!
+//! ### impl Future
+//!
+//! Rust 1.36.0 added the `Future` trait.  Unlike virtually every trait that
+//! preceeded it, `Box<dyn Future>` is mostly useless.  Instead, you usually
+//! need a `Pin<Box<dyn Future>>`.  So that's what Mockall will do when you mock
+//! a method returning `impl Future` or the related `impl Stream`.  Just
+//! remember to use `pin` in your expectations, like this:
+//!
+//! ```
+//! # use mockall::*;
+//! # use std::fmt::Debug;
+//! # use futures::{Future, future};
+//! struct Foo {}
+//! #[automock]
+//! impl Foo {
+//!     fn foo(&self) -> impl Future<Output=i32> {
+//!         // ...
+//!         # future::ready(42)
+//!     }
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .returning(|| Box::pin(future::ready(42)));
+//! # }
+//! ```
+//!
+//! ## Mocking structs
+//!
+//! Mockall mocks structs as well as traits.  The problem here is a namespace
+//! problem: it's hard to supply the mock object to your code under test,
+//! because it has a different name.  The solution is to alter import paths
+//! during test.  The easiest way to do that is with the
+//! [`mockall_double`](https://docs.rs/mockall_double/latest) crate.
+//!
+//! [`#[automock]`](attr.automock.html)
+//! works for structs that have a single `impl` block:
+//! ```no_run
+//! use mockall_double::double;
+//! mod thing {
+//!     use mockall::automock;
+//!     pub struct Thing{}
+//!     #[automock]
+//!     impl Thing {
+//!         pub fn foo(&self) -> u32 {
+//!             // ...
+//!             # unimplemented!()
+//!         }
+//!     }
+//! }
+//!
+//! #[double]
+//! use thing::Thing;
+//!
+//! fn do_stuff(thing: &Thing) -> u32 {
+//!     thing.foo()
+//! }
+//!
+//! #[cfg(test)]
+//! mod t {
+//!     use super::*;
+//!
+//!     #[test]
+//!     fn test_foo() {
+//!         let mut mock = Thing::default();
+//!         mock.expect_foo().returning(|| 42);
+//!         do_stuff(&mock);
+//!     }
+//! }
+//! # fn main() {}
+//! ```
+//! For structs with more than one `impl` block or that have unsupported
+//! `#[derive(X)]` attributes, e.g. `Clone`, see [`mock!`] instead.
+//!
+//! ## Generic methods
+//!
+//! Generic methods can be mocked, too.  Effectively each generic method is an
+//! infinite set of regular methods, and each of those works just like any other
+//! regular method.  The expect_* method is generic, too, and usually must be
+//! called with a turbofish.  The only restrictions on mocking generic methods
+//! are that all generic parameters must be `'static`, and generic lifetime
+//! parameters are not allowed.
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo<T: 'static>(&self, t: T) -> i32;
+//! }
+//!
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo::<i16>()
+//!     .returning(|t| i32::from(t));
+//! mock.expect_foo::<i8>()
+//!     .returning(|t| -i32::from(t));
+//!
+//! assert_eq!(5, mock.foo(5i16));
+//! assert_eq!(-5, mock.foo(5i8));
+//! ```
+//!
+//! ## Methods with generic lifetimes
+//!
+//! A method with a lifetime parameter is technically a generic method, but
+//! Mockall treats it like a non-generic method that must work for all possible
+//! lifetimes.  Mocking such a method is similar to mocking a non-generic
+//! method, with a few additional restrictions.  One restriction is that you
+//! can't match calls with `with`, you must use `withf` instead.  Another is
+//! that the generic lifetime may not appear as part of the return type.
+//! Finally, no method may have both generic lifetime parameters *and* generic
+//! type parameters.
+//!
+//! ```
+//! # use mockall::*;
+//! struct X<'a>(&'a i32);
+//!
+//! #[automock]
+//! trait Foo {
+//!     fn foo<'a>(&self, x: X<'a>) -> i32;
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo()
+//!     .withf(|f| *f.0 == 5)
+//!     .return_const(42);
+//! let x = X(&5);
+//! assert_eq!(42, mock.foo(x));
+//! # }
+//! ```
+//!
+//! ## Generic traits and structs
+//!
+//! Mocking generic structs and generic traits is not a problem.  The mock
+//! struct will be generic, too.  The same restrictions apply as with mocking
+//! generic methods: each generic parameter must be `'static`, and generic
+//! lifetime parameters are not allowed.
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo<T: 'static> {
+//!     fn foo(&self, t: T) -> i32;
+//! }
+//!
+//! # fn main() {
+//! let mut mock = MockFoo::<i16>::new();
+//! mock.expect_foo()
+//!     .returning(|t| i32::from(t));
+//! assert_eq!(5, mock.foo(5i16));
+//! # }
+//! ```
+//!
+//! ## Associated types
+//!
+//! Traits with associated types can be mocked too.  Unlike generic traits, the
+//! mock struct will not be generic.  Instead, you must specify the associated
+//! types when defining the mock struct.  They're specified as metaitems to the
+//! [`#[automock]`](attr.automock.html) attribute.
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock(type Key=u16; type Value=i32;)]
+//! pub trait A {
+//!     type Key;
+//!     type Value;
+//!     fn foo(&self, k: Self::Key) -> Self::Value;
+//! }
+//!
+//! let mut mock = MockA::new();
+//! mock.expect_foo()
+//!     .returning(|x: u16| i32::from(x));
+//! assert_eq!(4, mock.foo(4));
+//! ```
+//!
+//! ## Multiple and inherited traits
+//!
+//! Creating a mock struct that implements multiple traits, whether inherited or
+//! not, requires using the [`mock!`] macro.  But once created,
+//! using it is just the same as using any other mock object:
+//!
+//! ```
+//! # use mockall::*;
+//! pub trait A {
+//!     fn foo(&self);
+//! }
+//!
+//! pub trait B: A {
+//!     fn bar(&self);
+//! }
+//!
+//! mock! {
+//!     // Structure to mock
+//!     C {}
+//!     // First trait to implement on C
+//!     impl A for C {
+//!         fn foo(&self);
+//!     }
+//!     // Second trait to implement on C
+//!     impl B for C {
+//!         fn bar(&self);
+//!     }
+//! }
+//! # fn main() {
+//! let mut mock = MockC::new();
+//! mock.expect_foo().returning(|| ());
+//! mock.expect_bar().returning(|| ());
+//! mock.foo();
+//! mock.bar();
+//! # }
+//! ```
+//!
+//! ## External traits
+//!
+//! Mockall can mock traits and structs defined in external crates that are
+//! beyond your control, but you must use [`mock!`] instead of
+//! [`#[automock]`](attr.automock.html).  Mock an external trait like this:
+//!
+//! ```
+//! # use mockall::*;
+//! mock! {
+//!     MyStruct {}     // Name of the mock struct, less the "Mock" prefix
+//!     impl Clone for MyStruct {   // specification of the trait to mock
+//!         fn clone(&self) -> Self;
+//!     }
+//! }
+//!
+//! # fn main() {
+//! let mut mock1 = MockMyStruct::new();
+//! let mock2 = MockMyStruct::new();
+//! mock1.expect_clone()
+//!     .return_once(move || mock2);
+//! let cloned = mock1.clone();
+//! # }
+//! ```
+//!
+//! ## Static methods
+//!
+//! Mockall can also mock static methods.  But be careful!  The expectations are
+//! global.  If you want to use a static method in multiple tests, you must
+//! provide your own synchronization. See the [`synchronization
+//! example`](https://github.com/asomers/mockall/blob/master/mockall/examples/synchronization.rs)
+//! for a basic implementation. For ordinary methods, expectations are
+//! set on the mock object.  But static methods don't have any mock object.
+//! Instead, you must create a `Context` object just to set their expectations.
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock]
+//! pub trait A {
+//!     fn foo() -> u32;
+//! }
+//!
+//! let ctx = MockA::foo_context();
+//! ctx.expect().returning(|| 99);
+//! assert_eq!(99, MockA::foo());
+//! ```
+//!
+//! A common pattern is mocking a trait with a constructor method.  In this case,
+//! you can easily set the mock constructor method to return a mock object.
+//!
+//! ```
+//! # use mockall::*;
+//! struct Foo{}
+//! #[automock]
+//! impl Foo {
+//!     fn from_i32(x: i32) -> Self {
+//!         // ...
+//!         # unimplemented!()
+//!     }
+//!     fn foo(&self) -> i32 {
+//!         // ...
+//!         # unimplemented!()
+//!     }
+//! }
+//!
+//! # fn main() {
+//! let ctx = MockFoo::from_i32_context();
+//! ctx.expect()
+//!     .returning(|x| {
+//!         let mut mock = MockFoo::default();
+//!         mock.expect_foo()
+//!             .return_const(x);
+//!         mock
+//!     });
+//! let foo = MockFoo::from_i32(42);
+//! assert_eq!(42, foo.foo());
+//! # }
+//! ```
+//!
+//! ### Generic static methods
+//!
+//! Mocking static methods of generic structs or traits, whether or not the
+//! methods themselves are generic, should work seamlessly.
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo<T: 'static> {
+//!     fn new(t: T) -> MockFoo<T>;
+//! }
+//!
+//! # fn main() {
+//! let ctx = MockFoo::<u32>::new_context();
+//! ctx.expect()
+//!     .returning(|_| MockFoo::default());
+//! let mock = MockFoo::<u32>::new(42u32);
+//! # }
+//! ```
+//!
+//! ### Context checkpoints
+//!
+//! The context object cleans up all expectations when it leaves scope.  It also
+//! has a `checkpoint` method that functions just like a mock object's
+//! `checkpoint` method.
+//!
+//! ```should_panic
+//! # use mockall::*;
+//! #[automock]
+//! pub trait A {
+//!     fn foo() -> u32;
+//! }
+//!
+//! let ctx = MockA::foo_context();
+//! ctx.expect()
+//!     .times(1)
+//!     .returning(|| 99);
+//! ctx.checkpoint();   // Panics!
+//! ```
+//!
+//! A mock object's checkpoint method does *not* checkpoint static methods.
+//! This behavior is useful when using multiple mock objects at once.  For
+//! example:
+//!
+//! ```
+//! # use mockall::*;
+//! #[automock]
+//! pub trait A {
+//!     fn build() -> Self;
+//!     fn bar(&self) -> i32;
+//! }
+//!
+//! # fn main() {
+//! let ctx = MockA::build_context();
+//! ctx.expect()
+//!     .times(2)
+//!     .returning(|| MockA::default());
+//! let mut mock0 = MockA::build();
+//! mock0.expect_bar().return_const(4);
+//! mock0.bar();
+//! mock0.checkpoint();     // Does not checkpoint the build method
+//! let mock1 = MockA::build();
+//! # }
+//! ```
+//!
+//! One more thing: Mockall normally creates a zero-argument `new` method for
+//! every mock struct.  But it *won't* do that when mocking a struct that
+//! already has a method named `new`.  The `default` method will still be
+//! present.
+//!
+//! ## Modules
+//!
+//! In addition to mocking types, Mockall can also derive mocks for
+//! entire modules of Rust functions.  Mockall will generate a new module named
+//! "mock_xxx", if "xxx" is the original module's name.  You can also use
+//! `#[double]` to selectively import the mock module.
+//!
+//! Be careful!  Module functions are static and so have the same caveats as
+//! [static methods](#static-methods) described above.
+//!
+//! ```
+//! # use mockall::*;
+//! # use mockall_double::*;
+//! mod outer {
+//!     use mockall::automock;
+//!     #[automock()]
+//!     pub(super) mod inner {
+//!         pub fn bar(x: u32) -> i64 {
+//!             // ...
+//!             # 4
+//!         }
+//!     }
+//! }
+//!
+//! #[double]
+//! use outer::inner;
+//!
+//! #[cfg(test)]
+//! mod t {
+//!     use super::*;
+//!
+//!     #[test]
+//!     fn test_foo_bar() {
+//!         let ctx = inner::bar_context();
+//!         ctx.expect()
+//!             .returning(|x| i64::from(x + 1));
+//!         assert_eq!(5, inner::bar(4));
+//!     }
+//! }
+//! # fn main() {}
+//! ```
+//!
+//! ### Foreign functions
+//!
+//! One reason to mock modules is when working with foreign functions.  Modules
+//! may contain foreign functions, even though structs and traits may not.  Like
+//! static methods, the expectations are global.
+//!
+//! ```
+//! # use mockall_double::*;
+//! mod outer {
+//!     # use mockall::*;
+//!     #[automock]
+//!     pub mod ffi {
+//!         extern "C" {
+//!             pub fn foo(x: u32) -> i64;
+//!         }
+//!     }
+//! }
+//!
+//! #[double]
+//! use outer::ffi;
+//!
+//! fn do_stuff() -> i64 {
+//!     unsafe{ ffi::foo(42) }
+//! }
+//!
+//! #[cfg(test)]
+//! mod t {
+//!     use super::*;
+//!
+//!     #[test]
+//!     fn test_foo() {
+//!         let ctx = ffi::foo_context();
+//!         ctx.expect()
+//!             .returning(|x| i64::from(x + 1));
+//!         assert_eq!(43, do_stuff());
+//!     }
+//! }
+//! # fn main() {}
+//! ```
+//!
+//! ## Debug
+//!
+//! `#[automock]` will automatically generate `Debug` impls when mocking traits
+//! and struct impls.  `mock!` will too, if you add a `#[derive(Debug)]`, like
+//! this:
+//! ```no_run
+//! # use mockall::*;
+//! mock! {
+//!     #[derive(Debug)]
+//!     pub Foo {}
+//! }
+//! # fn main() {
+//! #     format!("{:?}", &MockFoo::default());
+//! # }
+//! ```
+//!
+//! ## Async Traits
+//!
+//! Async traits aren't yet (as of 1.47.0) a part of the Rust language.  But
+//! they're available from the
+//! [`async_trait`](https://docs.rs/async-trait/0.1.38/async_trait/) crate.
+//! Mockall is compatible with this crate, with two important limitations:
+//!
+//! * The `#[automock]` attribute must appear _before_ the `#[async_trait]`
+//! attribute.
+//!
+//! * The `#[async_trait]` macro must be imported with its canonical name.
+//!
+//! ```
+//! # use async_trait::async_trait;
+//! # use mockall::*;
+//! // async_trait works with both #[automock]
+//! #[automock]
+//! #[async_trait]
+//! pub trait Foo {
+//!    async fn foo(&self) -> u32;
+//! }
+//! // and mock!
+//! mock! {
+//!     pub Bar {}
+//!     #[async_trait]
+//!     impl Foo for Bar {
+//!         async fn foo(&self) -> u32;
+//!     }
+//! }
+//! # fn main() {}
+//! ```
+//!
+//! ## Crate features
+//!
+//! Mockall has a **nightly** feature.  Currently this feature has two
+//! effects:
+//!
+//! * The compiler will produce better error messages.
+//!
+//! * Expectations for methods whose return type implements `Default` needn't
+//!   have their return values explicitly set.  Instead, they will automatically
+//!   return the default value.
+//!
+//! With **nightly** enabled, you can omit the return value like this:
+#![cfg_attr(feature = "nightly", doc = "```")]
+#![cfg_attr(not(feature = "nightly"), doc = "```should_panic")]
+//! # use mockall::*;
+//! #[automock]
+//! trait Foo {
+//!     fn foo(&self) -> Vec<u32>;
+//! }
+//!
+//! let mut mock = MockFoo::new();
+//! mock.expect_foo();
+//! assert!(mock.foo().is_empty());
+//! ```
+//!
+//! ## Examples
+//!
+//! For additional examples of Mockall in action, including detailed
+//! documentation on the autogenerated methods, see
+//! [`examples`](examples).
+//!
+//! [`Predicate`]: trait.Predicate.html
+//! [`Sequence`]: Sequence
+//! [`cfg-if`]: https://crates.io/crates/cfg-if
+//! [`function`]: predicate/fn.function.html
+//! [`mock!`]: macro.mock.html
+//! [`predicate`]: predicate/index.html
+
+#![cfg_attr(feature = "nightly", feature(specialization))]
+// Allow the incomplete_feature warning for specialization.  We know it's
+// incomplete; that's why it's guarded by the "nightly" feature.
+#![cfg_attr(feature = "nightly", allow(incomplete_features))]
+
+#![cfg_attr(feature = "nightly", feature(doc_cfg))]
+#![cfg_attr(test, deny(warnings))]
+#![warn(missing_docs)]
+
+use downcast::*;
+use std::{
+    any,
+    fmt::{self, Debug, Formatter},
+    marker::PhantomData,
+    ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo,
+          RangeToInclusive},
+    sync::{
+        Arc,
+        atomic::{AtomicUsize, Ordering}
+    },
+};
+
+#[doc(hidden)]
+pub use downcast::{Any, Downcast};
+#[doc(hidden)]
+pub use fragile::Fragile;
+
+/// For mocking static methods
+#[doc(hidden)]
+pub use lazy_static::lazy_static;
+
+pub use predicates::{
+    boolean::PredicateBooleanExt,
+    prelude::{
+        Predicate, PredicateBoxExt, PredicateFileContentExt, PredicateStrExt,
+        predicate
+    }
+};
+#[doc(hidden)]
+pub use predicates_tree::CaseTreeExt;
+
+#[cfg(doc)]
+extern crate self as mockall;
+#[cfg(doc)]
+pub mod examples;
+
+/// Automatically generate mock types for structs and traits.
+///
+/// This is by far the easiest way to use Mockall.  It works on almost all
+/// traits, and almost all structs that have a single `impl` block.  In either
+/// case, it will generate a mock struct whose name is the name of the mocked
+/// struct/trait prepended with "Mock".  For each method of the original, the
+/// mock struct will have a method named `expect_whatever` that allows you to
+/// set expectations.  There will also be one `checkpoint` method that calls
+/// [`checkpoint`] for every single mocked method.
+///
+/// # Examples
+///
+/// The simplest use case is mocking a no-frills trait
+/// ```
+/// # use mockall_derive::*;
+/// #[automock]
+/// pub trait Foo {
+///     fn foo(&self, key: i16);
+/// }
+///
+/// let mock = MockFoo::new();
+/// ```
+///
+/// Mocking a structure:
+/// ```
+/// # use mockall_derive::*;
+/// struct Foo {}
+/// #[automock]
+/// impl Foo {
+///     fn foo(&self) -> u32 {
+///         // ...
+///         # unimplemented!()
+///     }
+/// }
+/// ```
+///
+/// You can also mock a trait impl on a struct:
+/// ```
+/// # use mockall_derive::*;
+/// pub trait Foo {
+///     fn foo(&self, key: i16);
+/// }
+/// struct Bar{}
+/// #[automock]
+/// impl Foo for Bar {
+///     fn foo(&self, key: i16){
+///         // ...
+///         # unimplemented!()
+///     }
+/// }
+///
+/// let mock = MockBar::new();
+/// ```
+///
+/// Mocking a trait with associated types requires adding a metaitem to the
+/// attribute:
+/// ```
+/// # use mockall_derive::*;
+/// #[automock(type Item=u32;)]
+/// trait Foo {
+///     type Item;
+///     fn foo(&self) -> Self::Item;
+/// }
+/// ```
+///
+/// Finally, `#[automock]` can also mock foreign functions.  This requires
+/// another metaitem to specify the mock module name.
+///
+/// ```
+/// # use mockall_derive::*;
+/// #[automock(mod mock_ffi;)]
+/// extern "C" {
+///     pub fn foo() -> u32;
+/// }
+/// ```
+///
+/// [`checkpoint`]: ../mockall/index.html#checkpoints
+///
+/// # Limitations
+///
+/// `#[automock]` can't handle everything.  There are some cases where
+/// you will need to use [`mock`] instead:
+/// * Mocking a struct that has multiple `impl` blocks, including
+///   structs that implement traits.
+/// * Mocking a struct or trait defined in another crate.
+/// * Mocking a trait with trait bounds.
+/// * If the autogenerated "MockFoo" name isn't acceptable, and you want
+///   to choose your own name for the mock structure.
+pub use mockall_derive::automock;
+
+/// Manually mock a structure.
+///
+/// Sometimes `automock` can't be used.  In those cases you can use `mock!`,
+/// which basically involves repeating the struct's or trait's definitions.
+///
+/// The format is:
+///
+/// * Optional visibility specifier
+/// * Real structure name and generics fields
+/// * 0 or more methods of the structure, written without bodies, enclosed in a
+///   {} block
+/// * 0 or more impl blocks implementing traits on the structure, also without
+///   bodies.
+///
+/// # Examples
+///
+/// Mock a trait.  This is the simplest use case.
+/// ```
+/// # use mockall_derive::mock;
+/// trait Foo {
+///     fn foo(&self, x: u32);
+/// }
+/// mock!{
+///     pub MyStruct<T: Clone + 'static> {
+///         fn bar(&self) -> u8;
+///     }
+///     impl<T: Clone + 'static> Foo for MyStruct<T> {
+///         fn foo(&self, x: u32);
+///     }
+/// }
+/// # fn main() {}
+/// ```
+/// Mocking an unsupported `#[derive(X)]` attribute, e.g. `Clone`, is
+/// similar.
+/// ```
+/// # use mockall_derive::mock;
+/// #[derive(Clone)]
+/// struct MyStruct;
+///
+/// mock!{
+///     pub MyStruct {
+///         fn bar(&self);
+///     }
+///     impl Clone for MyStruct {
+///         fn clone(&self) -> Self;
+///     }
+/// }
+/// # fn main() {}
+/// ```
+///
+/// When mocking a generic struct's implementation of a generic trait, use the
+/// same namespace for their generic parameters.  For example, if you wanted to
+/// mock `Rc`, do
+/// ```
+/// # use mockall_derive::mock;
+/// mock!{
+///     pub Rc<T: 'static> {}
+///     impl<T: 'static> AsRef<T> for Rc<T> {
+///         fn as_ref(&self) -> &T;
+///     }
+/// }
+/// # fn main() {}
+/// ```
+/// *not*
+/// ```compile_fail
+/// # use mockall_derive::mock;
+/// mock!{
+///     pub Rc<Q: 'static> {}
+///     impl<T: 'static> AsRef<T> for Rc<T> {
+///         fn as_ref(&self) -> &T;
+///     }
+/// }
+/// # fn main() {}
+/// ```
+/// Associated types can easily be mocked by specifying a concrete type in the
+/// `mock!{}` invocation.
+/// ```
+/// # use mockall_derive::mock;
+/// mock!{
+///     MyIter {}
+///     impl Iterator for MyIter {
+///         type Item=u32;
+///
+///         fn next(&mut self) -> Option<<Self as Iterator>::Item>;
+///     }
+/// }
+/// # fn main() {}
+/// ```
+pub use mockall_derive::mock;
+
+#[doc(hidden)]
+pub trait AnyExpectations : Any + Send + Sync {}
+downcast!(dyn AnyExpectations);
+
+#[doc(hidden)]
+pub trait ReturnDefault<O> {
+    fn maybe_return_default() -> Option<O>;
+    fn return_default() -> Result<O, &'static str>;
+}
+
+#[derive(Default)]
+#[doc(hidden)]
+pub struct DefaultReturner<O>(PhantomData<O>);
+
+::cfg_if::cfg_if! {
+    if #[cfg(feature = "nightly")] {
+        impl<O> ReturnDefault<O> for DefaultReturner<O> {
+            default fn maybe_return_default() -> Option<O> {
+                None
+            }
+
+            default fn return_default() -> Result<O, &'static str> {
+                Err("Can only return default values for types that impl std::Default")
+            }
+        }
+
+        impl<O: Default> ReturnDefault<O> for DefaultReturner<O> {
+            fn maybe_return_default() -> Option<O> {
+                Some(O::default())
+            }
+
+            fn return_default() -> Result<O, &'static str> {
+                Ok(O::default())
+            }
+        }
+    } else {
+        impl<O> ReturnDefault<O> for DefaultReturner<O> {
+            fn maybe_return_default() -> Option<O> {
+                None
+            }
+
+            fn return_default() -> Result<O, &'static str> {
+                Err("Returning default values requires the \"nightly\" feature")
+            }
+        }
+    }
+}
+
+#[doc(hidden)]
+pub struct MaybeDebugger<'a, T>(pub &'a T);
+::cfg_if::cfg_if! {
+    if #[cfg(feature = "nightly")] {
+        impl<'a, T> Debug for MaybeDebugger<'a, T> {
+            default fn fmt(&self, f: &mut Formatter<'_>)
+                -> Result<(), fmt::Error>
+            {
+                write!(f, "?")
+            }
+        }
+        impl<'a, T: Debug> Debug for MaybeDebugger<'a, T> {
+            fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), fmt::Error> {
+                self.0.fmt(f)
+            }
+        }
+    } else {
+        impl<'a, T> Debug for MaybeDebugger<'a, T> {
+            fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), fmt::Error> {
+                write!(f, "?")
+            }
+        }
+    }
+}
+
+// Though it's not entirely correct, we treat usize::max_value() as
+// approximately infinity.
+#[derive(Debug)]
+#[doc(hidden)]
+pub struct TimesRange(Range<usize>);
+
+impl Default for TimesRange {
+    fn default() -> TimesRange {
+        // By default, allow any number of calls
+        TimesRange(0..usize::max_value())
+    }
+}
+
+impl From<usize> for TimesRange {
+    fn from(n: usize) -> TimesRange {
+        TimesRange(n..(n+1))
+    }
+}
+
+impl From<Range<usize>> for TimesRange {
+    fn from(r: Range<usize>) -> TimesRange {
+        assert!(r.end > r.start, "Backwards range");
+        TimesRange(r)
+    }
+}
+
+impl From<RangeFrom<usize>> for TimesRange {
+    fn from(r: RangeFrom<usize>) -> TimesRange {
+        TimesRange(r.start..usize::max_value())
+    }
+}
+
+impl From<RangeFull> for TimesRange {
+    fn from(_: RangeFull) -> TimesRange {
+        TimesRange(0..usize::max_value())
+    }
+}
+
+impl From<RangeInclusive<usize>> for TimesRange {
+    fn from(r: RangeInclusive<usize>) -> TimesRange {
+        assert!(r.end() >= r.start(), "Backwards range");
+        TimesRange(*r.start()..*r.end() + 1)
+    }
+}
+
+impl From<RangeTo<usize>> for TimesRange {
+    fn from(r: RangeTo<usize>) -> TimesRange {
+        TimesRange(0..r.end)
+    }
+}
+
+impl From<RangeToInclusive<usize>> for TimesRange {
+    fn from(r: RangeToInclusive<usize>) -> TimesRange {
+        TimesRange(0..r.end + 1)
+    }
+}
+
+#[derive(PartialEq)]
+#[doc(hidden)]
+pub enum ExpectedCalls {
+    Satisfied,
+    TooMany,
+    TooFew,
+}
+
+#[derive(Debug, Default)]
+#[doc(hidden)]
+pub struct Times{
+    /// How many times has the expectation already been called?
+    count: AtomicUsize,
+    range: TimesRange
+}
+
+#[doc(hidden)]
+impl Times {
+    pub fn call(&self) -> Result<(), String> {
+        let count = self.count.fetch_add(1, Ordering::Relaxed) + 1;
+        if count >= self.range.0.end {
+            if self.range.0.end == 1 {
+                Err("should not have been called".to_owned())
+            } else {
+                Err(format!(
+                    "called {} times which is more than the expected {}",
+                    count,
+                    self.range.0.end - 1
+                ))
+            }
+        } else {
+            Ok(())
+        }
+    }
+
+    pub fn any(&mut self) {
+        self.range.0 = 0..usize::max_value();
+    }
+
+    /// Return how many times this expectation has been called
+    pub fn count(&self) -> usize {
+        self.count.load(Ordering::Relaxed)
+    }
+
+    /// Has this expectation already been called the maximum allowed number of
+    /// times?
+    pub fn is_done(&self) -> bool {
+        self.count.load(Ordering::Relaxed) >= self.range.0.end - 1
+    }
+
+    /// Is it required that this expectation be called an exact number of times,
+    /// or may it be satisfied by a range of call counts?
+    pub fn is_exact(&self) -> bool {
+        (self.range.0.end - self.range.0.start) == 1
+    }
+
+    /// Has this expectation already been called the expected number of times?
+    /// If not, was it too many or too few?
+    pub fn is_satisfied(&self) -> ExpectedCalls {
+        let satisfied_lower_bound = self.count.load(Ordering::Relaxed) >= self.range.0.start;
+        let satisfied_upper_bound = self.count.load(Ordering::Relaxed) < self.range.0.end;
+        if satisfied_lower_bound && satisfied_upper_bound {
+            ExpectedCalls::Satisfied
+        } else if satisfied_lower_bound {
+            ExpectedCalls::TooMany
+        } else {
+            ExpectedCalls::TooFew
+        }
+    }
+
+    /// The maximum number of times that this expectation must be called
+    pub fn maximum(&self) -> usize {
+        self.range.0.end - 1
+    }
+
+    /// The minimum number of times that this expectation must be called
+    pub fn minimum(&self) -> usize {
+        self.range.0.start
+    }
+
+    // https://github.com/rust-lang/rust-clippy/issues/3307
+    #[allow(clippy::range_plus_one)]
+    pub fn n(&mut self, n: usize) {
+        self.range.0 = n..(n+1);
+    }
+
+    pub fn never(&mut self) {
+        self.range.0 = 0..1;
+    }
+
+    pub fn range(&mut self, range: Range<usize>) {
+        assert!(range.end > range.start, "Backwards range");
+        self.range.0 = range;
+    }
+
+    pub fn times<T: Into<TimesRange>>(&mut self, t: T) {
+        self.range = t.into();
+    }
+}
+
+/// Non-generic keys to `GenericExpectation` internal storage
+#[doc(hidden)]
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub struct Key(any::TypeId);
+
+#[doc(hidden)]
+impl Key {
+    pub fn new<T: 'static + ?Sized>() -> Self {
+        Key(any::TypeId::of::<T>())
+    }
+}
+
+#[doc(hidden)]
+pub struct SeqHandle {
+    inner: Arc<SeqInner>,
+    seq: usize
+}
+
+impl SeqHandle {
+    /// Tell the Sequence that this expectation has been fully satisfied
+    pub fn satisfy(&self) {
+        self.inner.satisfy(self.seq);
+    }
+
+    /// Verify that this handle was called in the correct order
+    pub fn verify(&self, desc: &str) {
+        self.inner.verify(self.seq, desc);
+    }
+}
+
+#[derive(Default)]
+struct SeqInner {
+    satisfaction_level: AtomicUsize,
+}
+
+impl SeqInner {
+    /// Record the call identified by `seq` as fully satisfied.
+    fn satisfy(&self, seq: usize) {
+        let old_sl = self.satisfaction_level.fetch_add(1, Ordering::Relaxed);
+        assert_eq!(old_sl, seq, "Method sequence violation.  Was an already-satisfied method called another time?");
+    }
+
+    /// Verify that the call identified by `seq` was called in the correct order
+    fn verify(&self, seq: usize, desc: &str) {
+        assert_eq!(seq, self.satisfaction_level.load(Ordering::Relaxed),
+            "{}: Method sequence violation", desc)
+    }
+}
+
+/// Used to enforce that mock calls must happen in the sequence specified.
+///
+/// Each expectation must expect to be called a fixed number of times.  Once
+/// satisfied, the next expectation in the sequence will expect to be called.
+///
+/// # Examples
+/// ```
+/// # use mockall::*;
+/// #[automock]
+/// trait Foo {
+///     fn foo(&self);
+///     fn bar(&self) -> u32;
+/// }
+/// let mut seq = Sequence::new();
+///
+/// let mut mock0 = MockFoo::new();
+/// let mut mock1 = MockFoo::new();
+///
+/// mock0.expect_foo()
+///     .times(1)
+///     .returning(|| ())
+///     .in_sequence(&mut seq);
+///
+/// mock1.expect_bar()
+///     .times(1)
+///     .returning(|| 42)
+///     .in_sequence(&mut seq);
+///
+/// mock0.foo();
+/// mock1.bar();
+/// ```
+///
+/// It is an error to add an expectation to a `Sequence` if its call count is
+/// unspecified.
+/// ```should_panic(expected = "with an exact call count")
+/// # use mockall::*;
+/// #[automock]
+/// trait Foo {
+///     fn foo(&self);
+/// }
+/// let mut seq = Sequence::new();
+///
+/// let mut mock = MockFoo::new();
+/// mock.expect_foo()
+///     .returning(|| ())
+///     .in_sequence(&mut seq);  // panics!
+/// ```
+#[derive(Default)]
+pub struct Sequence {
+    inner: Arc<SeqInner>,
+    next_seq: usize,
+}
+
+impl Sequence {
+    /// Create a new empty [`Sequence`]
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    /// Not for public consumption, but it must be public so the generated code
+    /// can call it.
+    #[doc(hidden)]
+    pub fn next_handle(&mut self) -> SeqHandle {
+        let handle = SeqHandle{inner: self.inner.clone(), seq: self.next_seq};
+        self.next_seq += 1;
+        handle
+    }
+}
