Import puma_6.6.0-4.debian.tar.xz
authorAthos Ribeiro <athos@debian.org>
Thu, 17 Jul 2025 10:20:19 +0000 (07:20 -0300)
committerAthos Ribeiro <athos@debian.org>
Thu, 17 Jul 2025 10:20:19 +0000 (07:20 -0300)
[dgit import tarball puma 6.6.0-4 puma_6.6.0-4.debian.tar.xz]

32 files changed:
README.source [new file with mode: 0644]
changelog [new file with mode: 0644]
clean [new file with mode: 0644]
control [new file with mode: 0644]
copyright [new file with mode: 0644]
gbp.conf [new file with mode: 0644]
patches/0004-puma.gemspec-drop-git-usage.patch [new file with mode: 0644]
patches/0010-Disable-test-concurrency-without-concurrent_ruby.patch [new file with mode: 0644]
patches/0011-disable-minitest-extensions.patch [new file with mode: 0644]
patches/0012-disable-cli-ssl-tests.patch [new file with mode: 0644]
patches/0013-fix-test-term-not-accepts-new-connections.patch [new file with mode: 0644]
patches/0014-disable-test-failing-on-amd64.patch [new file with mode: 0644]
patches/0015-disable-different-output-test.patch [new file with mode: 0644]
patches/0016-disable-test-failing-on-arm64.patch [new file with mode: 0644]
patches/0017-disable-test-failing-on-armhf.patch [new file with mode: 0644]
patches/0018-disable-test-failing-with-ruby3.2.patch [new file with mode: 0644]
patches/0019-adapt-test-certs-generation.patch [new file with mode: 0644]
patches/0020-update-ex-certs.patch [new file with mode: 0644]
patches/series [new file with mode: 0644]
puma.1 [new file with mode: 0644]
puma.docs [new file with mode: 0644]
puma.examples [new file with mode: 0644]
puma.lintian-overrides [new file with mode: 0644]
puma.manpages [new file with mode: 0644]
pumactl.1 [new file with mode: 0644]
ruby-tests.rake [new file with mode: 0644]
rules [new file with mode: 0755]
salsa-ci.yml [new file with mode: 0644]
source/format [new file with mode: 0644]
source/lintian-overrides [new file with mode: 0644]
upstream/metadata [new file with mode: 0644]
watch [new file with mode: 0644]

diff --git a/README.source b/README.source
new file mode 100644 (file)
index 0000000..7622ecc
--- /dev/null
@@ -0,0 +1,31 @@
+puma (6.6.0-4)
+
+  Added the capability to re-generate test certificates in the examples
+  directory. This should require installing
+  - default-jre, and
+  - ruby-certificate-authority
+  which are currently not listed as dependencies of this package. You can also
+  use faketime to run the upstream tests in a future date to test if the
+  certificates will be valid throughout the Debian release support cycle.
+
+  Note that these certificates are not being re-generated during build time
+  because the examples/generate_all_certs script depends on the keytool binary
+  shipped in the JRE package (we do not want to build depend on Java just for
+  this). It should be possible to re-write the script to use the minijks
+  package instead (written in Go) so we can always generate these certificates
+  during package builds.
+
+puma (4.3.1-1)
+
+  Several tests have been disabled by default:
+
+  - test/test_puma_server_ssl.rb has been disabled because all tests fail
+    randomly. However these tests have never been performed in puma 3.x and
+    they also work randomly. So until someone can look into them and fix them,
+    we decided to not run them (see also #921931).
+
+  - test_control_for_ssl (test/test_cli.rb) and
+    test_control_ssl (test/test_pumactl.rb) show similar issues and don't seem
+    to imply that the package fails to work. So they have been disabled too.
+
+ -- Daniel Leidert <dleidert@debian.org>  Wed, 05 Feb 2020 23:51:51 +0100
diff --git a/changelog b/changelog
new file mode 100644 (file)
index 0000000..3342f03
--- /dev/null
+++ b/changelog
@@ -0,0 +1,428 @@
+puma (6.6.0-4) unstable; urgency=medium
+
+  * Team upload.
+  * Do not generate example certificates in build time to avoid build
+    depending on Java
+  * d/p/0019-adapt-test-certs-generation.patch: adjust example certificates
+    generation script
+  * d/p/0020-update-ex-certs.patch: update example certificates to avoid a
+    regression for #1078640
+  * debian/README.source: document test certificates generation
+
+ -- Athos Ribeiro <athos@debian.org>  Thu, 17 Jul 2025 07:20:19 -0300
+
+puma (6.6.0-3) unstable; urgency=medium
+
+  * Team upload.
+  * Freshly generate example certificates for test suite (Closes: #1078640)
+
+ -- Timo Röhling <roehling@debian.org>  Wed, 16 Jul 2025 21:51:16 +0200
+
+puma (6.6.0-2) unstable; urgency=medium
+
+  * Team upload
+  * Change build-dependency on ruby-rackup to
+    ruby-rackup | ruby-rack (<< 3), to allow migration to testing
+    independently of rackup or rack 3.
+
+ -- Lucas Nussbaum <lucas@debian.org>  Fri, 07 Feb 2025 21:46:17 +0100
+
+puma (6.6.0-1) unstable; urgency=medium
+
+  * Team upload
+  * New upstream version 6.5.0, with fixes for rack 3. Closes: #1094539
+  * Refresh patches for 6.5.0
+  * Drop patches (were upstream backports, so no longer needed):
+      + 0009-CI-update-chain-certs-example-files-3426.patch
+      + 0010-Update-all-certs.patch
+      + 0011-Fix-path-of-certs-useb-by-test_example_cert_expirati.patch
+      + 0014-Give-a-wide-berth-on-the-timeout-as-sometimes-CI-is-.patch
+      + 0018-update-certs-from-upstream.patch
+  * Refresh packaging using dh-make-ruby
+  * Add build-dep on rackup for Rack::Handler
+  * New upstream version 6.6.0
+  * Refresh patches again, for 6.6.0
+  * Add build-dep on ruby-concurrent
+  * Add patch: 0010-Disable-test-concurrency-without-concurrent_ruby.patch
+  * Drop unmatched lintian override
+
+ -- Lucas Nussbaum <lucas@debian.org>  Wed, 05 Feb 2025 14:56:49 +0100
+
+puma (6.4.3-3) unstable; urgency=medium
+
+  * d/p/0014-Give-a-wide-berth-on-the-timeout-as-sometimes-CI-is-.patch:
+    increase timeout to fix FTBFS with ruby 3.3.
+
+ -- Lucas Kanashiro <kanashiro@debian.org>  Wed, 22 Jan 2025 17:06:59 -0300
+
+puma (6.4.3-2) unstable; urgency=medium
+
+  * Team upload.
+  * d/p/0018-disable-test-failing-with-ruby3.2.patch: fix FTBFS
+
+ -- Lucas Kanashiro <kanashiro@debian.org>  Mon, 23 Dec 2024 19:07:19 -0300
+
+puma (6.4.3-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream version. Fixes CVE-2024-45614 (Closes: #1082379)
+  * Remove custom ssl autopkgtest.
+    - https://lists.debian.org/debian-ruby/2024/11/msg00006.html
+  * Update certificates for tests.
+
+ -- Abhijith PA <abhijith@debian.org>  Mon, 30 Sep 2024 09:46:18 +0530
+
+puma (6.4.2-6) unstable; urgency=medium
+
+  * Fix FTBFS due to certs expiration (Closes: #1078640)
+    - d/p/0010-Update-all-certs.patch
+    - d/p/0011-Fix-path-of-certs-useb-by-test_example_cert_expirati.patch
+  * Declare compliance with Debian Policy 4.7.0.
+
+ -- Lucas Kanashiro <kanashiro@debian.org>  Thu, 19 Sep 2024 17:56:24 -0300
+
+puma (6.4.2-5) unstable; urgency=medium
+
+  * Backport upstream patch to update certificates in examples.
+    This fixes a test failure.
+
+ -- Lucas Kanashiro <kanashiro@debian.org>  Sat, 20 Jul 2024 12:24:05 -0300
+
+puma (6.4.2-4) unstable; urgency=medium
+
+  * Disable test failing on armhf
+
+ -- Pirate Praveen <praveen@debian.org>  Tue, 06 Feb 2024 18:13:41 +0530
+
+puma (6.4.2-3) unstable; urgency=medium
+
+  * Add Breaks: rails (<< 2:6.1.7.3+dfsg-3~)
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 05 Feb 2024 15:12:00 +0530
+
+puma (6.4.2-2) unstable; urgency=medium
+
+  * Disable test failing on arm64 buildd
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 05 Feb 2024 14:11:14 +0530
+
+puma (6.4.2-1) unstable; urgency=medium
+
+  * Switch to github tags from releases (6.4.2 is only available from tags)
+  * New upstream version 6.4.2 (Fixes: CVE-2024-21647)
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 05 Feb 2024 01:08:22 +0530
+
+puma (6.4.0-4) unstable; urgency=medium
+
+  * Remove minitest/retry as well (copy from 5.x branch and fixes salsa ci)
+  * Export LC_ALL also to C.UTF-8 (hoping this would fix some test failures)
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 05 Feb 2024 00:52:13 +0530
+
+puma (6.4.0-3) unstable; urgency=medium
+
+  * Reupload to unstable
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 04 Feb 2024 01:16:15 +0530
+
+puma (6.4.0-2) experimental; urgency=medium
+
+  * Set TEST_CASE_TIMEOUT = 300 (one test is timing out on amd64 buildd)
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 04 Dec 2023 23:59:02 +0530
+
+puma (6.4.0-1) experimental; urgency=medium
+
+  * New upstream version 6.4.0
+  * Disable more tests and refresh patches
+  * Add procps to build depends for kill command (used in tests)
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 03 Dec 2023 13:58:23 +0530
+
+puma (6.0.2-1) experimental; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+  * d/control (Standards-Version): Bump to 4.6.2.
+    (Build-Depends): Add ruby-sd-notify.
+  * d/copyright (Copyright): Update years.
+  * d/ruby-tests.rake: Re-enable multiple tests (closes: #984713).
+  * d/upstream/metadata: Adjust a few URLs.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 09 Feb 2023 16:12:20 +0100
+
+puma (5.6.5-2) unstable; urgency=medium
+
+  * debian/ruby-tests.rake: skip test that fails often (Closes: #1006022)
+  * debian/ruby-tests.rake: exclude tests that fail often but not always
+
+ -- Antonio Terceiro <terceiro@debian.org>  Wed, 02 Nov 2022 09:26:37 -0300
+
+puma (5.6.5-1) unstable; urgency=medium
+
+  * Update watch file for github.com pattern change
+  * New upstream version 5.6.5
+  * Refresh patches
+  * Bump Standards-Version to 4.6.1 (no changes needed)
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 16 Oct 2022 22:44:46 +0530
+
+puma (5.6.4-1) unstable; urgency=medium
+
+  * New upstream version 5.6.4
+  * Refresh patches
+  * Disable some tests that fail with
+     NameError: uninitialized constant Puma::LogWriter
+  * Remove tmp/restart.txt in clean
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 04 Apr 2022 13:24:10 +0530
+
+puma (5.5.2-2) unstable; urgency=medium
+
+  * Team upload
+  * debian/rules: force an UTF-8 locale
+  * debian/ruby-tests.rake: wrap lines
+  * debian/ruby-tests.rake: run all ssl tests on autopkgtest only
+  * debian/test/control: give ssl test a name
+
+ -- Antonio Terceiro <terceiro@debian.org>  Tue, 02 Nov 2021 16:35:12 -0300
+
+puma (5.5.2-1) unstable; urgency=medium
+
+  * Team upload
+  * New upstream version 5.5.2
+    - Builds and tests fine again (Closes: #998295)
+  * Add build-dependency on ruby-localhost
+  * debian/rules: exclude several unnecessary files from installation
+
+ -- Antonio Terceiro <terceiro@debian.org>  Tue, 02 Nov 2021 14:39:10 -0300
+
+puma (5.3.2-3) unstable; urgency=medium
+
+  * Use --gem-install layout option of dh-ruby
+
+ -- Pirate Praveen <praveen@debian.org>  Tue, 12 Oct 2021 02:24:33 +0530
+
+puma (5.3.2-2) unstable; urgency=medium
+
+  * Reupload to unstable
+  * Bump Standards-Version to 4.6.0 (no changes needed)
+  * Bump debhelper compatibility level to 13
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 11 Oct 2021 03:17:23 +0530
+
+puma (5.3.2-1) experimental; urgency=medium
+
+  * New upstream version 5.3.2 (Closes: #989054) (Fixes: CVE-2021-29509)
+  * Refresh patches
+
+ -- Pirate Praveen <praveen@debian.org>  Fri, 28 May 2021 22:34:53 +0530
+
+puma (4.3.8-1) unstable; urgency=medium
+
+  * New upstream version 4.3.8 (Closes: #989054) (Fixes: CVE-2021-29509)
+
+ -- Pirate Praveen <praveen@debian.org>  Wed, 26 May 2021 10:24:19 +0530
+
+puma (5.2.2-2) experimental; urgency=medium
+
+  * Disable test that failied on amd64 buildd
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 08 Mar 2021 23:03:52 +0530
+
+puma (5.2.2-1) experimental; urgency=medium
+
+  * New upstream version 5.2.2
+  * Bump Standards-Version to 4.5.1 (no changes needed)
+  * Refresh patches for new upstream release
+  * Add ruby-minitest-stub-const as build dependency
+  * Disable failing tests
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 07 Mar 2021 21:03:52 +0530
+
+puma (4.3.6-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream version.
+    - Fixes CVE-2020-11076 and CVE-2020-11077 (closes: #972102).
+  * d/copyright: Minor update.
+  * d/puma.lintian-overrides: Add package override.
+  * d/ruby-tests.rake: Add logic to run SSL test.
+  * d/patches/*.patch: Add missing headers and refresh.
+  * d/source/lintian-overrides: Add source override.
+  * d/tests/control: Set environment variable to run the SSL tests separately
+    (similar to the solution used in the jekyll package).
+  * d/tests/test-puma-server-ssl*: Removed.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 15 Oct 2020 20:57:29 +0200
+
+puma (4.3.3-3) unstable; urgency=medium
+
+  * Include patch from gitlab to improve performance
+
+ -- Pirate Praveen <praveen@debian.org>  Tue, 18 Aug 2020 00:15:20 +0530
+
+puma (4.3.3-2) unstable; urgency=medium
+
+  [ Daniel Leidert ]
+  * debian/tests/test_puma_server_ssl,
+    debian/tests/test_puma_server_ssl.rake: Run test/test_puma_server_ssl.rb
+    in an openssl enviroment not using the Debian defaults.
+  * debian/tests/control: Add new test.
+
+  [ Debian Janitor ]
+  * Set field Upstream-Contact in debian/copyright.
+  * Remove obsolete fields Contact, Name from debian/upstream/metadata
+    (already present in machine-readable debian/copyright).
+
+  [ Pirate Praveen ]
+  * Remove debian-branch option from debian/gbp.conf
+  * Reupload to unstable
+
+ -- Pirate Praveen <praveen@debian.org>  Mon, 03 Aug 2020 15:37:16 +0530
+
+puma (4.3.3-1) experimental; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+    - Fixes CVE-2020-5247 (closes: #952766).
+    - Fixes CVE-2020-5249 (closes: #953122).
+  * d/control (Section): Change to web.
+    (Vcs-Git): Indicate branch name via -b debian/experimental.
+    (Homepage): Use secure URL.
+    (Depends): Use ${ruby:Depends}.
+  * d/copyright (Source): Use secure URL.
+  * d/rules: Add override to install upstream changelog.
+  * d/watch: Use package name for tarball.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 05 Mar 2020 01:34:17 +0100
+
+puma (4.3.1-1) experimental; urgency=medium
+
+  * Team upload.
+  * New upstream release
+    - Fixes CVE-2019-16770 Keepalive thread overload/DoS (closes: #946312).
+  * d/control (Rules-Requires-Root): Set to binary-targets.
+    (Build-Depends, Depends): Add ruby-nio4r.
+    (Build-Depends): Add curl for test/test_integration_single.rb.
+  * d/ruby-tests.rake: Disable test/test_puma_server_ssl.rb.
+  * d/README.source: Add to explain tests which have been disabled.
+  * d/patches/0004-puma.gemspec-drop-git-usage.patch: Refresh patch.
+  * d/patches/0011-disable-minitest-extensions.patch: Add patch.
+    - Disable unavailable minitest extensions (retry and proveit).
+  * d/patches/0012-disable-cli-ssl-tests.patch: Add patch.
+    - Disable CLI SSL tests.
+  * d/patches/0013-fix-test-term-not-accepts-new-connections.patch: Add.
+    - Fix test_term_not_accepts_new_connections to be locale independent.
+  * d/patches/0002-test_integration-disable-test-that-fails-randomly.patch,
+    d/patches/0003-test_cli-disable-test-that-rails-randomly.patch,
+    d/patches/0005-test_puma_server-disable-test-that-fails-randomly.patch,
+    d/patches/0006-test-helper.rb-drop-bundler-usage.patch,
+    d/patches/0007-test-test_cli.rb-disable-test-that-fails-randomly.patch,
+    d/patches/0008-fix-ssl-tests.patch,
+    d/patches/0009-disable-tests-failing-in-single-cpu.patch,
+    d/patches/0010-fix-cluster-exit-for-ruby27.patch: Remove obsolete patches.
+  * d/patches/series: Adjust.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 06 Feb 2020 11:45:11 +0100
+
+puma (3.12.4-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+    - Fixes CVE-2020-5247 (closes: #952766).
+    - Fixes CVE-2020-5249 (closes: #953122).
+  * d/control (Section): Changed to web.
+    (Homepage): Use secure URL.
+    (Depends): Add ${ruby:Depends}.
+  * d/copyright (Source): Use secure URL.
+  * d/ruby-tests.rake: Disable test/test_puma_server_ssl.rb for the moment.
+    These tests fail due to openssl being configured to use SECLEVEL2
+    (https://github.com/puma/puma/issues/2147).
+  * d/rules: Add override to install upstream changelog.
+  * d/watch: Rename downloaded tarball to include package name.
+  * d/patches/0008-fix-ssl-tests.patch: Remove patch. Applied upstream.
+  * d/patches/CVE-2019-16770.patch: Ditto.
+  * d/patches/*.patch: Refresh patches.
+  * d/patches/series: Adjust.
+
+ -- Daniel Leidert <dleidert@debian.org>  Wed, 04 Mar 2020 23:09:16 +0100
+
+puma (3.12.0-4) unstable; urgency=medium
+
+  * Team upload.
+  * d/control (Rules-Requires-Root): Set to binary-targets.
+  * d/patches/0011-disable-minitest-extensions.patch: Add patch.
+    - Disable unavailable minitest retry extension.
+  * d/patches/CVE-2019-16770.patch: Add patch.
+    - Backport fix for CVE-2019-16770 from upstream (closes: #946312).
+  * d/patches/series: Add patch.
+
+ -- Daniel Leidert <dleidert@debian.org>  Thu, 06 Feb 2020 12:54:59 +0100
+
+puma (3.12.0-3) unstable; urgency=medium
+
+  * Team upload.
+  * d/compat: Remove obsolete file.
+  * d/control: Add Rules-Requires-Root field.
+    (Build-Depends): Use debhelper-compat.
+    (Standards-Version): Bump to 4.5.0.
+    (Depends): Drop ruby-interpreter.
+  * d/copyright (Format): Fix insecure-copyright-format-uri and add myself.
+  * d/puma.1, d/pumactl.1: Add manual pages.
+  * d/puma.manpages: Install manual pages.
+  * d/ruby-tests.rake: Set verbose mode.
+  * d/patches/0010-fix-cluster-exit-for-ruby27.patch: Add patch.
+    - Fix hang with Ruby >= 2.6 when shutting down workers.
+  * d/patches/series: Enable new patch.
+  * d/upstream/metadata: Add metadata.
+  * d/upstream/metadata: Add metadata.
+
+ -- Daniel Leidert <dleidert@debian.org>  Wed, 05 Feb 2020 18:20:58 +0100
+
+puma (3.12.0-2) unstable; urgency=medium
+
+  * Disable tests failing in single cpu (Closes: #921931)
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 10 Feb 2019 18:56:47 +0530
+
+puma (3.12.0-1) unstable; urgency=medium
+
+  [ Balint Reczey ]
+  * New upstream version 3.12.0
+  * Refresh patches
+
+  [ Pirate Praveen ]
+  * Fix OpenSSL 1.1.1 test failures with upstream patch (Closes: #900156)
+  * Bump Standards-Version to 4.3.0 (no changes needed)
+  * Add myself to uploaders
+
+ -- Pirate Praveen <praveen@debian.org>  Sun, 10 Feb 2019 10:56:59 +0530
+
+puma (3.11.3-1) unstable; urgency=medium
+
+  * Team upload
+  * Remove myself from Uploaders:
+  * New upstream version 3.11.3
+  * Build against libssl-dev instead of libssl1.0-dev (Closes: #859542)
+  * Refresh packaging files with `dh-make-ruby -wo .`
+    * Bump debhelper compat to 11
+    * Change Vcs-* to point to salsa.debian.org
+    * Use standard debian/ruby-tests.rake
+      * drop build-dependency on ruby-hoe
+  * Refresh patches
+  * New patches:
+    - 0006-test-helper.rb-drop-bundler-usage.patch
+    - 0007-test-test_cli.rb-disable-test-that-fails-randomly.patch
+  * Replace 0001-test_puma_server_ssl-update-for-newer-versions-of-Op.patch
+    with 0001-test_puma_server_ssl-disable-test-that-takes-too-lon.patch
+
+
+ -- Antonio Terceiro <terceiro@debian.org>  Wed, 28 Mar 2018 18:53:22 -0300
+
+puma (3.6.0-1) unstable; urgency=medium
+
+  * Initial release (Closes: #720336)
+
+ -- Antonio Terceiro <terceiro@debian.org>  Thu, 10 Nov 2016 16:47:06 -0200
diff --git a/clean b/clean
new file mode 100644 (file)
index 0000000..4535125
--- /dev/null
+++ b/clean
@@ -0,0 +1 @@
+tmp/restart.txt
diff --git a/control b/control
new file mode 100644 (file)
index 0000000..659a047
--- /dev/null
+++ b/control
@@ -0,0 +1,37 @@
+Source: puma
+Section: web
+Priority: optional
+Maintainer: Debian Ruby Team <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
+Uploaders: Pirate Praveen <praveen@debian.org>,
+           Lucas Kanashiro <kanashiro@debian.org>
+Build-Depends: curl,
+               debhelper-compat (= 13),
+               gem2deb (>= 1.6),
+               libssl-dev,
+               procps,
+               rake,
+               ruby-concurrent,
+               ruby-localhost,
+               ruby-minitest-stub-const,
+               ruby-nio4r (>= 2),
+               ruby-rack,
+               ruby-rackup | ruby-rack (<< 3),
+               ruby-sd-notify
+Standards-Version: 4.7.0
+Vcs-Git: https://salsa.debian.org/ruby-team/puma.git
+Vcs-Browser: https://salsa.debian.org/ruby-team/puma
+Homepage: https://puma.io
+Testsuite: autopkgtest-pkg-ruby
+Rules-Requires-Root: binary-targets
+
+Package: puma
+Architecture: any
+Breaks: rails (<< 2:6.1.7.3+dfsg-3~)
+Depends: ruby,
+         ${misc:Depends},
+         ${ruby:Depends},
+         ${shlibs:Depends}
+Description: threaded HTTP 1.1 server for Ruby/Rack applications
+ Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
+ Ruby/Rack applications. Puma is intended for use in both development and
+ production environments.
diff --git a/copyright b/copyright
new file mode 100644 (file)
index 0000000..70590cd
--- /dev/null
+++ b/copyright
@@ -0,0 +1,42 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: puma
+Upstream-Contact: https://github.com/puma/puma/issues
+Source: https://github.com/puma/puma
+
+Files: *
+Copyright: 2005, Zed Shaw
+           2011, Evan Phoenix
+License: BSD-3-clause
+
+Files: debian/*
+Copyright: 2016 Antonio Terceiro <terceiro@debian.org>
+           2020,2023 Daniel Leidert <dleidert@debian.org>
+           2023 Debian Ruby Extras Maintainers <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
+License: BSD-3-clause
+Comment: The Debian packaging is licensed under the same terms as the source.
+
+License: BSD-3-clause
+ All rights reserved.
+ .
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ .
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of the Evan Phoenix nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/gbp.conf b/gbp.conf
new file mode 100644 (file)
index 0000000..da9f191
--- /dev/null
+++ b/gbp.conf
@@ -0,0 +1,4 @@
+[DEFAULT]
+pristine-tar = true
+sign-tags = true
+verbose = true
diff --git a/patches/0004-puma.gemspec-drop-git-usage.patch b/patches/0004-puma.gemspec-drop-git-usage.patch
new file mode 100644 (file)
index 0000000..45b69ad
--- /dev/null
@@ -0,0 +1,23 @@
+From: Antonio Terceiro <terceiro@softwarelivre.org>
+Date: Wed, 5 Feb 2020 21:36:05 +0100
+Subject: Drop git usage from gemspec
+
+Forwarded: not-needed
+---
+ puma.gemspec | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+Index: puma/puma.gemspec
+===================================================================
+--- puma.orig/puma.gemspec
++++ puma/puma.gemspec
+@@ -18,8 +18,7 @@ Gem::Specification.new do |s|
+   if RbConfig::CONFIG['ruby_version'] >= '2.5'
+     s.metadata["msys2_mingw_dependencies"] = "openssl"
+   end
+-  s.files = `git ls-files -- bin docs ext lib tools`.split("\n") +
+-            %w[History.md LICENSE README.md]
++  s.files = Dir.glob('**/*').reject { |f| f =~ /^debian\//}
+   s.homepage = "https://puma.io"
+   if s.respond_to?(:metadata=)
diff --git a/patches/0010-Disable-test-concurrency-without-concurrent_ruby.patch b/patches/0010-Disable-test-concurrency-without-concurrent_ruby.patch
new file mode 100644 (file)
index 0000000..967e60d
--- /dev/null
@@ -0,0 +1,25 @@
+From: Lucas Nussbaum <lucas@debian.org>
+Date: Wed, 5 Feb 2025 14:17:14 +0100
+Subject: Disable test concurrency without concurrent_ruby
+
+The way this is implemented (moving away the gem in $HOME) looks dangerous and
+doesn't work for non-user-installed packages.
+
+Forwarded: not-needed
+---
+ test/test_web_concurrency_auto.rb | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/test/test_web_concurrency_auto.rb b/test/test_web_concurrency_auto.rb
+index 8afebe6..a2fed7a 100644
+--- a/test/test_web_concurrency_auto.rb
++++ b/test/test_web_concurrency_auto.rb
+@@ -39,7 +39,7 @@ class TestWebConcurrencyAuto < TestIntegration
+   end
+   # Rename the processor_counter file, then restore
+-  def test_web_concurrency_with_concurrent_ruby_unavailable
++  def xxtest_web_concurrency_with_concurrent_ruby_unavailable
+     file_path = nil
+     skip_unless :fork
diff --git a/patches/0011-disable-minitest-extensions.patch b/patches/0011-disable-minitest-extensions.patch
new file mode 100644 (file)
index 0000000..6ec39ca
--- /dev/null
@@ -0,0 +1,43 @@
+From: Daniel Leidert <daniel.leidert@wgdd.de>
+Date: Wed, 5 Feb 2020 22:20:42 +0100
+Subject: Disable unavailable minitest extensions
+
+Forwarded: not-needed
+---
+ test/helper.rb | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+Index: puma/test/helper.rb
+===================================================================
+--- puma.orig/test/helper.rb
++++ puma/test/helper.rb
+@@ -25,7 +25,6 @@ require_relative "helpers/test_puma/asse
+ require_relative "minitest/verbose"
+ require "minitest/autorun"
+ require "minitest/pride"
+-require "minitest/proveit"
+ require "minitest/stub_const"
+ require "net/http"
+ require_relative "helpers/apps"
+@@ -105,12 +104,9 @@ class TimeoutTestCase < Minitest::Test #
+ end
+ if ENV['CI']
+-  require 'minitest/retry'
+   SUMMARY_FILE = ENV['GITHUB_STEP_SUMMARY']
+-  Minitest::Retry.use!
+-
+   if SUMMARY_FILE && ENV['GITHUB_ACTIONS'] == 'true'
+     GITHUB_STEP_SUMMARY_MUTEX = Mutex.new
+@@ -210,7 +206,7 @@ class Minitest::Test
+   PROJECT_ROOT = File.dirname(__dir__)
+   def self.run(reporter, options = {}) # :nodoc:
+-    prove_it!
++    #prove_it!
+     super
+   end
diff --git a/patches/0012-disable-cli-ssl-tests.patch b/patches/0012-disable-cli-ssl-tests.patch
new file mode 100644 (file)
index 0000000..e8dcd42
--- /dev/null
@@ -0,0 +1,28 @@
+From: Daniel Leidert <daniel.leidert@wgdd.de>
+Date: Wed, 5 Feb 2020 23:18:37 +0100
+Subject: Disable cli ssl tests
+
+Forwarded: not-needed
+---
+ test/test_pumactl.rb | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: puma/test/test_pumactl.rb
+===================================================================
+--- puma.orig/test/test_pumactl.rb
++++ puma/test/test_pumactl.rb
+@@ -251,12 +251,12 @@ class TestPumaControlCli < TimeoutTestCa
+   end
+-  def test_control_ssl_ipv4
++  def __test_control_ssl_ipv4
+     skip_unless :ssl
+     control_ssl '127.0.0.1'
+   end
+-  def test_control_ssl_ipv6
++  def __test_control_ssl_ipv6
+     skip_unless :ssl
+     control_ssl '[::1]'
+   end
diff --git a/patches/0013-fix-test-term-not-accepts-new-connections.patch b/patches/0013-fix-test-term-not-accepts-new-connections.patch
new file mode 100644 (file)
index 0000000..4583cad
--- /dev/null
@@ -0,0 +1,24 @@
+From: Daniel Leidert <daniel.leidert@wgdd.de>
+Date: Thu, 6 Feb 2020 11:24:24 +0100
+Subject: Fix test to read output locale independent
+
+The test fails if run in a non-English environment.
+
+Forwarded: https://github.com/puma/puma/issues/2149
+---
+ test/test_integration_single.rb | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: puma/test/test_integration_single.rb
+===================================================================
+--- puma.orig/test/test_integration_single.rb
++++ puma/test/test_integration_single.rb
+@@ -121,7 +121,7 @@ class TestIntegrationSingle < TestIntegr
+     assert wait_for_server_to_include('Gracefully stopping') # wait for server to begin graceful shutdown
+     # Invoke a request which must be rejected
+-    _stdin, _stdout, rejected_curl_stderr, rejected_curl_wait_thread = Open3.popen3("curl #{HOST}:#{@tcp_port}")
++    _stdin, _stdout, rejected_curl_stderr, rejected_curl_wait_thread = Open3.popen3({ "LC_ALL" => "C" }, "curl http://#{HOST}:#{@tcp_port}")
+     assert nil != Process.getpgid(@server.pid) # ensure server is still running
+     assert nil != Process.getpgid(curl_wait_thread[:pid]) # ensure first curl invocation still in progress
diff --git a/patches/0014-disable-test-failing-on-amd64.patch b/patches/0014-disable-test-failing-on-amd64.patch
new file mode 100644 (file)
index 0000000..ce0677d
--- /dev/null
@@ -0,0 +1,25 @@
+From: Pirate Praveen <praveen@debian.org>
+Date: Mon, 8 Mar 2021 23:03:21 +0530
+Subject: Disable test that failied on amd64 buildd
+
+This test failed on amd64 buildd
+https://buildd.debian.org/status/fetch.php?pkg=puma&arch=amd64&ver=5.2.2-1&stamp=1615133735&raw=0
+
+Forwarded: not-needed
+---
+ test/test_puma_server.rb | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: puma/test/test_puma_server.rb
+===================================================================
+--- puma.orig/test/test_puma_server.rb
++++ puma/test/test_puma_server.rb
+@@ -1735,7 +1735,7 @@ class TestPumaServer < TimeoutTestCase
+     end
+   end
+-  def test_command_ignored_before_run
++  def __test_command_ignored_before_run
+     @server.stop # ignored
+     @server.run
+     @server.halt
diff --git a/patches/0015-disable-different-output-test.patch b/patches/0015-disable-different-output-test.patch
new file mode 100644 (file)
index 0000000..75c31e4
--- /dev/null
@@ -0,0 +1,15 @@
+Output changed from 'OK' to '::Rack::URLMap is loaded'
+
+Index: puma/test/test_url_map.rb
+===================================================================
+--- puma.orig/test/test_url_map.rb
++++ puma/test/test_url_map.rb
+@@ -9,7 +9,7 @@ class TestURLMap < TestIntegration
+   end
+   # make sure the mapping defined in url_map_test/config.ru works
+-  def test_basic_url_mapping
++  def __test_basic_url_mapping
+     skip_if :jruby
+     env = { "BUNDLE_GEMFILE" => "#{__dir__}/url_map_test/Gemfile" }
+     Dir.chdir("#{__dir__}/url_map_test") do
diff --git a/patches/0016-disable-test-failing-on-arm64.patch b/patches/0016-disable-test-failing-on-arm64.patch
new file mode 100644 (file)
index 0000000..6e038dd
--- /dev/null
@@ -0,0 +1,15 @@
+this test is failing on arm64 buildd (sometimes on other archs as well)
+
+Index: puma/test/test_plugin_systemd.rb
+===================================================================
+--- puma.orig/test/test_plugin_systemd.rb
++++ puma/test/test_plugin_systemd.rb
+@@ -31,7 +31,7 @@ class TestPluginSystemd < TestIntegratio
+     super
+   end
+-  def test_systemd_notify_usr1_phased_restart_cluster
++  def __test_systemd_notify_usr1_phased_restart_cluster
+     skip_unless :fork
+     assert_restarts_with_systemd :USR1
+   end
diff --git a/patches/0017-disable-test-failing-on-armhf.patch b/patches/0017-disable-test-failing-on-armhf.patch
new file mode 100644 (file)
index 0000000..7e984f2
--- /dev/null
@@ -0,0 +1,15 @@
+https://ci.debian.net/packages/p/puma/testing/armhf/42745746/
+
+Index: puma/test/test_integration_ssl_session.rb
+===================================================================
+--- puma.orig/test/test_integration_ssl_session.rb
++++ puma/test/test_integration_ssl_session.rb
+@@ -122,7 +122,7 @@ class TestIntegrationSSLSession < TestIn
+     assert reused, 'session was not reused'
+   end
+-  def test_off_tls1_2
++  def __test_off_tls1_2
+     ssl_vers = Puma::MiniSSL::OPENSSL_LIBRARY_VERSION
+     old_ssl = ssl_vers.include?(' 1.0.') || ssl_vers.match?(/ 1\.1\.1[ a-e]/)
+     skip 'Requires 1.1.1f or later' if old_ssl
diff --git a/patches/0018-disable-test-failing-with-ruby3.2.patch b/patches/0018-disable-test-failing-with-ruby3.2.patch
new file mode 100644 (file)
index 0000000..5749467
--- /dev/null
@@ -0,0 +1,179 @@
+From: Debian Ruby Team <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
+Date: Mon, 23 Dec 2024 19:26:53 -0300
+Subject: Skip tests failing with ruby3.2 in Ubuntu
+
+  1) Error:
+TestRackUp::RackUp#test_bin:
+TimeoutEveryTestCase::TestTookTooLong: execution expired
+    /<<PKGBUILDDIR>>/test/test_rack_handler.rb:318:in `sysread'
+    /<<PKGBUILDDIR>>/test/test_rack_handler.rb:318:in `test_bin'
+    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
+    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
+    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
+    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
+
+Those tests reported the following errors:
+
+  2) Error:
+TestCLI#test_control_clustered:
+TimeoutEveryTestCase::TestTookTooLong: execution expired
+    /<<PKGBUILDDIR>>/test/test_cli.rb:136:in `join'
+    /<<PKGBUILDDIR>>/test/test_cli.rb:136:in `test_control_clustered'
+    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
+    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
+    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
+    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
+
+  3) Error:
+TestPluginSystemd#test_systemd_notify_usr2_hot_restart_cluster:
+Errno::EPIPE: Broken pipe
+    /<<PKGBUILDDIR>>/test/test_plugin_systemd.rb:90:in `write'
+    /<<PKGBUILDDIR>>/test/test_plugin_systemd.rb:90:in `assert_restarts_with_systemd'
+    /<<PKGBUILDDIR>>/test/test_plugin_systemd.rb:42:in `test_systemd_notify_usr2_hot_restart_cluster'
+    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
+    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
+    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
+    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
+
+  4) Error:
+TestIntegrationPumactl#test_halt_unix:
+Errno::ECHILD: No child processes
+    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:55:in `wait2'
+    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:55:in `ctl_unix'
+    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:42:in `test_halt_unix'
+    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
+    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
+    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
+    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
+
+  5) Error:
+TestIntegrationPumactl#test_stop_unix:
+Errno::ECHILD: No child processes
+    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:55:in `wait2'
+    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:55:in `ctl_unix'
+    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:38:in `test_stop_unix'
+    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
+    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
+    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
+    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
+
+  6) Error:
+TestPumaServer#test_timeout_in_data_phase:
+TimeoutEveryTestCase::TestTookTooLong: execution expired
+    /<<PKGBUILDDIR>>/debian/puma/usr/lib/x86_64-linux-gnu/rubygems-integration/3.2.0/gems/puma-6.4.2/lib/puma/server.rb:627:in `join'
+    /<<PKGBUILDDIR>>/debian/puma/usr/lib/x86_64-linux-gnu/rubygems-integration/3.2.0/gems/puma-6.4.2/lib/puma/server.rb:627:in `stop'
+    /<<PKGBUILDDIR>>/test/test_puma_server.rb:31:in `teardown'
+    /<<PKGBUILDDIR>>/test/helper.rb:96:in `block (5 levels) in run'
+    /<<PKGBUILDDIR>>/test/helper.rb:96:in `each'
+    /<<PKGBUILDDIR>>/test/helper.rb:96:in `block (4 levels) in run'
+    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
+    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
+    /<<PKGBUILDDIR>>/test/helper.rb:95:in `block (3 levels) in run'
+ .
+ Extra failure in Debian:
+ .
+  1) Error:
+TestIntegrationSingle#test_puma_debug_loaded_exts:
+TimeoutEveryTestCase::TestTookTooLong: execution expired
+    /build/reproducible-path/puma-6.4.3/test/helpers/integration.rb:125:in `wait2'
+    /build/reproducible-path/puma-6.4.3/test/helpers/integration.rb:125:in `stop_server'
+    /build/reproducible-path/puma-6.4.3/test/helpers/integration.rb:39:in `teardown'
+    /build/reproducible-path/puma-6.4.3/test/helper.rb:96:in `block (5 levels) in run'
+    /build/reproducible-path/puma-6.4.3/test/helper.rb:96:in `each'
+    /build/reproducible-path/puma-6.4.3/test/helper.rb:96:in `block (4 levels) in run'
+    /usr/lib/ruby/3.3.0/timeout.rb:186:in `block in timeout'
+    /usr/lib/ruby/3.3.0/timeout.rb:193:in `timeout'
+    /build/reproducible-path/puma-6.4.3/test/helper.rb:95:in `block (3 levels) in run'
+ .
+ They do not seem real regressions, so skipping them for now.
+Author: Lucas Kanashiro <lucas.kanashiro@canonical.com>
+Last-Updated: 2024-12-23
+Forwarded: not-needed
+---
+ test/test_cli.rb                 | 2 +-
+ test/test_integration_pumactl.rb | 4 ++--
+ test/test_integration_single.rb  | 2 +-
+ test/test_plugin_systemd.rb      | 2 +-
+ test/test_puma_server.rb         | 4 ++--
+ test/test_rack_handler.rb        | 2 +-
+ 6 files changed, 8 insertions(+), 8 deletions(-)
+
+Index: puma/test/test_integration_pumactl.rb
+===================================================================
+--- puma.orig/test/test_integration_pumactl.rb
++++ puma/test/test_integration_pumactl.rb
+@@ -31,11 +31,11 @@ class TestIntegrationPumactl < TestInteg
+     wait_server
+   end
+-  def test_stop_unix
++  def __test_stop_unix
+     ctl_unix
+   end
+-  def test_halt_unix
++  def __test_halt_unix
+     ctl_unix 'halt'
+   end
+Index: puma/test/test_integration_single.rb
+===================================================================
+--- puma.orig/test/test_integration_single.rb
++++ puma/test/test_integration_single.rb
+@@ -247,7 +247,7 @@ class TestIntegrationSingle < TestIntegr
+     assert true
+   end
+-  def test_puma_debug_loaded_exts
++  def _test_puma_debug_loaded_exts
+     cli_server "#{set_pumactl_args} test/rackup/hello.ru", puma_debug: true
+     assert wait_for_server_to_include('Loaded Extensions:')
+Index: puma/test/test_plugin_systemd.rb
+===================================================================
+--- puma.orig/test/test_plugin_systemd.rb
++++ puma/test/test_plugin_systemd.rb
+@@ -36,7 +36,7 @@ class TestPluginSystemd < TestIntegratio
+     assert_restarts_with_systemd :USR1
+   end
+-  def test_systemd_notify_usr2_hot_restart_cluster
++  def __test_systemd_notify_usr2_hot_restart_cluster
+     skip_unless :fork
+     assert_restarts_with_systemd :USR2
+   end
+Index: puma/test/test_puma_server.rb
+===================================================================
+--- puma.orig/test/test_puma_server.rb
++++ puma/test/test_puma_server.rb
+@@ -602,7 +602,7 @@ class TestPumaServer < TimeoutTestCase
+     assert_equal [:booting, :running, :stop, :done], states
+   end
+-  def test_timeout_in_data_phase(**options)
++  def __test_timeout_in_data_phase(**options)
+     server_run(first_data_timeout: 1, **options)
+     socket = send_http "POST / HTTP/1.1\r\nHost: test.com\r\nContent-Type: text/plain\r\nContent-Length: 5\r\n\r\n"
+@@ -615,7 +615,7 @@ class TestPumaServer < TimeoutTestCase
+     assert_equal "HTTP/1.1 408 #{STATUS_CODES[408]}", response.status
+   end
+-  def test_timeout_data_no_queue
++  def __test_timeout_data_no_queue
+     test_timeout_in_data_phase(queue_requests: false)
+   end
+Index: puma/test/test_rack_handler.rb
+===================================================================
+--- puma.orig/test/test_rack_handler.rb
++++ puma/test/test_rack_handler.rb
+@@ -345,7 +345,7 @@ module TestRackUp
+       FileUtils.rm 'config.ru'
+     end
+-    def test_bin
++    def __test_bin
+       pid = nil
+       # JRuby & TruffleRuby take a long time using IO.popen
+       skip_unless :mri
diff --git a/patches/0019-adapt-test-certs-generation.patch b/patches/0019-adapt-test-certs-generation.patch
new file mode 100644 (file)
index 0000000..b3fac59
--- /dev/null
@@ -0,0 +1,80 @@
+From: Athos Ribeiro <athos@debian.org>
+Date: Thu, 17 Jul 2025 06:35:51 -0300
+Subject: Adapt test certificates generation
+
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1078640
+Forwarded: not-needed
+Last-Update: 2025-07-15
+
+Adapt the test certificates generation process to Debian. For that, we extend
+the validity of the certificates to 11 years to try to cover the Debian support
+(and hopefully the LTS/eLTS) window as long as a build is performed 1 year
+before a release. We also require certificate_authority from the installed
+package so we can generate this certificates without external packages.
+Last-Update: 2025-07-15
+---
+ examples/generate_chain_test.rb  | 9 ++++-----
+ examples/generate_client_test.rb | 2 +-
+ examples/generate_server_test.rb | 2 +-
+ 3 files changed, 6 insertions(+), 7 deletions(-)
+
+diff --git a/examples/generate_chain_test.rb b/examples/generate_chain_test.rb
+index 2676760..d84c7ae 100644
+--- a/examples/generate_chain_test.rb
++++ b/examples/generate_chain_test.rb
+@@ -11,10 +11,7 @@ certs before date will be the first of the current month
+ =end
+ require 'bundler/inline'
+-gemfile(true) do
+-  source 'https://rubygems.org'
+-  gem 'certificate_authority'
+-end
++require 'certificate_authority'
+ module GenerateChainCerts
+@@ -39,7 +36,7 @@ module GenerateChainCerts
+         {
+           not_before: Time.new(yr, mo, 1, 0, 0, 0, zone),
+-          not_after:  Time.new(yr+4, mo, 1, 0, 0, 0, zone)
++          not_after:  Time.new(yr+11, mo, 1, 0, 0, 0, zone)
+         }
+       )
+     end
+@@ -83,6 +80,8 @@ module GenerateChainCerts
+       cert.subject.common_name  = common_name
+       cert.serial_number.number = parent.serial_number.number + 100
+       cert.parent               = parent
++      cert.not_before          = before_after[:not_before]
++      cert.not_after           = before_after[:not_after]
+       cert.key_material.generate_key
+       cert.sign!
+diff --git a/examples/generate_client_test.rb b/examples/generate_client_test.rb
+index f875916..e197428 100644
+--- a/examples/generate_client_test.rb
++++ b/examples/generate_client_test.rb
+@@ -107,7 +107,7 @@ module GenerateClientCerts
+       zone = '+00:00'
+       @before = Time.new yr  , mo, 1, 0, 0, 0, zone
+-      @after  = Time.new yr+4, mo, 1, 0, 0, 0, zone
++      @after  = Time.new yr+11, mo, 1, 0, 0, 0, zone
+       @b_exp  = Time.new yr-1, mo, 1, 0, 0, 0, zone
+       @a_exp  = Time.new yr  , mo, 1, 0, 0, 0, zone
+diff --git a/examples/generate_server_test.rb b/examples/generate_server_test.rb
+index cf9364a..f73e660 100644
+--- a/examples/generate_server_test.rb
++++ b/examples/generate_server_test.rb
+@@ -33,7 +33,7 @@ module GenerateServerCerts
+       zone = '+00:00'
+       cert.not_before = Time.new yr  , mo, 1, 0, 0, 0, zone
+-      cert.not_after  = Time.new yr+4, mo, 1, 0, 0, 0, zone
++      cert.not_after  = Time.new yr+11, mo, 1, 0, 0, 0, zone
+       cert.public_key = key.public_key
+       cert.sign ca_key, SIGN_ALGORITHM.new
+       puts "New:", cert.to_text, ""
diff --git a/patches/0020-update-ex-certs.patch b/patches/0020-update-ex-certs.patch
new file mode 100644 (file)
index 0000000..05c5e47
--- /dev/null
@@ -0,0 +1,1499 @@
+From: Athos Ribeiro <athos.ribeiro@canonical.com>
+Date: Tue, 15 Jul 2025 10:38:43 -0300
+Subject: Update example certificates
+
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1078640
+Forwarded: not-needed
+Last-Update: 2025-07-15
+
+Update the example certificates so that the upstream unit tests keep
+passing throughout the next Debian release (trixie) support cycle.  This
+is done by updating the certificates validity to 11 years (possibly
+covering LTS/eLTS).
+Last-Update: 2025-07-15
+---
+ examples/puma/cert_puma.pem                     |  30 ++++----
+ examples/puma/chain_cert/ca.crt                 |  33 ++++----
+ examples/puma/chain_cert/ca.key                 |  50 ++++++------
+ examples/puma/chain_cert/ca_chain.pem           |  65 ++++++++--------
+ examples/puma/chain_cert/cert.crt               |  32 ++++----
+ examples/puma/chain_cert/cert.key               |  50 ++++++------
+ examples/puma/chain_cert/cert_chain.pem         |  97 ++++++++++++------------
+ examples/puma/chain_cert/intermediate.crt       |  32 ++++----
+ examples/puma/chain_cert/intermediate.key       |  50 ++++++------
+ examples/puma/client_certs/ca.crt               |  28 +++----
+ examples/puma/client_certs/ca.key               |  50 ++++++------
+ examples/puma/client_certs/ca_store.jks         | Bin 848 -> 848 bytes
+ examples/puma/client_certs/ca_store.p12         | Bin 2568 -> 2584 bytes
+ examples/puma/client_certs/client.crt           |  30 ++++----
+ examples/puma/client_certs/client.key           |  50 ++++++------
+ examples/puma/client_certs/client_expired.crt   |  30 ++++----
+ examples/puma/client_certs/client_expired.key   |  50 ++++++------
+ examples/puma/client_certs/client_unknown.crt   |  30 ++++----
+ examples/puma/client_certs/client_unknown.key   |  50 ++++++------
+ examples/puma/client_certs/keystore.jks         | Bin 4392 -> 4392 bytes
+ examples/puma/client_certs/server.crt           |  30 ++++----
+ examples/puma/client_certs/server.key           |  50 ++++++------
+ examples/puma/client_certs/server.p12           | Bin 3408 -> 3424 bytes
+ examples/puma/client_certs/unknown_ca.crt       |  28 +++----
+ examples/puma/client_certs/unknown_ca.key       |  50 ++++++------
+ examples/puma/client_certs/unknown_ca_store.p12 | Bin 2592 -> 2608 bytes
+ examples/puma/encrypted_puma_keypair.pem        |  56 +++++++-------
+ examples/puma/keystore.jks                      | Bin 2253 -> 2252 bytes
+ examples/puma/puma_keypair.pem                  |  50 ++++++------
+ examples/puma/server.p12                        | Bin 2700 -> 2716 bytes
+ 30 files changed, 509 insertions(+), 512 deletions(-)
+
+diff --git a/examples/puma/cert_puma.pem b/examples/puma/cert_puma.pem
+index 6cbb9c1..cace838 100644
+--- a/examples/puma/cert_puma.pem
++++ b/examples/puma/cert_puma.pem
+@@ -1,21 +1,21 @@
+ -----BEGIN CERTIFICATE-----
+ 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
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/ca.crt b/examples/puma/chain_cert/ca.crt
+index 9acfe79..bcc8e26 100644
+--- a/examples/puma/chain_cert/ca.crt
++++ b/examples/puma/chain_cert/ca.crt
+@@ -1,20 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
+-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
+-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
+-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
+-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
+-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
+-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
+-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
+-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
+-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
+-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
+-8uByucqDNovFjYNMKw==
++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/ca.key b/examples/puma/chain_cert/ca.key
+index c884487..8de2968 100644
+--- a/examples/puma/chain_cert/ca.key
++++ b/examples/puma/chain_cert/ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/chain_cert/ca_chain.pem b/examples/puma/chain_cert/ca_chain.pem
+index 7d500ef..7196332 100644
+--- a/examples/puma/chain_cert/ca_chain.pem
++++ b/examples/puma/chain_cert/ca_chain.pem
+@@ -1,40 +1,39 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
+-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
+-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
+-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
+-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
+-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
+-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
+-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
+-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
+-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
+-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
+-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
+-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
+-iX6YKGNd
++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
++05PKNc+5
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
+-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
+-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
+-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
+-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
+-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
+-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
+-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
+-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
+-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
+-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
+-8uByucqDNovFjYNMKw==
++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/cert.crt b/examples/puma/chain_cert/cert.crt
+index 8467b47..89010e8 100644
+--- a/examples/puma/chain_cert/cert.crt
++++ b/examples/puma/chain_cert/cert.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
+-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwODExMDAwMDAwWhcNMjUwODEx
++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjUwNzAxMDAwMDAwWhcNMzYwNzAx
+ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
+-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkH1hQqC0EFwYxi5+Ihqat9Yqebpk0A9x
+-ZzdO68eBSw4glnhh/+8VNB238q3nVD+0oL5oOBFVPAA34jUrrngS3LSl7tx4y1tj
+-jqn2LwKkdjAaaQn7uNKf/Ow6JX8dsaFpEUmabOzQBbhQtUDdbHmX1jgJYy8siSdU
+-ExXtNHAA+kqlif0Hcj1Xx8dlXQlLiDgdO1I5h84rjfdX+TUGwnJO5MkIZ5X5r6tE
+-hk8s/2dvbrU2AKcP+pTY4jw/fyDNd9q8OdW186RlBdS+uyX3D2hh+8aVLONQIJOx
+-wRyQaImYzHPWMDO6MuQ5/5LAxFFYWCGSLvUTdrillB0Snmppe9uGhwIDAQABo28w
+-bTAdBgNVHQ4EFgQUQT/iPOTx/zDEIgWHiraGJdrud74wCwYDVR0PBAQDAgbAMBMG
+-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU1V8CDxIv
+-GpM3njBhaJZ/FWJz6IcwDQYJKoZIhvcNAQENBQADggEBADHQ75un1UtxDI9oluXu
+-wEJL0515nIAKjaWFCl0Z/CGaAWkkJERk0JBxTe9J/MrYY68NYCCAusRoUoRbvcA2
+-GQ8vKae5V6/md+npZpKQznmUk+nZMzNKr+QoMY/nvtLA5tZ85fsU40H4nbvb23EY
+-3o6IiEbLD0G3FbIFtkgQ7+j9w6bvvMwd+3Ed0jSjRl4wKi4cXgD1UIyce/MVzAzT
+-bXW2SLWjfRzcTsrAnrbno5S3g+KMD1w9zGNppYiFH0zydpatKjJW18r/6XgJqoim
+-Rl5OGVnMNgIAw+S8/G3+/IIPXWHFE29R3j3oXjm/F8570TpQTYyx8wOmEr+zJPv0
+-8gU=
++hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnweGJw3HXhvtIAFL6i3hzFdD5F3UG2Nm
++hIGaiKyDy71b25rkXFduG8R9i4s5rVBUdafA2OlrRDWMMrlYSudJnlB6P2jtBRxB
++7iw66vBVCBstDiKEr5xWFceG+2WpHU1peLCj72Ujuy/Xc/85S+70a9ISXItDRuyY
++tNTLi1HROioH6A0MfpvoLKxHYyoJ1dxu/eXikY8uk+J1cKogOP0jjn0VieJXptqc
++nHICV5/LmX3KC7ZxowexrQhTw81cKtx0fVeyZAHlM0rmIj23iajLqLtE+tq07P50
++OP8uABiK53L9RH55SlM/7PjDss6/VZDG7xsRBhEzaU39jOuSmZdrewIDAQABo28w
++bTAdBgNVHQ4EFgQUBt0gNG2VFq4KeC5rPkvqxlxUZpgwCwYDVR0PBAQDAgbAMBMG
++A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUDH40Tp0C
++9PsflBT7LIr3BXriX84wDQYJKoZIhvcNAQENBQADggEBAIsh0gAB91/phH0XSbaV
++5X7bOvUQZBkF6VU3FMSKz1qeP7zhxhHnsTQVAWRCT4QdQ0bXzWDaUubUfS1uL9fW
++hMS6qJ/X56WjYvzUqr6Haxxc6nF2SzaZfNHC02uBOBqZaOWsf0rEv4M9A1PPPyy4
++ZO5nCLsLvReiAXViAyRO2HjXej/820fXh0uwEZgR8tUaQEt5frphr9cT/Q70kn+M
++XfpXvhGmLZ9C+0pXS0ILJRb8DccdfL6UMmQEPyfuW2OJrCDwvK3aG4KA2mdAg9Ca
++OvxCQ9WgAkMR2P7dHovoYaMsl8Nipiy/i0YeVG1rJAledWOO05xiVPdiTPkJk8JC
++PPU=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/cert.key b/examples/puma/chain_cert/cert.key
+index ed2bd0d..790455c 100644
+--- a/examples/puma/chain_cert/cert.key
++++ b/examples/puma/chain_cert/cert.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/chain_cert/cert_chain.pem b/examples/puma/chain_cert/cert_chain.pem
+index 5f391f3..40ed0f5 100644
+--- a/examples/puma/chain_cert/cert_chain.pem
++++ b/examples/puma/chain_cert/cert_chain.pem
+@@ -1,60 +1,59 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
+-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwODExMDAwMDAwWhcNMjUwODEx
++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjUwNzAxMDAwMDAwWhcNMzYwNzAx
+ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
+-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkH1hQqC0EFwYxi5+Ihqat9Yqebpk0A9x
+-ZzdO68eBSw4glnhh/+8VNB238q3nVD+0oL5oOBFVPAA34jUrrngS3LSl7tx4y1tj
+-jqn2LwKkdjAaaQn7uNKf/Ow6JX8dsaFpEUmabOzQBbhQtUDdbHmX1jgJYy8siSdU
+-ExXtNHAA+kqlif0Hcj1Xx8dlXQlLiDgdO1I5h84rjfdX+TUGwnJO5MkIZ5X5r6tE
+-hk8s/2dvbrU2AKcP+pTY4jw/fyDNd9q8OdW186RlBdS+uyX3D2hh+8aVLONQIJOx
+-wRyQaImYzHPWMDO6MuQ5/5LAxFFYWCGSLvUTdrillB0Snmppe9uGhwIDAQABo28w
+-bTAdBgNVHQ4EFgQUQT/iPOTx/zDEIgWHiraGJdrud74wCwYDVR0PBAQDAgbAMBMG
+-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU1V8CDxIv
+-GpM3njBhaJZ/FWJz6IcwDQYJKoZIhvcNAQENBQADggEBADHQ75un1UtxDI9oluXu
+-wEJL0515nIAKjaWFCl0Z/CGaAWkkJERk0JBxTe9J/MrYY68NYCCAusRoUoRbvcA2
+-GQ8vKae5V6/md+npZpKQznmUk+nZMzNKr+QoMY/nvtLA5tZ85fsU40H4nbvb23EY
+-3o6IiEbLD0G3FbIFtkgQ7+j9w6bvvMwd+3Ed0jSjRl4wKi4cXgD1UIyce/MVzAzT
+-bXW2SLWjfRzcTsrAnrbno5S3g+KMD1w9zGNppYiFH0zydpatKjJW18r/6XgJqoim
+-Rl5OGVnMNgIAw+S8/G3+/IIPXWHFE29R3j3oXjm/F8570TpQTYyx8wOmEr+zJPv0
+-8gU=
++hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnweGJw3HXhvtIAFL6i3hzFdD5F3UG2Nm
++hIGaiKyDy71b25rkXFduG8R9i4s5rVBUdafA2OlrRDWMMrlYSudJnlB6P2jtBRxB
++7iw66vBVCBstDiKEr5xWFceG+2WpHU1peLCj72Ujuy/Xc/85S+70a9ISXItDRuyY
++tNTLi1HROioH6A0MfpvoLKxHYyoJ1dxu/eXikY8uk+J1cKogOP0jjn0VieJXptqc
++nHICV5/LmX3KC7ZxowexrQhTw81cKtx0fVeyZAHlM0rmIj23iajLqLtE+tq07P50
++OP8uABiK53L9RH55SlM/7PjDss6/VZDG7xsRBhEzaU39jOuSmZdrewIDAQABo28w
++bTAdBgNVHQ4EFgQUBt0gNG2VFq4KeC5rPkvqxlxUZpgwCwYDVR0PBAQDAgbAMBMG
++A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUDH40Tp0C
++9PsflBT7LIr3BXriX84wDQYJKoZIhvcNAQENBQADggEBAIsh0gAB91/phH0XSbaV
++5X7bOvUQZBkF6VU3FMSKz1qeP7zhxhHnsTQVAWRCT4QdQ0bXzWDaUubUfS1uL9fW
++hMS6qJ/X56WjYvzUqr6Haxxc6nF2SzaZfNHC02uBOBqZaOWsf0rEv4M9A1PPPyy4
++ZO5nCLsLvReiAXViAyRO2HjXej/820fXh0uwEZgR8tUaQEt5frphr9cT/Q70kn+M
++XfpXvhGmLZ9C+0pXS0ILJRb8DccdfL6UMmQEPyfuW2OJrCDwvK3aG4KA2mdAg9Ca
++OvxCQ9WgAkMR2P7dHovoYaMsl8Nipiy/i0YeVG1rJAledWOO05xiVPdiTPkJk8JC
++PPU=
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
+-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
+-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
+-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
+-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
+-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
+-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
+-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
+-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
+-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
+-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
+-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
+-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
+-iX6YKGNd
++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
++05PKNc+5
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
+-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
+-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
+-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
+-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
+-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
+-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
+-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
+-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
+-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
+-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
+-8uByucqDNovFjYNMKw==
++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/intermediate.crt b/examples/puma/chain_cert/intermediate.crt
+index cc9895e..501d1ad 100644
+--- a/examples/puma/chain_cert/intermediate.crt
++++ b/examples/puma/chain_cert/intermediate.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
+-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
+-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
+-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
+-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
+-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
+-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
+-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
+-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
+-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
+-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
+-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
+-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
+-iX6YKGNd
++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
++05PKNc+5
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/intermediate.key b/examples/puma/chain_cert/intermediate.key
+index 9269949..a1d0df4 100644
+--- a/examples/puma/chain_cert/intermediate.key
++++ b/examples/puma/chain_cert/intermediate.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/ca.crt b/examples/puma/client_certs/ca.crt
+index c3d39dc..599b16a 100644
+--- a/examples/puma/client_certs/ca.crt
++++ b/examples/puma/client_certs/ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
+-ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjUw
++NzAxMDAwMDAwWhcNMzYwNzAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
+-DQEBAQUAA4IBDwAwggEKAoIBAQDPVFa7U4cqfq2Nux7VuXIUhYtaiQwxEEZuDvGI
+-tlSVzpENnqFLbqH0QsOuxGgIZofsrSf4BrCzh4AoL3qY+HgVRCmkD09FnoWjFTfT
+-X6v7QaCtUsrb7RNASrrgyP7rB9y7sp9oc8FNJQA3gtJQxghffO9zGhnEvPt8EGGU
+-axh29BYVxvQpX1Av0SkYjTgpRus1s7r50tpoDHXhKyAHP6WEEVaN/8x1p9eXqVCT
+-XIhlJJ+dgwZz/Hfnb6gr97W5G16Ceo7ybS8syKBJf2D20DOL8kLAiNpjWm9spoJi
+-oxHvFMdDB3nUqZyRO+QU8gSoQBVYYqRlEnOXvouzqslUVdbLAgMBAAGjIzAhMA8G
++DQEBAQUAA4IBDwAwggEKAoIBAQCxatlqNB98n2Huwg4TNhTx81t4RDUHyRH5YUCT
++808QrxqqhNJGOSTfLDoobeObZqm8DzhZgeiMI8TQjGoQUPntARrfmS0qwBKpERJ7
++Se2mY7J5EFZtIR4dtTlD6CPzEC1cxdgF8+2BXCb/DdSRmgEMseC32cimYZt4uumA
++ckJfmGJst18nc8R9EPZdsW1mFjGSYrfigtqEcm4UOKnBRilMhacIXHJqUKcV6oIh
++KXWraHLex62Mzfp+g9MQ2xEmOz6j/nJ/54xqmFNoIR2mZBAOvsKMQVph/EWFF8Ei
+++NMkzXYbePkKaQBLMsKnonfIpfPzm4Sg8V51oSOG5KsW4JLzAgMBAAGjIzAhMA8G
+ A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
+-AQC9iO5jvBDNgDmUq8+NfsAZngWLOG7IR+Ez5h3CzGU9yzcJgn8y6PMjzhgc20le
+-WYzAHEG/KXFIfubUW/9iA8E6We0hm0LM1s9o7A9JAqsHcZ/pK2QmDW71JupU8o1z
+-3Qcu7jRzPc7zYgNwaD4/ccpJTAPGg6keV3YGN2Z5RpWykOFzP7WswaMIcKQE869c
+-Tyi8i71XkVrL+xx2pRiiNDOmfMkmm8TZ9tBP7n6BcRd556TTIxhjONvmamCraBQP
+-msPnMtb8+H3/IsMsUw02/fQTJ91FVa3t914Y24+q5xmkasyrhinTNmsa/S939P6I
+-JNNoAM6TUZrskKPtb/pMzaqn
++AQAayMxMY4+PRsjODW49e8YM+NfLIypZB9+QV432q6BTT+5KQh9DSBt1Bz5RaU1g
++tsz0sS7x0Iv7CvRwR1iDZOv8annHcjuEgxfWJ0+PBhFi2Tz1eF4EnpZt2RcJ/IMW
++xnsDLjRMASdmQxOLvxqz19fAQMAVw7ThkzicuW0ZMBX3baAf88m7w1Mu/V7P6rj5
++yw+SfZv/qNakUv2yc/2xEDRcfrYuimZAmGhM/HaPsta2BpvWJDpYe1Hq8AFWniz0
++C2epSzW+CdkpQZD/DIQmfWrWcBeb/XQ6hmouyJ6IWrgL45x7xcTLBOSAecBeZGMp
++npnO0PJN8Z/PQWz4sd8e2dIN
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/ca.key b/examples/puma/client_certs/ca.key
+index c689bd4..16a86af 100644
+--- a/examples/puma/client_certs/ca.key
++++ b/examples/puma/client_certs/ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEpAIBAAKCAQEAz1RWu1OHKn6tjbse1blyFIWLWokMMRBGbg7xiLZUlc6RDZ6h
+-S26h9ELDrsRoCGaH7K0n+Aaws4eAKC96mPh4FUQppA9PRZ6FoxU301+r+0GgrVLK
+-2+0TQEq64Mj+6wfcu7KfaHPBTSUAN4LSUMYIX3zvcxoZxLz7fBBhlGsYdvQWFcb0
+-KV9QL9EpGI04KUbrNbO6+dLaaAx14SsgBz+lhBFWjf/MdafXl6lQk1yIZSSfnYMG
+-c/x352+oK/e1uRtegnqO8m0vLMigSX9g9tAzi/JCwIjaY1pvbKaCYqMR7xTHQwd5
+-1KmckTvkFPIEqEAVWGKkZRJzl76Ls6rJVFXWywIDAQABAoIBAEBT3K02l2OZ9mNZ
+-QZHyffDcFoa6quu2LwQK4uoWGFx6wQrGwyjSZLGS3YAmNFkW5umKODJ+cOjjC+Js
+-CM/Zl/iRM5JRpbjmHHSjKrUMpCHLFP1yCLr/7c8u4JjKBD4MLHKYU1lnQPyclFqk
+-3nhtWT+3VdwSpxghwq2Vr5ELQYX2WoHBDKj67yb2+yRVewjrmWd0f3Lm3KrPYDy2
+-McOOOB6HcZNsyXDihPYviCOmthv0AEb+HUmEwYn5A/TcTL1IVpt8YG51/VrYWysl
+-A4rD3t6L5yp3hTv05dezm+hU88hSv8w2M0CQDqrxVN6zMyQ7ixj4cCbTqBJwVjmj
+-IxkWyzECgYEA2My20inP2nai+ANkY56QF+2Mvof1qEpZh9J7oPjzStG3jqfjqVWT
+-ZkY25SLLGO7SB06XRAgFVrq5Xyb72pXENhV2KUzOHN+osERaAyZroFlRbJxfCL8s
+-p24JKVN7oJPDOJnYYv/cEEKAT1/ocxKHbi6oDZb/tJA7UHfT3NBIuV0CgYEA9NFD
+-uGuV53XfuyaGh/dHurGBKu8HBjt16COasSqMxH3U7rb4JRF56wB2pVAAE8AFivNd
+-A2om4b0CQK/F7TJvQY6lBKUcy4lOshwoYR2Ga7x58BJNbS6Da1OTwmk12BKxt10x
+-NgThGNjRL/A7x1M2r1CPvp9+WiJF9hdWWRy3RkcCgYBX1rGn+wrdD7490FoHRsJI
+-/5VLyRhOJDmcHzq54MPqJ4hAg2NpQ2PiR0aMlglFw9VS4pPFG57WIfdjRw854/5I
+-j299kkHcTv4w1LDHn/RxVl74K28Rwytbdui9Vra7O8MYFrUmf1XxPJByGIC8xuAa
+-U0sBnpFh3iI6GyK6z6T3fQKBgQCWofvNCUVe+UQD3xx/pELaOEWFqTTlPMi7YMzZ
+-nZinfdT6XFIqXKprUgmuhZ7GiCvg5wSgCTyLQMSWEJDz9UhHSgF27jDde0qUhIbD
+-2mrO91T/xgMl3qy16OLNh/a9UCNQ82JIHpBxvVZY7LObXTQUgrkvTOttghER7iIP
+-CoAqGQKBgQC+26VjLWtLGRqJvWnvDW5jS3/lFB/AZPvfeLNsSs4G9Fgrqx6qNoQu
+-dVI39k/kMLSqLP1iMIR5cbujF5akpWTX0dJReoeOYXJuf9hkm1+kWNiHBbNTbfqN
+-htxGidymslRrSsOv9zJys5zosfHvbcKbi1dPLlV+gPN1v4eXjtLOLw==
++MIIEowIBAAKCAQEAsWrZajQffJ9h7sIOEzYU8fNbeEQ1B8kR+WFAk/NPEK8aqoTS
++Rjkk3yw6KG3jm2apvA84WYHojCPE0IxqEFD57QEa35ktKsASqRESe0ntpmOyeRBW
++bSEeHbU5Q+gj8xAtXMXYBfPtgVwm/w3UkZoBDLHgt9nIpmGbeLrpgHJCX5hibLdf
++J3PEfRD2XbFtZhYxkmK34oLahHJuFDipwUYpTIWnCFxyalCnFeqCISl1q2hy3set
++jM36foPTENsRJjs+o/5yf+eMaphTaCEdpmQQDr7CjEFaYfxFhRfBIvjTJM12G3j5
++CmkASzLCp6J3yKXz85uEoPFedaEjhuSrFuCS8wIDAQABAoIBACStHfzigY/Vsv0U
++iKxYBcRutn4KO5w8aMbQ3/S126ZrTGvrwTxbG9A26F7rOJ4rfvMtgkyemmA+FLW4
++EUUGOGRSUiffFoM76Z+hs9xg0AwRmBeG1RcCPaOOjyQGnUfmFDqVe67fWj3fuwAG
++7+aZm5XwP7BCCUS78NPob9TpyebQ1QO1bLRR/JQdWBjCxQTnOaaV32e+/U9STBof
++NnlTclbLtM5Gq5JeFMhlLhiq24+GEUonJuxWZa15xZRsQSDLWSrUK5UGLLkEFuk/
++g804ORd2vzajfpOXVehrmRUWNKBSgL0jwxDdxrOgiOX1lZPIKVrzsuAKjl15lLiz
++0L2tbkECgYEA7cKxawJyRqyBLdmpqzXDfRT6jJLAQi7IAIuQ63ojwlAuEV8YekIm
++5n30DAu0cJ4foZ6UYf6B7Y0WbNhmCi+FRu2Av6JJBblm8oNnGzb25FRC1NW3aWoq
++GrwgrlGg1aXx5W84ntdddDQB4VjGFCGLUNmYxAjrWHFH7DBE44aJQfkCgYEAvwcY
++drgdhAxjHBIl4fCaFTO47g8EB7NSFQSf3xIdRNr4qOW97PNzT4zQn2STGPX5XTn+
++hI4e9wbAjv5zQm2EudhAWvCiC6h8SGEXLwPyYVKizaO+OMoOmvR4+PSUMpUr0HjF
++EojkQI55u3gob0RIuKjXyV3MKC4SRxeT4r7b90sCgYAXVpIVv/K5rzsq5f+6l5dt
++0r5ZSBppJLBrJUf/ZUjXTQmImP4NGis5Wsm22PtIRq0yLx+/krzsNXorCv7RJyL8
+++Fk39lUWo8FQMsfPKxEHDqJUw/mx9kLVxvuqQMb50cUx0T4MkXVR77zzgsRGu5gy
++Qnm1XG7FirEVpRNOBim4+QKBgQCdK1hcbVWTjKGKuf/DKrOLmDeiXmZhc4+oTVrA
++LWY5fbQzOnsOVqtcGy6Wxigk1FRr+MhJBanCcyLBQ+dPE06tnZgtemjJEMHYx1FM
++1IF6w4PBj+R1UwG7SkOyCYFZMNSQvJzgiBLMbq0HqnASQ+tVS03nlq3frTBKn8KE
++P6Y5iwKBgGMiT5pvkCTS30r2gy8WtUXyCwTKDsBF6NI246H9EFqXdrhm07ePBbU/
++4+VbUlVjxS405lmDwZmkjyspiuqqp4KQslHkw/qJnbRXBcxLWWgPez4Nj6WkXcn8
++ahCWp5H458iCM65m/76eUQxTqUj7j9/tPW1WexeWlw/LiIYhQCND
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/ca_store.jks b/examples/puma/client_certs/ca_store.jks
+index f522926..9071747 100644
+--- a/examples/puma/client_certs/ca_store.jks
++++ b/examples/puma/client_certs/ca_store.jks
+@@ -1,6 +1,8 @@
+-þíþí\0\0\0\ 2\0\0\0\ 1\0\0\0\ 2\0\ 5mykey\0\0\ 1\91C\94\0\ 5X.509\0\0\ 3\120\82\ 3\ e0\82\ 1ö \ 3\ 2\ 1\ 2\ 2\ 1\ 30\r\ 6 *\86H\86÷\r\ 1\ 1\v\ 5\0081\130\11\ 6
++þíþí\0\0\0\ 2\0\0\0\ 1\0\0\0\ 2\0\ 5mykey\0\0\ 1\98\17ðk\91\0\ 5X.509\0\0\ 3\120\82\ 3\ e0\82\ 1ö \ 3\ 2\ 1\ 2\ 2\ 1\ 30\r\ 6 *\86H\86÷\r\ 1\ 1\v\ 5\0081\130\11\ 6
+       \92&\89\93ò,d\ 1\19\16\ 3net1\140\12\ 6
+-      \92&\89\93ò,d\ 1\19\16\ 4puma1\v0      \ 6\ 3U\ 4\ 3\f\ 2CA0\1e\17\r240801000000Z\17\r280801000000Z081\130\11\ 6
++      \92&\89\93ò,d\ 1\19\16\ 4puma1\v0      \ 6\ 3U\ 4\ 3\f\ 2CA0\1e\17\r250701000000Z\17\r360701000000Z081\130\11\ 6
+       \92&\89\93ò,d\ 1\19\16\ 3net1\140\12\ 6
+       \92&\89\93ò,d\ 1\19\16\ 4puma1\v0      \ 6\ 3U\ 4\ 3\f\ 2CA0\82\ 1"0\r\ 6        *\86H\86÷\r\ 1\ 1\ 1\ 5\0\ 3\82\ 1\ f\00\82\ 1
+-\ 2\82\ 1\ 1\0ÏTV»S\87*~­\8d»\1eÕ¹r\14\85\8bZ\89\f1\10Fn\ eñ\88¶T\95Î\91\r\9e¡Kn¡ôBîÄh\bf\87ì­'ø\ 6°³\87\80(/z\98øx\15D)¤\ fOE\9e\85£\157Ó_«ûA ­RÊÛí\13@JºàÈþë\aÜ»²\9fhsÁM%\07\82ÒPÆ\b_|ïs\1a\19ļû|\10a\94k\18\16\15Æô)_P/Ñ)\18\8d8)Fë5³ºùÒÚh\fuá+ \a\84\11V\8dÿÌu§×\97©P\93\\88e$\9f\9d\83\ 6süwço¨+÷µ¹\e^\82z\8eòm/,È I\7f`öÐ3\8bòBÀ\88ÚcZol¦\82\11ï\14ÇC\ayÔ©\9c\91\14ò\ 4¨@\15Xb¤e\12s\97¾\8b³ªÉTUÖË\ 2\ 3\ 1\0\ 1£#0!0\ f\ 6\ 3U\1d\13\ 1\ 1ÿ\ 4\ 50\ 3\ 1\ 1ÿ0\ e\ 6\ 3U\1d\ f\ 1\ 1ÿ\ 4\ 4\ 3\ 2\ 1\ 60\r\ 6    *\86H\86÷\r\ 1\ 1\v\ 5\0\ 3\82\ 1\ 1\0½\88îc¼\10Í\809\94«Ï\8d\19\9e\ 5\8b8nÈGá3æ\1dÂÌe=Ë7       \82\7f2èó#Î\18\1cÛI^Y\8cÀ\1cA¿)qH~æÔ[ÿb\ 3Á:Yí!\9bBÌÖÏhì\ fI\ 2«\aq\9fé+d&\rnõ&êTò\8d\a.î4s=Îób\ 3ph>?qÊIL\ 3Æ\83©\1eWv\ 67fyF\95²\90ás?µ¬Á£\b\ 4ó¯\O(¼\8b½W\91ZËû\1c\18¢43¦|É&\9bÄÙöÐOî~\81q\17yç¤Ó#\18c8Ûæj`«h\14\ f\9aÃç2Öüø}ÿ"Ã,S\r6ýô\13'ÝEU­í÷^\18Û\8fªç\19¤jÌ«\86)Ó6k\1aý/wôþ\88$Óh\0Î\93Q\9aì\90£íoúLͪ§N ;~\r\1cúEâ$y\11\ 3wy[XL\bV
+\ No newline at end of file
++\ 2\82\ 1\ 1\0±jÙj4\1f|\9faîÂ\ e\136\14ñó[xD5\aÉ\11ùa@\93óO\10¯\1aª\84ÒF9$ß,:(mã\9bf©¼\ f8Y\81è\8c#ÄÐ\8cj\10Pùí\ 1\1aß\99-*À\12©\11\12{Ií¦c²y\10Vm!\1e\1dµ9Cè#ó\10-\ÅØ\ 5óí\81\&ÿ\rÔ\91\9a\ 1\f±à·ÙȦa\9bxºé\80rB_\98bl·_'sÄ}\10ö]±mf\161\92b·â\82Ú\84rn\148©ÁF)L\85§\b\rjP§\15ê\82!)u«hrÞÇ­\8cÍú~\83Ó\10Û\11&;>£þr\7fç\8cj\98Sh!\1d¦d\10\ e¾Â\8cAZaüE\85\17Á"øÓ$Ív\e
++i\0K2§¢wÈ¥óó\9b\84 ñ^u¡#\86ä«\16à\92ó\ 2\ 3\ 1\0\ 1£#0!0\ f\ 6\ 3U\1d\13\ 1\ 1ÿ\ 4\ 50\ 3\ 1\ 1ÿ0\ e\ 6\ 3U\1d\ f\ 1\ 1ÿ\ 4\ 4\ 3\ 2\ 1\ 60\r\ 6      *\86H\86÷\r\ 1\ 1\v\ 5\0\ 3\82\ 1\ 1\0\1aÈÌLc\8f\8fFÈÎ\rn={Æ\fø×Ë#*Y\aß\90W\8dö« SOîJB\1fCH\eu\a>QiM`¶Ìô±.ñÐ\8bû
++ôpGX\83dëüjyÇr;\84\83\17Ö'O\8f\ 6\11bÙ<õx^\ 4\9e\96\17    ü\83\16Æ{\ 3.4L\ 1'fC\13\8b¿\1a³××À@À\15ôá\938\9c¹m\190\15÷m \1fóÉ»ÃS.ý^Ïê¸ùË\ f\92}\9bÿ¨Ö¤Rý²sý±\104\~¶.\8af@\98hLüv\8f²Ö¶\ 6\9bÖ$:X{Qêð\ 1V\9e\vg©K5¾       Ù)A\90ÿ\f\84&}jÖp\17\9být:\86j.È\9e\88\vã\9c{ÅÄË\ 4ä\80yÀ^dc)\9e\99ÎÐòMñ\9fÏAlø±ß\1eÙÒ\r-ql\12ñ\11Zq­\7f£LµÃ\r²6\13\82¾
+\ No newline at end of file
+diff --git a/examples/puma/client_certs/ca_store.p12 b/examples/puma/client_certs/ca_store.p12
+index 2af10d9..9b7934a 100644
+--- a/examples/puma/client_certs/ca_store.p12
++++ b/examples/puma/client_certs/ca_store.p12
+@@ -1,11 +1,13 @@
+ 0\82
+-\ 4\ 2\ 1\ 30\82        º\ 6      *\86H\86÷\r\ 1\a\ 1 \82     «\ 4\82     §0\82     £0\82\ 4\ 2\ 6  *\86H\86÷\r\ 1\a\ 6 \82\ 3ó0\82\ 3ï\ 2\ 1\00\82\ 3è\ 6       *\86H\86÷\r\ 1\a\ 10W\ 6    *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\bG§NÓ®\ 5ÀF\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10
+-\16¾²÷E\88\9b\17\87ÞR_Ì\80\82\ 3\80Üæ\ 2¨ H´³ï>º\87x\95\Òùë\12\9d`\95\ 5ð\85\8a\12ËÖ/\80ê\93-\93\13\18<»À\ 3õ-®µP"1¥\96Í|ª¹9O\ 5\10MO\ 3Ú7\8fò\15\ 6ølÛF\8eø«ê )b[\80\0\12ÇÝ¥~Hôó¾\17khLÑókÅQoÙ2ݶ?EÑà¼k\11\f\9f!QäVNμPø\16ó\14Ä?>¦\19ªBo\17ø\93|\v\97\10J|\0|\11\1c#p@\8b$!M4\9880©\14\f/gQ̧Û6.í]¬C¼\e±\95\ 4Amf3³êX\80Ãc °\9a[~\8aWp\ e\ed{\ 5ÔØSo\13ÄØÌØ\14ÊõoJsQ´áfFÖm¡]b{\87è51oVôÐ\9d÷\9e\84Ç\99YM\13\88¬ìÀÜXÏèeÁ\8dR
+-óÙ\9aí/1ï\e!Áà\aK\ 4L\9bÞ_É\eü'¯QTÛ45yfN/¶&°¿?Ö¶PÅÀ\88Æwí¡.;jÐ),%Î"ÚC)4¥«o½ÂÁ[ÝÀ´\96\12Ø)4\84\9eØ\9fUn7¿Ã\18\8c±Îk×/\ 5\19.k­\10Òßå\7fd2ÝíÅ%½rOë\eãwF+°xÆkøìVn`Ì~}Ñ\13\16s\1cæ:]Ù°ñ\91tT¥q_\96èï¸ÈZËL\81\17îâÑ\81:¢W\b\96|*dè\9f^v£Ñ\8d\eÙ\84^òV\1c\a\10A\8fêPI"@ÕÌêrFÑIÎf\97µ*ã\9e¶»\b\8d{\1cJ\9e¨`bBÒîö\18\84\17êÓ\82¯J\8eê\rVÐ@Ð\85Îß.$ð5¸AÓ4åߪ\1c\98 Ò6¾wë\10n\9bñ\v\9b\1d\7foªf2À¯\vØ\1d¸Ú\13Vï»-\98\ 3$^\9c?4\98A¡oó-ü+K\85\85\11Ë\13\8c:È-¼l§\ 5}7´Sþ4a\1dbe<¥ô±X\f$\ 6öµÅ\ 2F\fê\9bþuÐB\9ay?ûzqñí9GHÏ娢\ 4\96´o\86\15En\97Ù·\98~\99×&ÿùQtþ\9bÃÝÊ£
+-¦ÀÀÈ.íºBƼ>\92§\ 6ÇO\90Þ\ f\8e\99jJ\9b¿þmóÝ\88úç¾S\1dó°à\14\16®-\14|v¡í½\rÜÎ5¥9GEbôvVõ\11W}\1a\8d1ßU\15È+Îí\ 6ñP\17\1a»d9\8aqì^\96Û|æ\19E%\ 6ôµ}uÔ;zF¹\f\9c\82Q\18\1eJ³»\9e\ fZ&\15\92òòQ\r\b\11«ÑTÖöá  ªSö\97\8d\1cA\9bß\11X\83Ï\9cüûB\ f\aÀt\ fÍê5_ó\87óº\9e.\ 5\88\9f$~<fv=D±Nëv\ 2|\98i4l ä\f\NÁõ\ 2\e°Ü\ edk[h³\v+\19½Ú¯Ä=ÈUEDÃ\ 1\9aÏ|'ã,Äð°Ü±'CR.\94\9f-²41g\99mêÕK\00\82\ 5\99\ 6 *\86H\86÷\r\ 1\a\ 1 \82\ 5\8a\ 4\82\ 5\860\82\ 5\820\82\ 5~\ 6\v*\86H\86÷\r\ 1\f
+-\ 1\ 2 \82\ 510\82\ 5-0W\ 6 *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\83 ôø`\ 3\95\12\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10\bÃ}\85/(YÕEq·\bt\9aâ¹\ 4\82\ 4Ð\9c\8f* í4Tu£³ÆAoÿ`µL!9\r¹\1d^r¨­¸¹¥·!  îd*A\8e+=tÜ¿Þ>\98Ï)ù\8a)1,Ä\fiÁîJ5\b¹ÅüÄsDs¡q-Ó\88Dí[Dõæ\93[=Ã8\9a¾éþ\9e\86QB1D!\9f¡$ë.L^`\ 64-\91cx£'xi°7Õ³~\9cÿ\15¥C\17\fúýx\93×ÿXì[o\1ft'|ìã\8b\ 2°ë\ 3 DºAS\85G\92\9f\ f\83\aV*¸Èª \85*EwÂgG»Á\r\8bêH¡)X1çÆB\1e£   ¸J\8fVåÜ!\1f\0ý¹ä@6Ã\9d\9eòEÍ£^\85ç\98\eä(\10\9d絛;»\fÓQÝ~Q/<¶·Üµ<}2ÇaàÿË\98\1a\830\81Ñ<\85ÉðIëáXÔ\8b\9b\88ÁP\ 5ÅZß\7fO\17\ 2<\93=»E\96 òsÆ\ ea\9cªz5¤  \84Ô±øad½\8b\9b\9aÐâ:PXuo2Ól\9a\93¶Âüä\1a;cVR\95\10n¿@ØqË\ f/nÅlr½\82À\8d3\ f´\ e´rݽzt±r.Æ\83\a:ééèÜ\17\E÷³W\84\ f\19Ò Z\ 4vUº}×öXbï\8du\17\ f\97'A(\r|éú4]ãèè[      \14õÝ6s\9e|(\92\8báv\16\9b1Øä!ûIðâpP÷»\ 3>:§mÈ-\93KTW\15¸2ä\16\ 2XNÁpeÉo\ah\ ep\80­Tô5!e¡¦5ð`9óï/Å<ôk\15z7Ðh\8fÃXÎ\88ÿ*<Uy\88÷F*\96´Ñp¿\8d\85\11/a­ß4W»\v\9e\vUV\97îí¦SJ¾§½¾Ú\98\ 3³Î÷/\96Â\93\123?\15\ 5Xk5\95ED\95bSU;F-\8f\ 6ÜU.(Aì ø"\8e5\83¸\99R1\am/³à6¢ÄyÀ\f@\10\9eøøz\13\ e½ýÙ\15\ 2\ e\9eÏéj\96\17·ê_+Ö\83pÙ8T!&'Ê×ÈÂa13\19*½q¬\1et\85£Bºº«¥h\82X˼\ 1°³F{}èüeA\12çÕÆûjø5ã\ 6\ 1¦¢ÍèÁ/1\r\93s;¥Á\9bâ\vÓÈÔðÅR
+-\9aó\18i(>û\91\8b:úøÆm¶MîÞN\ 6)ìð\7f";Ô±µ7\80ðY´\83\19&
+-\1c=ð¸ãÈ\99\rÇ5F\7fi\94½ßO²\rK¯gL\9d^s@´´Sðûn«"\ 2¶äBÕòpe\9c~<Ó/ÒVT\9bÓ\80X©Ó Kú2¹«°wÖm\8bÁ`\9b¸¬\ 3*Úð\ 5$\13p\12/ÒÚ\1a\94õ¤În¢\ e=áÄJ½¥2]0´G
+-Ni\v¬Í\9e\ eE\8ewl\99Ðð½\18;¥yÝ¡3Ë\ 1¤L¾L\1dG\r\9e©\95)3\0þþÀþU^\9c½×\18f\v0\95ù!Ô\80\10£\1dy2Ã9¨Uão\ 6[bѱ7\b+.*\9dE0ÉjåÓäËÔ%\93\93h®£7/ìy-\19¹\8e\1d_%®­Ö\97UG\97u\93Ü*\7fàejçÖ\9eXCD2å\80\v¨÷t\8aÊ:õ\ 61¦1ÓMo¶éïÚÛ\a\8f³Ô\83\977'\ 4Æ´Êß\9ca´Ûå°ï\87ÿ\\83ÿ\83\8ck!2çÌcC\8b)ò°8\ 3ûÊFWoõ\1d\ 1Ã\8e\16\98"PÂZ\vHû4\92o@Øz\96J\a9\19§Ì°j¥U\1aT\0"ÝaYá\92\fGB±òç½$Ù÷ê
+-2\83\19Â5ñÚ\ 2ìÍ\9a,½'*\12\87\H\86\16Þ\18\88°8Vä)Ô*ýqÐ;ÕÏ@\b­}uä/F \15ù\1a§ð'\9dè\15\8b\9a\8aüAu_ìkïe¡5ÁÇpü\9f®ZSPß\b\87¡\0­ø\98O8\90"e\88\1fº\ 5ÏY´ú#\ fÆ\ 6>ÎÁ\16<\86âР¯\ 2x
+-eX\1c»\8b6\v\89t)>Ç\81ßá|®\8a\193ÝZ\98\90¬\7f9_1:0\13\ 6     *\86H\86÷\r\ 1 \141\ 6\1e\ 4\0c\0a0#\ 6    *\86H\86÷\r\ 1 \151\16\ 4\14°\19\ e\91³iÐÔ»ÀXÿ\92ãÅ\88\1c%W\960A010\r\ 6        `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 ÉD¨ù:8T¢!\9bW\8e=¶7\87c~\1fí\ 3ÕPW#ç\93*O-\12z\ 4\b·'Mìö\8a\ 2\ 2\b\0
+\ No newline at end of file
++\14\ 2\ 1\ 30\82        Ê\ 6      *\86H\86÷\r\ 1\a\ 1 \82     »\ 4\82     ·0\82     ³0\82\ 4
++\ 6     *\86H\86÷\r\ 1\a\ 6 \82\ 3û0\82\ 3÷\ 2\ 1\00\82\ 3ð\ 6       *\86H\86÷\r\ 1\a\ 10_\ 6    *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10<½5_L¦ÔX¥\ e\14Ý\r\ 4cm\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10¡Ä«rßÊWu\88g"Ací\ 5f\80\82\ 3\80\9f!ÃÆ óg\84[Ïè\18\80\1d·DÃ÷W­Î(\10cÐñá.7\99¾Ñ\85.³ã\89·¼Xª¸\14Jú)\13º×w\8b\86t]¡V\875>\8a\11-Zñ\9c&=\ 1\8f\8bK\91ah¿Ê`]ý\0\1cÐJZ»À\95\eT¨·:qc÷d1M±ð\94aq,\rñ\15EÓA\9fOÊÍÏV$\ 6d6K\8c\13<«)î5þéI\ 17Kc Õµ2ú\88u)é\91\rúN"$/2G±îê.\12¹!·\1dA\81\14\11£#\f@Ä,µ¨G:]¤cvÏ!5am\19æ\14¬éi3\1c½ÿ\85ÒP\ 2\1a¼G«0È\8b~÷Ü*¼\r\ 3É*\1e\ fV6*\1fß`Þ䪬á\ 4?*£\8b"\92ä\v\95\82\92iJ3F=!D:Y\88\a\a­¶\1dÏ1<I°ª\12\94ûD$Q?îì÷&«\961QPR\84ÿËmM\7fL\90   Öj\eñÈ0És»*\ 1[\99¿áO\ eý\1fä¨s\8d\ 4\99Pi \11;\fØ\17ªæ¸Bxdñºà>\81Ë\97\88¬Í騼s!\8elEâ Ç<£sDæözú\9a]\9e\1c ï\18Hçî\87µ\0FDÙ¢À¼\f\80.      \835Í3/\83\8fæ\9b&9´\85\1f=\91ê\r\83\0AiP²\91\81B!\9d\ eGTÌ\9d9q\8eÔç_µ\Æ0áöO³qy\8aþk\8bUÏ)]\9b+\9fº\11ÆÂ\15"tàµF¶)al½\89âvÕ]ß\12\92Õ{\83+k\0ì_¦b\1dêã\93ì\88\eB\ 1Úï\dw\82^Ñ8sqü[³¶Ê\ 5\8cn\12³!VÑ\94¯b÷Ë55\81\85ø\80gK\13Î¥ÌV\9b¸"\ 6\rßð;5\85\ 5\ 15®ü·æ³+\8cm]M|F\1f]f;\9a\10$\9dãå\ví\ eõ\95¥©\1d:\r¾ô¢=Ù\9aFØ[y<í%\fp\ 3\ 2z\19¿\ý~[t;ê'I\90\17\81JÃ5Ð\ 1ØØ3÷|\8f¸âGaá¢{\\aã\95¼s)\1e\84Wð;=ð\9b\ 4N0Ò\7frÞ,Z\92w«ðo .       Q¤r\ 5ª|\8f\17LyLùÀÎ^8zY\11Lx,ªs$ÄÐ0®ä¶\1a\10\82õ±\85\0W#UqÑÄJÏ9\12±ù\87É_\93c\95>6\1d\85|þÍ"m=i\ 2G\ 3\12ëp\fªL\9aüR0m{û\9c\ 3J-\90&\7fb\ eãïMcÙwx°\91Ômç\8füé\1d=⣱úÕ\13ÄúÃ\1a\87\98{¬"\13ÎP\99p îÕ¶³mÕ§°°m|w9ø¼[B¦\vÙ¤\9e\ 4èdè¶hÃ\9e/\9cµÜ\90³\ e¤xH>e§yn°Øí\19][\ fRª1ÿ_bN¬QéÅå2Ên\86}Á%z      of\eAE\7f$r®/@\84'ý"%V\12'ÛÄA3\97R\91ý¬\867,`¯0\82\ 5¡\ 6  *\86H\86÷\r\ 1\a\ 1 \82\ 5\92\ 4\82\ 5\8e0\82\ 5\8a0\82\ 5\86\ 6\v*\86H\86÷\r\ 1\f
++\ 1\ 2 \82\ 590\82\ 550_\ 6 *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10\99:\19ЬL2>\15Á¶#H \v1\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10\aß®M2\89àì¬"4ÃK\89º\93\ 4\82\ 4Ð\82"x±\90z\8b3xg\12#àü\8bA\7f{*%1ò:½\16ÊÞ\ 1\9cª¡.ã\1f\87ì9\W,ÖøÌ\1cæ\ 5\82·±=¤ñ©&oí®\13\9fREtB\bàEx!/:w\10è
++pac\8f¤\bèuÎ\0\9bS"|Ft¶h!§êï\r\93\18¼N_\fçC^J\80ô\85¼\16X6\ föø
++æI1t^±þ*\8cqÏc\10 ·íÒ\1c\9e1o\ 3$\87~\8d¤]¦ø¯Âù°`;ö<Ø\9fåä\98*\9c=/ôÛ¹Ý\95ðã,TCUu\8b¶­ý½7«`n=&\16 ðgZÅ2(\11LÐfÞG\80Ú%_ð\9b\81àða¿ÖSÔë&\9a\98\88
++Ï}!\1f\97\18\80R­hCß\96ÿ
++\9f\137NâO.*î¤ûè\87?mÏ\93\ 5n1\9e\9c      }\9b¦ä\1eR&çjË0êfWúÿU*\85\ba+ù\12u Eøý\rç\19÷|M}»_å\ 6(Z\834z\83ÞÃýÅ/\ 6\83\91z¶ÂQ\8e¨tϸ¶\0\11üPÌ\85Cl\94j|õ\88Ùü#\0C*ï*ÐD[\11\r\8a\fIg\82T×1¶j{i\ 6{Y´\98\8a\97?\1d´fÏ    \ 6a\ 6Ç&Y¶\8d4\0Ûãj\9f\93Ñʸ+eq\9aúÔ.HxùNÉ\87ß\82Äø\ e\90Ê亻\9cøÊi!Òãµá¥·>u\ 2#C§\84\8c<xÒ¾
++Eë\82\10N{×/°ZͰ\95ß\12Ê\80\1fÄ\16)¤Kê²°|{épLúêétz^û\ 3\1f\8b0>Á6#M\94¡F*´\8f\84­iYî[4Kþ    *¨\8d#`OØö71b;\ e\95¹n/j3¦<#½5\8cá>3APz°\87?ÿÃ-É|´pg?¬xÁ\e,ý¶\88#\8bÒH\98\ 3Nl+OdÑì¼Ð\1fø\7f=\9c×Meht}\84\90\rî\98ø\b½\ 6\7fÿìhà\94×\8e0¶e¿\f\12\r¿\950\ 4\94\13ºkç»âcýH\9d\97\95®\e¼c©"\ 2<¤Ç1\94[8Eo\1fýçXc)6UúúÊ/'® I½­\ f\16\1d>\rö\88¯,\9fH\14\9b©å\90®\eë!¤\83nr/$Ï0\10FZs%ßzÿº\8e×Gp\ 5\ 5þún¼nrµ\83Vî`,f\ 3Ó\1c\190¨µ9\1dhñìØ\b\ 5.k\r¡éc%±\83r\97tt¢Ê\1aFR·\ 2Ddø\95\8dXTÜ\92\1a\19©ö\83¶"ä\9e\ 6Øû\8e\1cÆÚ\843óÌ\8bÑJ\9a¾À!ï5\ 6ü;b\11ÒmOd=7T)çç¡òBp_ ;\8eî U±ï.|Ì\9f\ få^¤ôÂ\\91\80\83\99Åù\fS"\ 1º]ÏÇãÝ\ 4êðK©\ 1Èó5%(qûf¯0Ý\8c\ 6Î>\8fd\9b÷ø#\18»ìÏRø
++CÒé\ 5»%\9b \81ظÔÝYÕ³ÀD
++lªd\12sÍÁ"´²óZØ\83¯Ká<ïÖ\17o9¨\90xlnã\ e\9e]W£\f©\8f\11\91}y\ 1¼"ðA sÒÖ«\8bUn[\95Ç\ e\8f¥q¶Z\96\ f,Ä^í\1fs/ý UL\ 4\18¢¼Ý6Â\93t¢Ï:q-\90B\9a\ f×J!í\ f¶×0Éð\96\87kYUÛän­¼\92»\ 6=MÓìVÌ\1fÜ\eïþküãmzÇlU*\87¼G+ù\11<M}\14\9bÐ\9a\9e\9aÉ\10Ì\1f­yøÅ³ª\ 6\10,Æ6n\9c\88«\8aÂ\8a\1câ`é«\16_và¢Øÿ\ 3\83òï0©Ç­!ÚÇ$.·%®\98\9a°µÖÕ϶½Úô\ 4\83d\1c\1fÃ:ÁÉðÜô&ö~·Û¤m\99ÓA\11
++\13@¥dFQùBC~~ÛpR¬ Ì\88T\1dg\98D\8f?êÜ/o[Å9\84Eí@K-*\ eð[WU\96\ 4EÈåâè   ÊÄ\9fì\ 3\ 5ªLD£A\16÷Þ\1c\eiy21:0\13\ 6        *\86H\86÷\r\ 1 \141\ 6\1e\ 4\0c\0a0#\ 6    *\86H\86÷\r\ 1 \151\16\ 4\14\11/\84\98§\ f¹9]#N\9d\9f\ flsädºý0A010\r\ 6        `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 1\vÔ
++Ð\1eûúk\17'¶¤A¯Rýtp\94íd(\986\84\       4Õ:V\ 4\b£>`4~     \ 5\ e\ 2\ 2\b\0
+\ No newline at end of file
+diff --git a/examples/puma/client_certs/client.crt b/examples/puma/client_certs/client.crt
+index 79e7f6f..14eb1dc 100644
+--- a/examples/puma/client_certs/client.crt
++++ b/examples/puma/client_certs/client.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBCzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
+-ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjUw
++NzAxMDAwMDAwWhcNMzYwNzAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl14vsZCU7E1qf/a4Yxs/SbIf/Pz
+-PW3Thbhno3JAbsTUpf9zkdDRB8fCn+R8SnJVZhCRYhUA3lNdZIskQp1h2Ix9TZxj
+-QSo29ixzik0fTd7nd4KC8WOpZUyDs0U2ugmqomJXP0e/AiFpN+3HmgTWJpDx2oET
+-Lcdl70+wRBkF2FDRJU/5KvArUnaGXrqW645GH3iXMadQRpEWBxFP/+aiz0FXqd9Z
+-IWSoobf03dY/tIaxCrFe2+yljBB6eI/oHWs7Y861JN+nRcJrtp4LmeCdDXzQN7/y
+-xDg+NVQy0sEltIMTgMyoIsb1UPD+IkepT9GKd09M6p63BX0SXr5YPhz9iQIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHKYzIAjmllB
+-n+CRjYjtwPrkVT8azecL9efdBvE90KkGnIvRzNe4vQdH0mT4R+RUOXO4mbhAT6tX
+-zOpO2gPldBAQ1GAcjs1XJPGxSqKUO8B69Nv3mXqwR3FKR4ZGseC5MXjQb5dZc3An
+-NJZy6t+7gO0nDfV361JJjXvNdHd0cfx0aCWdTgQWxt9RSnH3QxvVbdXLAPvYyb1g
+-Ueao9M5PMMx5cAgq4ORM+TxPJxTRj2BuRj5coHsPn7R4dkwWP59+h6Vgdf0AmeUG
+-Jmdrul5ESeACbs2GixZdtqLT9QUJhTAFaXpJd3IUYyML1V7qRk1FJqRvatYxhBxQ
+-gjZp0ouJRCY=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvAuT6k08rCxgTQtwtZ1PB2iaVTAE
++Z/DTKp1bUP+A06DslWT9tng5bxUNMD/8z/D4sOKzNTds9JP9QmJsgme1qlm+pIRQ
++qgejLw6hG3v4ZdTe2CTvfE08lJlwWVU2hoDLDnurXWoQE3SSAzfuoeg48EZ8tjug
++3KkxbCR0GUzk5aof8fskCapybRGvIek/xBkVKwEVhrvNwCvIwvw2SRgGuxHuZNCk
++kq3pptuVC4e14RglByVV0C6MkNMP9CDMXILZfTQRnsqgq67MuB7IUbVPH6VUYqwB
++IIR0MW7lLFLkB6x9QOkCdAXrzqKFeNeWxw2eyV2ueTDQIqsx0fx+SylDPwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAKlWE0BFzumd
++XtXSiD8AESuDWHAdJ5l+lzwGJ5/qJHQMTYg+7IwVumlf9z2rwTyCRNVCU3t68D7/
++8d4l52+DcmZExa8PXnkAotNcV4cDps/ZJt+k3stYSAL2zzxOCKEaysd7UvL/b61g
++t0Xyg3jlg5svhJomHuevB/db9oRUCxlSuSTxjeanVyvgXlURBOLT1MaN3tNhtBJM
++RmkpGupNeS6Zwuzi+Ina2/TfmKSwtoKMyiP/QuzH7wAV0BCDsDPT32CYkvuJ9ARh
++QsMK9a3oromDxKx98l9FScYsH6SkPlywXF4ZkimZj4Wtni5kHkeFAbc6KuPanYIL
++eypAAM0Zm4w=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/client.key b/examples/puma/client_certs/client.key
+index 371a4a1..9a511c3 100644
+--- a/examples/puma/client_certs/client.key
++++ b/examples/puma/client_certs/client.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEowIBAAKCAQEAzl14vsZCU7E1qf/a4Yxs/SbIf/PzPW3Thbhno3JAbsTUpf9z
+-kdDRB8fCn+R8SnJVZhCRYhUA3lNdZIskQp1h2Ix9TZxjQSo29ixzik0fTd7nd4KC
+-8WOpZUyDs0U2ugmqomJXP0e/AiFpN+3HmgTWJpDx2oETLcdl70+wRBkF2FDRJU/5
+-KvArUnaGXrqW645GH3iXMadQRpEWBxFP/+aiz0FXqd9ZIWSoobf03dY/tIaxCrFe
+-2+yljBB6eI/oHWs7Y861JN+nRcJrtp4LmeCdDXzQN7/yxDg+NVQy0sEltIMTgMyo
+-Isb1UPD+IkepT9GKd09M6p63BX0SXr5YPhz9iQIDAQABAoIBAB+oJB0z4bnf/ej5
+-uFSQS6nb+Lb0L9S1E9U4ECH5JVw4spxSXyK3w1ErujX4AX8UIfiZwwumSC9S34lM
+-dQAJD5j+GDy/KFS3Sp4h/IlzQkGaV6y0Jy0rijFhdvSZwgbw862cY2DwOyNzB6aO
+-QeflJQreglNwKIaFx6PZ+CLCKezgVkSmRDSjYWv/qYkpZmdEjCsI7FrYgxwmkLYr
+-fO7bisPaW7vYF6S48y9Lv/e9K7qlOz4W7aAHAUUWd72271o5dJQrN5jlj/tKgBww
+-+rDV1MsKNi1oqxjZnQ7rrJ/AAsc3FkaWPmUluhy9XbaZKSFJIC+TSV86US/I5QVW
+-Kets+9kCgYEA19mtBjbBeZFCvR/iaFtvhlslkLiS0hRcEKO+JaRQhTB7VWTqeIv2
+-Y1bEFh1t/8NinxtPCDi2Pl57M5ffKnauxl8QsggLebTFdwnj3kFmc9g0XFlpErYe
+-xHUcJ4UXpubGZNdnau8GoUGby/zY/yWX7tGsbHBBjwwvS5AvkbYEhi0CgYEA9MAh
+-473dsUynCMTzdvPC1tkC5MPLTGkJ89zoxnRgQbfAEtdTpBloNnDu+XAajEL0/YsN
+-cxGohipESzBs+uM68M62m7BJEpDV9eRgRH80/4O2GBTPbutJAYxbJRMazvHzMA0p
+-ed9Ss0HNcyFzTlgNpUEk6LCPB3Q6ZBCx9b06ak0CgYA2Hq3zUOdRw8ooAUaTQ9nC
+-pjfVAXJOmiw7P9L9PSWzP2StFJB1iSJN5gNkSBy8dBDWM9KtDQskuCvL09hwnTFV
+-K6DUApBeA6U/I4uuvlch1KPMQ97EgkVUnMhiYEx93H8B6cBUX3oaFIkrrEn8L0DY
+-8Fl7FupZI4T4PT6wGiMoQQKBgFZZmxtQl3DATIZJhmRHaEyIz/6KHaXdwUcqf23V
+-DUjiXX/IPJg+5oeenJGgvZ0S2oDBmIMqjbyYGPQ2J5z0ooznQYH4Vi+YrgRNCLHh
+-937Wp14jqXPGy0Eild2kueadcmFXo3R+GB1qb+PYv2e6pUXSkAUQlcXZeehoA4Fh
+-u8RZAoGBAMNlsWXiTAZkXCQnHy7hEt3rONumzHIwBhWrMoNRQAbZSM/WWEtZuMso
+-QvhR9Fmz/fiaVvBcXzBui6ffkoSsyvyhigfaiF1AwhW1S1JMXttEiGaFO7pgysmw
+-26goSWo9KKpTxUcAW33qKz1HBb6a51CeucpeO3PmQRUJ5CZmLG2Y
++MIIEowIBAAKCAQEAvAuT6k08rCxgTQtwtZ1PB2iaVTAEZ/DTKp1bUP+A06DslWT9
++tng5bxUNMD/8z/D4sOKzNTds9JP9QmJsgme1qlm+pIRQqgejLw6hG3v4ZdTe2CTv
++fE08lJlwWVU2hoDLDnurXWoQE3SSAzfuoeg48EZ8tjug3KkxbCR0GUzk5aof8fsk
++CapybRGvIek/xBkVKwEVhrvNwCvIwvw2SRgGuxHuZNCkkq3pptuVC4e14RglByVV
++0C6MkNMP9CDMXILZfTQRnsqgq67MuB7IUbVPH6VUYqwBIIR0MW7lLFLkB6x9QOkC
++dAXrzqKFeNeWxw2eyV2ueTDQIqsx0fx+SylDPwIDAQABAoIBAA/njsgnZjVNv4tk
++p1DFEFUZFMyVthmwdbvJ+Vo9cgD0QG5WT1sqifkKN8ZX8yMHR5F2ax/aIz4AclA2
++EOVqriPNWWGCy2vGH5gwTZIMhzLdsUdowFSsF66d17HGkkkIBaSg8xqAiQGMP3lE
++Nsu832v7GjszieR/7u0tnCAzr7x45QNl3lt3Vwi3ygU2RNQ3I1kbfc9+g2rmJcM6
++Tv5OVdW3SMFwY9YN4fBYy2gg90NDC/DYotrKHngTHu6mxiQEwSx4WmHaJQWV2OWA
++U53XZm4c5h9bIzdz4sdFYqMcxEW+jgfx/4kMqykticnnXjTOik9t+7IvuRpEIvVH
++SjC+uYECgYEA2/dvVkG21GFepm8+ePW7B2mLxPv2Pzp5jKJ614ivukbNCGsWrDKt
++euRsXov5I72GgF8D2ySw0QctX1iM6yMcaIEXnbF/D2wmpdpidrTku8rph7K7wT09
++Y0OJhh05n7Y8/6QCLQeCOJSgPWGWkObLqn0UUtIcaPdsMAteaNo7rf8CgYEA2tl7
++ygZQhGkjdXZKbyA1J4+5oAarX8+QrKk1M63rIep+4lb3SlTuMK1XKYYk4gcDP1VL
++qMnV4vhewBcKxJl377RQ+Ka/T63HreSnKTGHFWiftWYIDeOYnfgYXPUrrTm0aHvJ
++QOSJyWb10DjSoyAwQqDKWF2gjypD5GInsQjg6sECgYA7FefuP5Cg09bc1hzt2PP4
++Nb25mAS5Tze/MxXUN38chlAk5r8cWjCHRjxl2St/EjXC3cLnZp+oRklFxz9zGedT
++mvmA/mCm/+IRwuuX/1dBqmu4a6ZLbevDcizKvabw477W3HNJLS8pi6LPWhtbqOMk
++VJzU8mN3Pp7s+ODPQW+ueQKBgQCXDs73H2ysOLYU+dVe5uhJqlcCMhhQRcEirJjg
++VweZnXZ/XG/MitruFne3XbRPn2+KY6GZm9dalv0vsbfpA9VZSykouFAM+3J8gPsw
++39LR4Cl82DRvAc3yG7EVWNUQ+GeiRu8fL6A7uCmr08zwc+Nb2ghQ/i85In9CQM4M
++0IgPAQKBgAZ9dqdr/2eboRJRuiZJlm55FfRb4sh1ZbUpZdn3j2WyOpXxwaCiV8fN
++QcHYG7m8CwfmE4Ly3ifmyF5XH2DY9+u1B1UmEOjCr2fholZ1Xf195Adh0gYAdusg
++FE6ybkyduNlVzJNVtrFTm+G2rX7Mpt5hsyulPnBDETMtDQf2zgfO
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/client_expired.crt b/examples/puma/client_certs/client_expired.crt
+index 6a6fefa..58e9c98 100644
+--- a/examples/puma/client_certs/client_expired.crt
++++ b/examples/puma/client_certs/client_expired.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBFzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjMw
+-ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++NzAxMDAwMDAwWhcNMjUwNzAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl14vsZCU7E1qf/a4Yxs/SbIf/Pz
+-PW3Thbhno3JAbsTUpf9zkdDRB8fCn+R8SnJVZhCRYhUA3lNdZIskQp1h2Ix9TZxj
+-QSo29ixzik0fTd7nd4KC8WOpZUyDs0U2ugmqomJXP0e/AiFpN+3HmgTWJpDx2oET
+-Lcdl70+wRBkF2FDRJU/5KvArUnaGXrqW645GH3iXMadQRpEWBxFP/+aiz0FXqd9Z
+-IWSoobf03dY/tIaxCrFe2+yljBB6eI/oHWs7Y861JN+nRcJrtp4LmeCdDXzQN7/y
+-xDg+NVQy0sEltIMTgMyoIsb1UPD+IkepT9GKd09M6p63BX0SXr5YPhz9iQIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHclwiffmiFl
+-uMlhnVbcw5UILFnZLhrT5Ufxg+dpPVpd0s6vZ/emw0QgQHSUwBfo0l4De3rA4ZfK
+-wqXv87c38tA9fZ6Schj+0m/pGFbixX3ptw9jm05V79broPgzSflEUKpJiyYJmjnK
+-3ZfN1JoxYsd3WUrcbxnoOhNEbHuImyFn6sd1Aw7o4+Zs7GcKvKfY5n+anATy42bL
+-ODnB/XJf8sZtevb57ceiKGIoGbVzrdi62QY3uQS8Jv1CAVzGHogW8mAw1yjE94v0
+-vcV7U4/v2KNt2UqWLHjIpeefnN+7scbX4YAz+UXbBZ+1DwAgSZq+oyzrBn2RKggM
+-LSUeS8vdfds=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvAuT6k08rCxgTQtwtZ1PB2iaVTAE
++Z/DTKp1bUP+A06DslWT9tng5bxUNMD/8z/D4sOKzNTds9JP9QmJsgme1qlm+pIRQ
++qgejLw6hG3v4ZdTe2CTvfE08lJlwWVU2hoDLDnurXWoQE3SSAzfuoeg48EZ8tjug
++3KkxbCR0GUzk5aof8fskCapybRGvIek/xBkVKwEVhrvNwCvIwvw2SRgGuxHuZNCk
++kq3pptuVC4e14RglByVV0C6MkNMP9CDMXILZfTQRnsqgq67MuB7IUbVPH6VUYqwB
++IIR0MW7lLFLkB6x9QOkCdAXrzqKFeNeWxw2eyV2ueTDQIqsx0fx+SylDPwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAJMDA1om9i0I
++uRNtBBYk0k6/E0Tu08VPzJNsBuO16x6wpG3icESNIBoC04Vt/POxcJGUCxJhs9z6
++k69lY/hXW7tLDSbKVTetV77j+zzZoHo6W/Hh2hCOwXJwVc1qKc2Aj8of42dSH2vd
++eXL8PCc9Yk+nRCs9R6xUAdE9t06dVUxvRb4B67RjhLUXvC0Q3sXHEbqWZir6aNhW
++NJQ542RBLFM4XKOqrybZblKEMXIIz8lK+hs5qDRe7DWd1alunl1L2zJzXwZUj756
++l4J81itIG0LcBluOQKTPhYpZCPo0btK9UiUFaCxdkW0k+q4WOcA1xBuz8F6hfd89
++UGtEB8nmOHU=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/client_expired.key b/examples/puma/client_certs/client_expired.key
+index 371a4a1..9a511c3 100644
+--- a/examples/puma/client_certs/client_expired.key
++++ b/examples/puma/client_certs/client_expired.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/client_unknown.crt b/examples/puma/client_certs/client_unknown.crt
+index ed467f1..b6b66fe 100644
+--- a/examples/puma/client_certs/client_unknown.crt
++++ b/examples/puma/client_certs/client_unknown.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBTCCAe2gAwIBAgIBEzANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI0
+-MDgwMTAwMDAwMFoXDTI4MDgwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI1
++MDcwMTAwMDAwMFoXDTM2MDcwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
+ dDEUMBIGCgmSJomT8ixkARkWBHB1bWExEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIw
+-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALpCL06kbLE9BNknrrRVfW5YgkoJ
+-ih7EaPNNNqmUgnIsLBjPcCZ7qlsMaUa2ft0mRFxniFkccdrHKox1oAZQ4WrOV5Ls
+-pcLktNTESkuMG5oiobsASItz125YMoEs/q+cLhErf24EaUAhXjn3/ebvCwtza1il
+-7bL1RS0iwfkCS68cQi8MI+tQlBebcSUoWazoitg5YituPKNj493tS1nO5pL3vZuG
+-6tNmhLr8lW+3n4Fi8SElC/pBWiIvsUhaUZzRjrcyPeMS7H2+zdJXDgTj++RNyP0U
+-TLZzFigeZJXNmHia3uneHw7o3d4fyZERuBl2d990iboLbtPh/9Pf82bBIU0CAwEA
+-AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBO7O5IQJHh
+-4ENYDw/kJFdye3l204JSDrFMP8uMIWQLd1RiI22CWjoyhUSfoyumrzykbPNhxf4w
+-kj1E+z097/8Q491wxbbLbE1hfNdTtx35dnCUVGPb9lCP4YLK3v3swXw4OklVdsCb
+-k/cf8s6BdNKVPdhO0zXRBdCbq2Z2PPpzQtaZ2qH739v2tX6CulB68hUO/hQeQINA
+-eJGMck7mlR4FOE76IeHKYy4F2V4S9iNtkqvkf7M0wfdRwZFJqbdZBXTjRpOVMXgr
+-XFGvANl9HByFudJJHk8t+NmkIFP6rj5xQSV4i31KQQHMGNr3hCKgkk7X6Wn95BH5
+-FSJcNlLR8BuJ
++DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMAqcKCOd/f/Fi9CPDGvS3/IkhEk
++Q08pKToBNsaybIaoZq0cqjqrRT0/szOe1WfF6mYIeEnN54PlEEn4MVo15BxnqmEi
++Ow0Bh//U0IOgLejxj5XS0xRX/01pGojgjW5wTT+gDu/WFcMWopaRS8c2b5HY2Egw
++5Y0a2nNrMQr+ZEAITGME0mY+nr/CSEJAHRtXqJ/JdwKTcrEWPEFzRdBgQATucCdG
++NYcEyg2iX0suE5l4ocGHIub7/XYnYnABpY4LBVutjQ5LEDOc1RVeLiYJt5GKKnTk
++qUoUSTAuISkFwKCVa1vYQHoTrWKC5mcx697QnB0B2QDQq1+homQpLu+KhpcCAwEA
++AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBLU/+Nb6ZM
++QV63HgVF2RZ/q2zFjziP4qZS07WYFUl51aOH8xZ4D8wrjI949LHcloRsyky65T4s
++UH7kbgvd1MasHHWn80tcH5Wq2ekUGqdZsH46dmq6/QLzNb1/zdZTNmAwuGf5m9DM
++R+hd6qMbt9a3DZn3cznNXt6/pqoU570fmF/VchZKXj7rfo24niddBKXJbBtQkNhE
++oE0RPCi/mvYeVkMtJKZaX+ua0L/rn7txKqDusWHcsd5Bkmew6gIT1mI+PSNlO6b/
++wfu9YKTuGIhWbaqNET9T83mNgJs3+acdiphFLZWqsQOmyWC9QTZGjAlVyhFW2SJq
++M15arUrhr8Yu
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/client_unknown.key b/examples/puma/client_certs/client_unknown.key
+index efa436f..90ea42d 100644
+--- a/examples/puma/client_certs/client_unknown.key
++++ b/examples/puma/client_certs/client_unknown.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/keystore.jks b/examples/puma/client_certs/keystore.jks
+index 17e7d5b..574fd32 100644
+--- a/examples/puma/client_certs/keystore.jks
++++ b/examples/puma/client_certs/keystore.jks
+@@ -1,27 +1,23 @@
+ 0\82\11$\ 2\ 1\ 30\82\10Î\ 6  *\86H\86÷\r\ 1\a\ 1 \82\10¿\ 4\82\10»0\82\10·0\82\ 5®\ 6      *\86H\86÷\r\ 1\a\ 1 \82\ 5\9f\ 4\82\ 5\9b0\82\ 5\970\82\ 5\93\ 6\v*\86H\86÷\r\ 1\f
+-\ 1\ 2 \82\ 5@0\82\ 5<0f\ 6 *\86H\86÷\r\ 1\ 5\r0Y08\ 6  *\86H\86÷\r\ 1\ 5\f0+\ 4\14¢\1f?\9bÞð\ 4"\9c¿è\94\1d]\ f2V.%m\ 2\ 2'\10\ 2\ 1 0\f\ 6\b*\86H\86÷\r\ 2     \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10[\92G¿· ô(ymÙ\ 1\ fµÂ^\ 4\82\ 4Ð6O%û\80C\bÜXlkV\86\1fS\9fÊ)\ 6\83Юtq§Qû©wÎn\89\14Lû¼¼1á\1f\16üs?\1f¸Xè^\92\81nYCñ\94u@Рf(\8b[×c\8dÀ4¾,\ 3üôÌ\fAHÛ ®·+¶çbQ\96áî\94h¯½$ÄÑ¢çã\10±?-Z,í\ 2ãÇ\92\95Äó]±$\¨ÉëDãe¿\ 6vK\e\80\18¢z\1fJ8^ä?\1d\ e Ê¢\ f\14\8dàÉé?Î\95ç5\8cÖ^²\9f\9a9\86:c¸¹!=¯ßñ\18©4\89:9Ô\93\86{v]E!ón\9eë9\85Ã+ºí8%ì\9e²-\8da\8bÑ]\9eÏ«KS\95\85\9f\8aÑF\9a<pÿ\ 3³V\eëÇïï\ 5nÏå\87¾ª^0&5 ÈÂXz^¿\94¸`;WLt»Íð-lK0$é2i\e\83ª\11}\r\86 ¨\0\1a~­c\16v\19\1dG\b!$×\80\98x¡õ,Ê\92\0ÿþ§adý\ É\9b®:u$\8a5uË;¬\82ª\16Õ'\9bÌ£\bq\8b\14 ï±FVº%\16<Z\85©\16&\r!\10J¥U\1fp\9bý\85¦Vg:\18\7f\90¶«õ\80ÒyQv\8aN6î³¼\16ù\9d\9eq«ïôÈá·.õ£°u!,ÍËO\15­£COÏll\9a[BÉ+\93±±\85à\16\83G üʪÜUÇz1ÊÁ\\13û\80~\11ÃêÏñµÓ®(ÂûZ\9c;\17iÍéÅ\0\e\85H$Ù·\98*Ykç!ã"oѧn\eÈäÉ4\13\7f>\ 1\ 5FV\1f7ØðËý>\94\8d\f\99\fä`Lq¨²^¿\1a\90"jÓ:Åän=¿pñ«-zËMO%C\ 4YØÒs¡¡·\9flt\16èÔ5\88]\84\86\88\82Ûy[\82$1sc\7f\8e\94Æs}\89¡¥ÏnlÞ\8e\13{¢pJAg·ùãàÍË\95\ 5\1ecïà;"\18.ìvÏ\9aÃâ\97l3¿aмÏS»\ 2\ 3?\1e^G(\98C\9f\89A4ÊRWùÌ÷¯ªv\8a$Ƚ"§­0þÒFz8V
+-0¤Pßíg\8dçÚ}\ 4\99\97£6¿W°    \a©yb\9e\18ò*Io\9c\8b§uö\ 1ø®\9b["5\13ê¼DX-ËÁ\8cg²íð\82£Dw·¢\13æòË&Ùm\98\10\90É\ 4OS\9dó~ü\88\96\98tUK%«ô\8b>>]Eö\86\15_\ f=\b\r\96ä6,Ö-\97µ\9e0J\r\85 Ú÷¶¹\8bê\9f\9c\9a\13\ 1\1d\82ÎÁ\9fbõí¾\82
+-æ³6ËHçD§E)R\89ìo;ä\ 4¬\86\12\94x\90\17­\r½)Ó.~i\16´ø6\802 M5\99\ e¢\80»:±\92§ÚfÓ¤\82EÔþºÖ­LÒÁ2=îg@Ò!ªó/¦p=À\97øÏ̪èB\7fÂÝsã\12Ùª\88ârÒ\ 3rbh
+-æqñWÈóÓÁ\1e\ 3\9bv..\17pöA~\13¶A\ fM,7ß\7f\83ûWmX\ 6HÐeÃEèH;Ú\a\9eLKC\91,-\ 1TMjêÅ«ô!Køuojó\9cNxâÕ\9f\ 4Vãoª³-ÿ\9b\1c5ÿ5U²&$µ\13M&ÿN¬qDX\1a%\8fîÒ\f\84\87
+-ÍÚBJ\r\17 Õ,\br\9aN\a°\1cüú
+-®xNû]ÄÑ\1dÏO²eZçy-è?Â'g.¡6\87Hýç\9fh\ fþÓð\12\91µ\b|óo\87\1a\1d½\éE\9fÛcµ¹ÌR^&|tÕÇ\11ÿ\f\r\9e¬\90\v\9bã
+-Ò\1c$\11x\81Öb<\13Åæ²^ªO\ 3\8fÝÆ×\1d&£sT\9a._\ 4f\1dýø7ÿ\8a0O\9e\88£·!^û\1eeK\ eü\94\ eú-ÀÇ\ 38\14¦\a¢l\ 4B,Öå\ebÉ\\99½ä\8e\8d@\8aPõ`c
+-O\e\10úÚ«-Ó\ 2ð\f9¥«g\12\ e\1f\8eì$1Y\1e\12\ 4\1f§õ\82Û¯\16ìÁ\95\ 5øÒ1@0\e\ 6        *\86H\86÷\r\ 1 \141\ e\1e\f\0s\0e\0r\0v\0e\0r0!\ 6    *\86H\86÷\r\ 1 \151\14\ 4\12Time 17234156716910\82\v\ 1\ 6    *\86H\86÷\r\ 1\a\ 6 \82
++\ 1\ 2 \82\ 5@0\82\ 5<0f\ 6 *\86H\86÷\r\ 1\ 5\r0Y08\ 6  *\86H\86÷\r\ 1\ 5\f0+\ 4\14À1Ð[Ç\eEJ*¨Oj\10F\ 3Wv§<\83\ 2\ 2'\10\ 2\ 1 0\f\ 6\b*\86H\86÷\r\ 2     \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10\924þprû\9a\ 2\80+\ e\ 6I\97\ 4\82\ 4ÐJƱ\85úf<é«?±æBõè¨cX]ü\a¬øP\83Zð&Q\8c.\945\18s\a\r\13\rî35)\15Ê\fFz\1d!7Å\8fW$H Íñ2µ¾D=\12>\91[\e¿PǤµ\94
++¬\10ª[É\9e²Yó\0¬\19º\94cÉ?\859\92ýgökVh\8bÚ\ 6D~\10%s\f\1a\16\19aÔ\\94ø¿{\e1\9dÙTù\9c¯{\96\90\8eë\9eä\ 1¥Þ\90ºS\eY;/ø}qd¿½~\9c\92NnæÇ²ï
++nÐ\1dÛ.¦\84\83Ï0Áñ)Óq(ÙÿÜ \88綯EÊ\ f\8fÄLÎϲü\1cK\96>tXcèí´nÍýd"ÏÃXÜgÕ|\9aÜY\8cT¡h¿\ 3\9e\1a¹NÎþÕp5\1e9KÙò&ÖoÆ\17Dº7\9d=u\8cï\89À.\82¯\96wË2͸µ<V
++À\88\14\9aD£ 1iOl¹Ó\f\9c×\7f\13÷ÖÜ\97¶:ÁÜ\83Ë\b©G+Wâ\85\9e\91Ãå>´b¼ð¡Ã¶þEô¢.~Ê®4\92%\92zAjô»[-Ñ·\91õ\1c\18\ 2ݾ7\81\ 1\91ûÅ´µ\14á)\fù;\99ìfâ8 |Íp©;¡Õß+\ 6Ý6Òê\95<j)í$\ e\1f\92¸kq\b6r\1386¨\bBéÊ\966GÜ\ eª 1|AÁþ­\1d·±^îd'(\91\f\81Ó\ 4e\8fý¿\1e Þp½£\v&ßK=L\93¾\ e\9d\8fO.Ìïsá,â[7qâNSq\10Þs\93Þ¶ýá5ä¨\f\aZH\91w¡;\8e¸\9aÛÔ\94¢D~v0±­\11ëM#éÿ$èÍ6ï\96íÓW¡ì\10\ 5\8e\1dårH
++;¼9\91"\9cÛµÜ\v\ fÂ\86Ø\9e\11r¨H\8aº:ÿ4 ;<â®awÆ2\9a\8bs\1dëü\8ch.ü\85¥G¸÷WÀpØ_QÈ\82è\1e\18Å\82\91\7fDѦS\87|¦½ùö\9aü\r\84\87\9bÍ?=Ì\13\88#2 Lo\1c\95»\ 1â%@\15ÚÓæ%é\12\9b·pv\1e|Ù!\ 5\ f³°4$¹{\ 5*ÝP'\83\96\1cO"÷\ er\9eo(ù\19É\1c0\84+1X\9e¦³ÿRCMµÒ0\ eÀcj(,\17ËFo\83è\ e\91õ,o\1dn\8e)2+\99\97r,çEÉU\98>\vÇ\ 6\85\ 5ÆÆ\vçd%|'\ 1ÿ\12AxÒ\87\10ò\ê\90\ fÙ \13öÌ\97Ð\9a\1d\9f'\93\ 1µ\1e/\92÷F\²\10ú\12\9b¯ë«ºþ\87"\14dn_Éñ1X8\99
++{º\19\80\8câ¼Fö¢Ô¶Ý7È\9cgv\ 5æÐÿ\97\b\ e\8099»k=º¬­&WÌ8\ 6\90\83S\9cPs#\9a\1f\9a¶üë^¿';ÆÍ
++å\1e.\1e\82Vj\81aÔã6\8f?eIÃ'¡p\94¦­_\97\94%<ôò!!z\1fs\1a¾\1d\9d\7fï7\1dÿ»+\ 3¶H\ e\97fÿå~zê\ 32âóI×®«í\95w\83\9dý\82\1c+,øpÑ\ 36ªSè\ 6\99.S\9dJfÍ+\88\851\0\94\98\1e\1a5:\18Ü\1få¹Á\96®]s;!»3\96yH>ÿ\10Û­*A©cË4$\12áH¨\ 6MçPRùl£!\12\89\18\8f\aÁÆé^\12Þ8\vã#ñ$\89W1{o£E+ïóA¸Ç Øço"Úñ·\96s[ÕIÀB\83WñÈ'òÞß¹3´ñÄ8üB@ê\ f\0a,r~ù\90è\aýº       x\94vìk\8fI
++\ 2\9cÂ\94Ü÷\80jÁì\90ö\90\ 4Cµ=Þ¬\87?_S\96¿\8f\9fÀ³H\19л\81\1f\95W;Âik­J<ÍSYð&\8exG\ 4uùýü\8e8> \vi.²Y\16\93¤°Ê\1a\9f\99ô\8c9\92¿Þ÷\ f\94¥6\11\99
++ã\8aÛ<Z\7f\8d½ýÔÒÞûO\9cÇo,\19Ofµ!K70$ù\84 Â\1f<.\8c¿¢/j±]¨w\14Aµ£ðÏ\19FdÕ\99\0\1dÍ/\ fu1@0\e\ 6     *\86H\86÷\r\ 1 \141\ e\1e\f\0s\0e\0r\0v\0e\0r0!\ 6    *\86H\86÷\r\ 1 \151\14\ 4\12Time 17527482880920\82\v\ 1\ 6    *\86H\86÷\r\ 1\a\ 6 \82
+ ò0\82
+ î\ 2\ 1\00\82
+-ç\ 6    *\86H\86÷\r\ 1\a\ 10f\ 6    *\86H\86÷\r\ 1\ 5\r0Y08\ 6  *\86H\86÷\r\ 1\ 5\f0+\ 4\14^AM\11\96\80\16óÓJ6Xýk+\85ë?K\8e\ 2\ 2'\10\ 2\ 1 0\f\ 6\b*\86H\86÷\r\ 2     \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10þaØü\86\1f\16\8a\8aîµR3»\80\82
+-puû\93|\94¾\1e\9fÃÀôs!c\19\boCpRì"å\18E\9c\0!\14$âß\f¶»jTs­å\93]rxZ\v¼yÈl\16GÔÎÑ\82¶¤±Zä!í¸O\94ÐO\1cÊ\1c\ 1Þ\8eÚ¥\1108þÄt1/\85A\8cs/\9a
+-\80µ*ðë#n\1a\98ù\92æ\b'\95ï      Ç\9eò@\8bãU÷mß\0\ 4\12À¸×¤³µÆÃýÛIÏG\ 5uÞ+\14ñÃ7\11Èg\8d\9col\ 1ßÈlù§Ù\89\ 31\81{ØÇ¬l\9cGh¹\8d±{}hÂ\81µí#¢Í\83\1a\10)\9ev3sz\17\97^óh¤Q×\ 4\97\9d Ð\19ñ{¬\ 3\907åá+í\80\94'ݱòøx´\9e\87k\a\ 5ï\8afòú\1eÄäº\15Ô\93\1f\95Ò\86ÃÄh5ãι¢\1cõ\a\b\9d|\83\ 5X\a®\ 4\9e\87»Ø\03\94`\9a'\83/CÅãwÆ%\14õ¤HR=\ 5éßq\1d×\ f\97H¢¿ðp\0ù\9fØ£[3¢\98ZÙ#né\85B\92Ì|Þ³\9cÑÁ\eÞÿõ"\ 1³â*ã\ 3h\ f ¦\85\ 6Òv\80\18XÖª\1a\86¹5òV§òJÿ\9cH¿Þñõ\7f\8e\ 2¶ø\a\eP\805ÞBú7-_r\vTÅpç\ 6\8b2¾W³ \1f%óÉisâ\83\11G¿î\9dýdÇQø«Ò0AK¨
+-\16\ãŧ«\80WøÃioÙó\94\84\979#Ëø\1fSw¦Ý'C\ 1 î]A\eI&¾5Åù¶CjQ'*\9d51²\7f\8f\9bqLª\ 3'oIëôLl\95\ 6\ 1ÓË?Z\ 6"« \86 ¨>­{\16CßÙF°¥rPf\133\a\ 2%në\14\1e]\8fz\99\v&x?Q\1dÞ\16;u\15ò\1e®/¤A+ZÆ]   \83ðB\8a(Aí\10\f¬Â®kP¥\935±G:Î\15Qº¨j\92À|Ö\8d(ç9¤\99ºËJãºLìknCj\9e§v\8d\88\ ex0­Ûh´Q\ 6\1cÜy?¤ù÷\89¢ÚHÑ\1fûI(1_s\88íR\85D\93\97\14\84+¿»ÈÁ\84\1e+Y\b\95\11\ 3\83co\84ú\11DSáRaÊ9&\1e\1fnÇC3[9\9b\92S\88þ@3F\91ä¦oÖÁ6ýy\1cO\11õ\85\1f\19\89`+\9fG"I¨K\ 5ö,ß\87\94\ 4\0xs@±öCÜØHÄ\0ä\86¢E\81ä\8e\ 2=bÇÜ\a\0\80\0<\9dÅ¡ÂZæø\89%\89\15q,\9ab'@\r¸¶\1fYbÇ\9b\80â\16i\e\9dô£\17¾%\89õ\8b»*\99þ5Ýì.ªP\ 2d©Ý-¹Òù½\16BLDÁ·\91½\17êÃ\99.o\fóJ­\9bB\8a\81<Ã[î¦81ø]5ì\ f\17K\9d\a\8eu7\11\a[\eÎ\15Ü¿84\7f\8cYR¿:l\83õe­\85Ó\95h\ 2\8e\80\9e\aOÔò4\11\80ýäåâBK^,¹î\82Ë\8cy\14ny õ;ê\91\9e´÷OðPï\90©1<7ö\13þWA7«\8f\93ýU\\99^\90\82\17Á¦&T\13\95\12\1e\824;Aìç\98\r\88\ 6÷\ 1ÖyØë~ï\810»ÛLFã\1cÅ(Ò¥XÆi=Wzü¥\85øì\15ØÞI\94\ 3ìx\99\95êW+@\8c\88\12¥b\19»H¶\99;\ 4\96\1f¬\82\ 6\86¶ï¦üâß°R\9fã¸\161®î!\1dÒðnÆ\97¯>?ê\12½j\8aÚÌ,çÑ\90_·ã\1c\97~¡ëÑ\ 1\86ÌÀ ¦Ð¯~ºw\8b\9d\17véêH\ 5\e\ 5n\f¡o7¼¥â]\878\91k\93\1d>ý/ì\1a=tä&\fS¢oÖ×\1d\8cÑ\rÕ\86\17Ê]dehÀ\805éWïòy\ 24aì\92    lf\9d\ 2    \1cÆò\15\ 1§\96Úr\979\83\7f¾zÒ8\9b\9c!\1a\91k=Ú¯²UZ7\82\94 6o\81\9bÌè\89Þ\04zí
+-ÄÊÊ\9bPP\87¤õ¼\87\8cZo³r\8b2¹¤â\e3Ť\rÅ\83áV½\9fò\ 1\v1*\10*«Ïå£UïÚcÐ\15SR]\ e\8c½Å@=\8a~\fd\855\16?\80Ïï:\ fà\83\r\ 6s\83[ö(V\99\17Ú÷*\98îÜ\7f\aW¿õfR¤Ó_\9báVðUL¥y\88úÓ½±,ÀC?-\8bò³.½,±\15¯vèÈ|ôk ¹Ò_ó \866x£\82è-\92µàB`÷\ e¸4\8cc\16\9bZñ^Z±Y÷Ú\9f\ 2K\95\81ÒB\95öZ7\9cIB[N¤}\ 2   \9f\9d9¥ðxå*`Bý)Ò\9c¶bÐ.ä\95D°t`\aÞÕ%µÓ'©gQÁ»\1a=Jx\93\12Ýù2Ëà.\10~\9c#\ 6-\f[@#~<B&\16
+-\9d©Ý$=D\ 4\\15\80ØÕÉQ\1c\85\85\8d\88\9a±|Î\99ÄÄg.\ fÀè*±×e¼w\94ã\96m¢n\84ã\1a6JÄí\1es·¢é>ÿ®\ 4bYö\93\bõ\ 3!òð\86êi¥á\7fÑ(Â[\8að²µ\0\ 4\ 1\82\8fJb/îN1µì\10H·<$N5\19\v\88b\1f+XSOK@þV
+-%¢:r\8b_?òÏú½Lð¿;Û\94tÖITPov[\99\9d¯.ðÄô\89»µ\1d\ 2ÖÍ\15Ü\92ù,ø\81t\9f\8cùE²z.U\14?\10\15î<\9az\11'\83(OßÜFgiKnîa¥¿6ÖµÃ+,Æô¡¶o«\1ec÷¢\18Õ6pkús\9eà¹7ÕCµ8¬!\10/\87\ 4Êê'ý4ÙÍ\80åÌNu\1f\97M]\84>$dp .ûr6`I\1c#§§ýt[?D\97Ë%¨\81\85\94U
+-$ÈA¥Ù½×ª."]\9c­Áqá\9a\ 4â`þßI\83!U
+-©½\ f\aÓt§5u=­@±åô9ØÂAß\84ÉAð\1cãý\81¤\7f\80ä\15\16\12Òá\ 4\12^[
+-KAÍ,\ 4»òq,Û¼\80"\ 6^\8e¡¨\89íÝ\94Þ'©\83ÿ÷¨×\9f
+-Æ\87{¤Öy\19\89\98­\14ï\96\ 1¹;&o\r\82Íô9¬\82\99M\9a°·\14¦ñf8è\82\91u\85\9c\90?\ e]aE\85\1cËý5´\ 3ã\9c\19¯½h\9f\12Èr~BÖæ\90Á\96Æ \1d#rÚ)\ 12\19)Ñ<\r2Z\82é\95ã0<]ÔÓ\96Ãí4\11\1e»C\11\ f¯\8eÎX«[\13\87¨\18À¼¤ÅIWöAè¦0öç\81»\ 2"\9dgTþÜ\8fX\17§¾þA   !ª9(À\86¿/åÝn7ý!\9b\ eW®¶ä\95`Ó¨)Ù\10ɶTüD\9a@)\96\12³\86\94°HP\\9d\8c\82k\ eI4ÃÔ¾^­\9b\84\10\ 6é\1c¤\19\82\9c\ 5\89¯4H\1a/\1a\8bú\bØ¥¤\1c\f^@6þ­vJV.y18D`Ç^§\1cC7\vô·T:³\90ÉUJMÞ\81\e\avY\9eT\85Â59:ø\8f£\9aÑ\9fÍ\fö\89$:¦^øWk\ 6¼sc°Öx\85ÆÉ_TjÔË
+- N«^\82N\90FI\1d\b   \¥%\r\899u¨Ã3\95Uí\\15 è\89\85\8b\7fL\18þÀk\9eY\8a's\aR_\ 4<;$\ e\ 6$\99\18¦,W\8cÚÌ+\8e³vü\176\ 5¦M\8fVÜ Vz®\91¼\\11÷Î\8b+ê^51\89Ñ      \86«\9cfÅóðµý>ù\82\97H\r\98æG 9\7fºÞçÌÁ\8aì\91ö"µ\ 1ôcÇë\90Ñö\97]\87\97që÷\81AÁòèÉ\a\e¢\b
+-\12\87\ 4\90\8c&\ 3%[\83Ïu¥öÒî>\12\ 4»»èã¢\97dLÏ\9b\12¯\fù®n#Ï5\93]\97\99ý\9f
+-U\92¦\1eÒ\9e£{¬E+x\8dÇ\80RH8¨¦iEæ>Q&\b\\ 4À!\8bW?ALë\83aAø\10Å\8e\19ª`\rº\17Ei%\98Hu\17Ø\83\ 5ßÔÐ/³¤Á<\1aöÜ\ 5»\ 2[Hu\97\b\81·\ f0\ré*¢\94\9e\1eÌ|\fÝÕÌçFàÌ{æä6\9d¬>¯        P¿¡1ùÿ\13\87\8b\ eø+p\95VA\rCÞ4î¤Ñø\1ddÆ?I\v\v=,õ!\83×c¶Ì\81ÉùL\15®ú\81\96\1fÁ»^0Ý\85xkÈ®\94ÃE\1e\19\89» v\f\1e\9bs\1aÈcò¾äv294ó¦gá\91ä¤Ã\ 5\ e·)³àÅ·Ì©ÉúÇ/\1cå9AÒµ\93ôѱ¾¶\r\ 1kÎmjô\8f¢c-uÏ\8b\99N9z
+-\95Ü
+-µÿº ¡\9d\9fTK:E¢\80?\87ÂôÝA\8b²p?\0ùf|ª§òV·\8c¹\88\1e¼\b¦{bø\1a~$T\1eu{^®\98\ eóo\19´×\r0M010\r\ 6        `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 Éxl3kA\80UÑßë\81~\96ôöÈR××(q7\ 6\e¤\1f)þUXÖ\ 4\14\14\9c\9f\13ÀÒ\ 2\ 5¿^\14ä´  U\ 3T^\ 2\ 2'\10
+\ No newline at end of file
++ç\ 6    *\86H\86÷\r\ 1\a\ 10f\ 6    *\86H\86÷\r\ 1\ 5\r0Y08\ 6  *\86H\86÷\r\ 1\ 5\f0+\ 4\14H͸@\ 2\bÃ5\rÊØ\ fÒ\ 6ÂÙ"\11\1dÏ\ 2\ 2'\10\ 2\ 1 0\f\ 6\b*\86H\86÷\r\ 2     \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10\fÜ\0XÍÝ=¹\8f§]z\1a\83\80\82
++p(G\ 4\9c\9eÂ)Ï\v#õÏs¢>£i\10¼mh%äN;Có;Îr§¯ç\9dÒ\13+\ 3Ù¦u\aÜ*³®È\10</úpNs2Úª\8eóùF\92?èÕz¬Zý,ØR^Ý\87^\v¬Í\\19ýó&\8cXú­È¼Õ­3Bµâ
++y\18An¼äE\8b=}"o\18\8e\1c\16&\1aúëë\ eÃ\e¬Ä$ä\1dH\82ËÀ`ÒìCA\9bÙ\1aJ\15fvö·I\9fnùÆÏ\e\15~ѨÖ\ 3;\12\94ÅûlÆKð¬4·)SP]\1a\97H³w\f\15VKéD>Êè\ 6Ó  ß\8b>\9d{\18îv\92¤L}É\f\9fÛ\ ff$ªÝC\946JÁ\a\ 6ã\12\1f§ã¥\17Û~}1«µx+Ü\82(ô~)çoÃ#þ\ 2ÀÆH¸¦2\90k\oT´\80¥gÓ\1fñ\94¼Ð\86­ \81\ eÌ\ 4çÇ\ 1°\ 1\a³(Òd\12ò!\ 6\8c\ 2ômàX1ò\9aÄÐÚzÖo\1fóMFi\ 3#&æ5 \8f\85\1d¸\88\ fyÙ2\82Û\1a¢¬\eÖè\8dÅi ìç6\ 1þ>í±ý¼g9óêL{X(Ë|äÌÞ\1c\1d\9ccv#^x\8c\90^y\12\8djܼ\8b«Ø¢1âZ\85$.ìá\foK{\90\8bq\98\99ÚA\86g\19\bIðV>\85ë+2¦äT:ýòdÖÖ ´§\8fávUó\85\12yرçÞü\91í®¢\18ÞmÃ+E/¡;ó|°\7fÏs5\80.\1f\82\98\ 5\15\81V515\bH\96Iy$(\9chÃ9s·\94,\ 1è &°ÿ\11P\91\1dk\9aO\96h¥%O\vìÕú\16_øh6vçp\ 5¯º#m\0\92QÑÝ\ 2^\8déõ\v\ 5jÚJ¼©^\15®\82á\1c\våxt\ 1ºÅT5{\1c7{\rC8]Å)K\14Æ<R²M\13¶b,\9b \ 5%ÔËñ­l:Æ\82\81\81M2\96\aôf<+1\v\9dW\99#\87\13J.Ô\84}g\89S\ 1ªHõ>¹ÍÓ\9dáÇSR\963\87Î?\86<θô\94ùÈ>\1d³ï\9aw(
++j&\vM\10\8aÑÀ\90Â\ 1\12\93^:\91\99\10%»Á¡qìÒ¼\1eaD\16û\82LÙmÄ\8d\ 4ñ\0\15v>»Ü«È\8a\ 3\90.y­¢>û\1dÕ\96Üh+øA\f\ 3Ê"\10¥n\blcÊØm;¼ÿÄv\11Í\15\ f\b¹T~üöh~ÞÁ%1\16\19ɯ\83H9Ïq\91uûe\80jï|ú£Q\9e§\80>¤*Tã3/@\97\84Ö\r\bq¤¦AÝ1ܾ\9d56\ 5É5³N\e\8a©\83A[ç\ 2\83\81\9ee\13hX\8c¤\1aËAòç¬h$.\1e\94\9a\19¨\9e\8bþ°\13'\11\11}ìºÇ\f¾\aÑ)~ô.G\0ô³¦\1e5|\1dOx®ØÕ\ 2ß\9eÏÎCý\ 4¸é\ 2»m\f¢}«\ 6\1cîYuH\13ºß\87\92(X\11[\12\8e\92Éß\ 5JU|\1cêO\90\8eQ6-NJ¦ÅÏþôh\9c$Ô"OU\8bÉû@Ëa\9a\ e\8e_]`\8c\W¢ºó-~ͨÄ\11\82\10¨Ï\9fuëÁ\1dcÿÿ0SÃð\9fù\ 1³\80\ 3lÏïh\ fg\98\8d1~\ 2\15\1fó£Åî¢\9c#\7f×.cËdÀÎÒ\99\94×\9f4È¿\8bª}P<.[\93riWÓßÚdr6\1eôÌÙíRY$¼eGÒ×\ 2\aWY^´ò\ 2»\9ei>¯-À\80®Xi3Ýõ~2\16\94¥}>#U:Òùòáû°ý\8e¢ù\9c\93l\17\91\94\r\17\e:±êÊr\12Úô7¾\92
++l\1c\1c\0.%AºÀØþ \18\9bª\8c4X\11EùF\86 \8bU&/n%\a6°Á\8e7Kú«\aÚÈî|\88$èýÌE}õ¿V÷\8d\87\e`\97¦Æj\85ëxÔ\ f{Ê5嵩\8a\87\82<BØ1\1eíêÄXtZÖ\7fC\ 4¹|´\1cRq¥\1fî\v[S\90\11\81í®É¥\88Ö\9ceå·ð:ìÜS\92e5øw£9ÓDa\ 6¦8\8bºÝ¾ÅÂÄ?\9d'%Èõ\9b/\7f#\7f¹¢\9a\1e³Úma»Ú8)e=6TÿrD\18\9e°Å¹h¦¤E\14ÉG\ e­Ò&\88+ÁnŪ\96\92÷õu\9báÊ=\bßïó\9ciÆãÄBíûô    £~5\95\8fbùØ\85T^\8c\12sO\96÷0\vð\8dB\ 4DÆ<m5@T2²\1c]4Â\98\95\11 \8cÍ\r\936¸f@ªDvÃH\80`¬Å\1cY\f\8d´©©¬28Þ\9f\ 5\98£D\1d9m\80Ì l[@j\ 3'\97\92ð\ e¦æuÖÃÂß3Ç>\7f  \1eæV[/0
++l{7\e\14\a¾þ\93Eí1ÛÓó
++S\b ï\0¥oÏ%\82e   À
++>\9f4c\16å¶\9dÂCÎñÔçÁØó³Ú\18\99\81À'þr/¢\1dHÛo\fн   Ë\8cØÕB\ 1\12\9a}6\v¤»\94\8b1oY¢\ 6y\fá\f\ 2s\9axu\84ìXÏÇða+b]³(6\99ì\15"\8aá\88óCÅË\14pM6Z²²Þ¸\1d¹\85ú»ÙÐ[\965\a\ 2\8a©á9\951\8dÌ\9c=X\ 6\ 1ð_\8e~÷p\8b¤v~z\1fHrXÁóvÇå|%«PÙÉ\8fzÐ.ég¶\ 1 ÐP\94U\90\ 2y¾V1Ùþ¨ª4\8eÈNÎï\83wñ@Sp\19>>Ù®ÊT·P`E£\ 2\172"#:\9e0kFÁtßCÜ}\18\88\15´\90²¯j$q\86òÌ\8fn\1cê\8e\87ò*ô\9f>\93q\v\ 2\f7\ 2ånmý°Ã!À$\944\10@0ðq¦\ 6Døm÷rîs\14géï¿ã\17\9f\96\92gítÅ>¬hÍt£³A\95\b¸ÀDÿO\1edz&¬¿\14~\80µÕ\95ñ\89ÀI«\89\9fvdJ¬K\9f\1d°Gw        W\86©§&9?hªOʯGO\1a°ôö¢¾\11|¨´}«Ëê\99òeö>÷Ðt    ¯\99à ,§y\89½\9fÞdȨùûX6}\8aO\ f\16 z#\11ü÷\0»\88®/$Hð\11g\ 3Õï{Y@
++]\1eU̳wÂâ1}X\9bsËà^7Khå\ 35üî=H\9a\19é\1d8\ 1\1c×\ fVs\aºï\9dÕV\v\aæ\80\8b~\19ªbÞÝ\1aÀEâ\82\94\ 1Ólv\9fl\1a\82ׯ3þP-\80r,aÂ\83\18\b3\8bôí\0òÞS\ 2`  \1f\ e°\8c2\rÑWʱæçu×½>éÓç\19ç=iÒ\9f\95\90¿·VRÐÞl 7õº¼Ê\96$B]åo÷4H©ËÀ~3\8fmÚðd°ï\89·\84\b\8aP\15ë \r0SSpie;¡0P\1e:©É£ÿlÍ<4Ö\89ª\80Ù/=\950 7\96a\18\92L1ò©~,æ\17P\vsɹÚ<`\99\83Ü|\9b\1f\ 4\8eñ\9e¼\81\90E\98ûs©­\97D\12¿d\11Rÿ£³`{Y\19£·eiãÀßN¼)\0çÛÄÀ;m­\ 5·ÎM\f\84Ã\84\7f\90:\1fÂèá\võ¡Í\0MU\9cGÑi\83z2Å\ 2c\97Ʊ}JÎd\8a\12ZzSd\19Î=Ù< u\ 5»Áú\ 3r\1c\99/¡¥FøÕ£Ã RbQ)í\7f\1a\ 3\8c\86ÖeÊâ÷!¨)\83\19\m\8a\91%Ø´Æ\13`_®øv\81ã\86\1c0\14\82Ú\12\95Ø\1eÔðrËÁÐ\fA­"\10§\v-B¢\vÉ0\9aÅüpLCÍ<½³Î\85urt¹y,[ø\80Ñÿ\148\ eóÐY=lêKF1\86N0¨\19Ô~\86\93¬«\9b\ 5ódɯ¦h6¶þ¼zÄ~6ø\94\ 3\9c¨Å\99êh\98\1eB\9bôÖ\86Rq\8f-àÛbÉiïÒ÷+Vîeqpëî\b\9aT¹éö¹\1d¾9¢[è±pÈGÆË\1f\9dÞ.}Úÿ²,¬\80àK\1c\ e<\0¢[¸¼C\8dðWDæ\96¼-\11·Þ\17bL¹oÌa(¬+à\b\7f\9fÖþ)%\9e@Þ÷ \19\97qå®$&£EÛ\a)f®ãºqØ\1aH\ 6\f\83ë@v¦\84\aÕpiñ5³
++u\1aý\15_.u:?\1fð¥\9cç5L:\1a­`¡\9b®àÁA\94mfé£*AúÌ\1fí´\V\9aó*ÁÝ\1c¨%e!\9e\vwÿQ¶+g\996{¦ßÁ\8aª%\1a¼á\15åsa\80£sÒPéŹÛ÷\7fFþn¨Y°âfTì&TìËðñ\ 1ºDK\10\87/!T&X\91""Î(\999\12Þ¸%\15\8fî\96c90=KÞt\97 u°S\9e\12\18.\16Á\96D
++áòWÌ\8a\13N\8a=DÜE·8ónæ\b0M010\r\ 6     `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 ±&\9f\99\}@×xþ\13õH\99¿SÓµi\ 3É\vÆéÐ\9eÿÂÞ\8f\8a\ 4\14\ f0\93\93~LÊU\96°.Ê\89¼±Ù\959\ 2\ 2'\10
+\ No newline at end of file
+diff --git a/examples/puma/client_certs/server.crt b/examples/puma/client_certs/server.crt
+index 1335881..3a7cd3d 100644
+--- a/examples/puma/client_certs/server.crt
++++ b/examples/puma/client_certs/server.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBBzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
+-ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjUw
++NzAxMDAwMDAwWhcNMzYwNzAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxqbRfVxcH5wKCTGfuZTVisUKUIWS
+-TUOWkIoyIfBKVknREnVSN40aw72bs9GDh55F+R2IJ3y9F7TQXo0Y6PJ9tFXZqJMb
+-2NHXYTfhQCSN/w5wqKIrWOR7wbA4JHjs6x/vHYnjFVbvbx43M+wceKsMBlQ1eDLz
+-Ukr5vjLGASmdgzTq8AUd5bNKiNq+ERyAUTcuwXWC6ndXNdr3vdEgcYnzPWtgM7eo
+-1SpewqCqrlSeA1dzXThB8vCFkCNy7DYrJbCuGIIxm1D2garE2814LXztE/rhwdIG
+-zonh44/Zc43cFhzJQUhcJ/jOxFovgijHd5lvUfvqj6YoquC5yFVYEfsSwwIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAK8iNpb7JRQ+
+-CNHl/dUV2DW9Js1TndISLs0YqAcAJHgzwtp5OPV8GHUV/BF7sf91sHU8y6ivety8
+-QsvG1ToZhWAVJXG+AStgJDM8Iw6g2xZbIY3wP3bBSuxAE5PGdcXM7nRfjwnAJM7i
+-Q1gdPcntc5J3dZ1Kt5d9iofI7UMBTuf0Ws+LWG73i/NeRj0lef6+VErQ6M93Yi7/
+-knXVzvRkpK2664fRmUHlavXP2Alleuuibgg8kgJ9M1yjluwwx66LXUbhMClrS/OD
+-hPM29fPZmO+XHJ1dtR79DhdmwqX+GOqjD78asYHIg2Yjy3yZsOX6chKvD0MWk6pc
+-DyFSu5fEHQ0=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwemh+fx2FupgRmKG7ru3X2m//xDX
++DttQXdXI8OwqwQcWW/7fGxzYXImPGKSYToXUctU7pFM4+PjBvp0l4iZLXANn5lLA
++e3zEUzC6tZEGVol7Id0nRNVqVgt3CXLLmcxyuTwFZmTPM3AwxtxTu6WbGWz0l6v8
++ElFkIZ023Kb5e/D0GBUVHOJJDcqiaDf18WrzPjJd59VOE6gH8iO4GX2ckzpf2hBq
++VPVsmXi/3sTv+5RlBr5VSNPRq4LxBrARfWU/vTq8Q0u4mc0saLNPB3O3i3iN9wMj
++KKJV3tBNzV72OnsIhs2KprVrcE9bm1XT1U8KTqkpPprOmY+iVWHcjJTa9wIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBADTBxt0J0+jn
++VWiuVEvkVNLutKP//CbQxwt/h9KsigHdwhBBQ4yeqZ45OnVMh8npTLc+7PHgqwnb
++VUO+0aqIOGJbeEAbGbjxI4ND0LA1sHwKkGRUPIQEETXOB4H4DPiM+HHsUMd+DuPb
++cWn5RqBZByj23wFCp9/Bf6Db8jzVNRnZx26+rjjtP8muQuxeIACjsgt58akLLQEk
++IVvLPoKrnZGxMbKnLejmXGYB8iLeWnF+nrR2+IrJNcBk3A+Fkb92EsJUpernqmzU
++3+Vrx1xeOrm5gRMgJshqUEdqZVeolOsQX6FW7LNV2AtvKHHGm3LtssaR/zHuZ36G
++ONP85Zw7QHA=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/server.key b/examples/puma/client_certs/server.key
+index ea6f467..8b890fd 100644
+--- a/examples/puma/client_certs/server.key
++++ b/examples/puma/client_certs/server.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEogIBAAKCAQEAxqbRfVxcH5wKCTGfuZTVisUKUIWSTUOWkIoyIfBKVknREnVS
+-N40aw72bs9GDh55F+R2IJ3y9F7TQXo0Y6PJ9tFXZqJMb2NHXYTfhQCSN/w5wqKIr
+-WOR7wbA4JHjs6x/vHYnjFVbvbx43M+wceKsMBlQ1eDLzUkr5vjLGASmdgzTq8AUd
+-5bNKiNq+ERyAUTcuwXWC6ndXNdr3vdEgcYnzPWtgM7eo1SpewqCqrlSeA1dzXThB
+-8vCFkCNy7DYrJbCuGIIxm1D2garE2814LXztE/rhwdIGzonh44/Zc43cFhzJQUhc
+-J/jOxFovgijHd5lvUfvqj6YoquC5yFVYEfsSwwIDAQABAoIBAC1UQohLC4BxAD9B
+-0hMsWZ/tP2HJYO19hz1bM35YEPZoqKsAF28ypRFWUlGxdMR9ArWKHhf4mENxEH0K
+-0EzTjIiacGzNiLSsiWuXLzCORtKVDnMEckS5+l1joyP7bgBnDI6eeLFVYZRm/iy8
+-a3DDgx5sl7jiU3CLSDq05ka8osMd5/WcGSx0VaenhPNUY9m40h0tuTO8NJyz12rO
+-Zdm/Uq94zEA3XdPuOgnZMUZVctZzy/2TGoqCWGT/MT1ko9PJ/9vwupyTo08gNqGG
+-YQGDPk/GM4f5GarLD6Ap4l1RD+5RfCdoWRLLN7Q06cQ0Sxo1OQ27cPPBIeIDyv5b
+-3lvfp0kCgYEA/mljvIyGVOlJclIuBiT8Mjb4yuJktPXZdbg+sI6Pm14yYvGR/1yg
+-Kas8ZSPS4VEl8v/xC5vwKEeeAByVP1+cFW5EUvj1zNFgNvfytQumnyXFyrMA+Mib
+-RfX2cL00V4Hvsy+kdzRjj/HpFCZDxGB5cwAnA4H24pNaxUDdUBF4OesCgYEAx+RP
+-l2Hc+JFhv0gjyj46SZVM5D2yx+U33a5FNl/NwB6AdKJ4r7j9jZFKCzniCOjkvh0D
+-a7AhnnB5fuMCR3qxcWMuTtdinrTydSQb6BFA5XbHgAsQvfp8AGJ+T1A9EAMFPA6R
+-QKUSd8tEYo/OQZcddvdyELDq5T/eaCVDCXPzPIkCgYAT6BstvbElI7vjfhqr0GkL
+-ZNHCzkQjBLmnRGtjVURXW9+FbnGGEbFWkVeAcnUlvDvD79LknacE/9WVHKdw9gI4
+-ixA9jc1t4VQt+Oi80dSPz1zSp38D+G5t4vkNiUB3OGuREcFEsoy3zq32LahPzVyz
+-aueilqDCydToalLm2PcXUQKBgH0jTUB0H6XtPchGHUHLWyodsZlhlr7VnPfG1cWI
+-jIItljVuUSeRJAqwXi5Q+lShmDH8b9vG1AUgXK825oJhKRzW/nKVHERG+1KiXGYY
+-BwygI5zhUIXefiqvfmugy9luSqSiagSSUtF0C0e4x2MAe42ys1IHr8X9Cfsg+Kq+
+-UBQhAoGAEMLXpCq0PnwWRoUZYxwDDvLOoEyul0jghAspec8d31j0MBUNTn19YlmA
+-jci2NHSY3TMywR/USSCN56aT6LstlMyRzmoJC5DYNJvEEkMHQam/BfFO9VT0rkMG
+-n6BAyqoComrkP3mg4sn9dI262Rz4I83obXj4DyV0eayOuY2mhHU=
++MIIEowIBAAKCAQEAwemh+fx2FupgRmKG7ru3X2m//xDXDttQXdXI8OwqwQcWW/7f
++GxzYXImPGKSYToXUctU7pFM4+PjBvp0l4iZLXANn5lLAe3zEUzC6tZEGVol7Id0n
++RNVqVgt3CXLLmcxyuTwFZmTPM3AwxtxTu6WbGWz0l6v8ElFkIZ023Kb5e/D0GBUV
++HOJJDcqiaDf18WrzPjJd59VOE6gH8iO4GX2ckzpf2hBqVPVsmXi/3sTv+5RlBr5V
++SNPRq4LxBrARfWU/vTq8Q0u4mc0saLNPB3O3i3iN9wMjKKJV3tBNzV72OnsIhs2K
++prVrcE9bm1XT1U8KTqkpPprOmY+iVWHcjJTa9wIDAQABAoIBABDNdjpuxKswdlTJ
++ZziUjeUrCRBiNmBhL9H4Gy6IW4QL+yucwCeQ4YA5ozg9biOPt4/KJ+reeaQi2f1Z
++KW+ZMq2voqpaJurZLghCkEssKXwIjOGrg7v6yixxveGhtg0gb07bUC4SzVyye5q5
++SMAmL3RajpWXhelVO1n2TeSv/npD75Iil22UG08+BCHqjuxzP9l/uRMdPWWfVZry
++w2xPjJORglBeg5UpK+n5OAMMsmTRr4F6QCAmgT2K4xyPa0cc2KXVBc+tNFLkjDqa
++NnUrDF/hqnYVy1QDKqyWSukuJgB1yOLOP3NgStzZQD9g0yfUgyX4euSxmbgUV3FK
++0JnyTWECgYEA9TONAclAAcGFl06cmtjJsqEH/WmcS8EJyJwbyp9skhNDuMhAPvAP
++43W0UAW7BFoKT+X3EynneIn+uGn8Roo4PC9g8ADIpCYihJzC+C3gkomaormfc3bX
++83G1/toIoDVN+iCZq+Y0p7u5hDqD+Ez2zVEgMKJOW6wfpPWM+WXUIakCgYEAynPX
++pvufbOyIQjoRwIRF442finhGp34rIUgzrKzx7pJxQeEt/ffb/AGCdWO6EFkQtnGb
++0bD9anUgAYgDhPraE9xJZVZ7U3y7xXYkCxJFhPxUSIxpe6UXfoyUPsgVum5P4y+f
++b/ZgRzJ/XDEBNBgcT1fbHzfbNSDYCauuNqjCO58CgYEA2iLNW/xs6+L89NmjqoIY
++Fcj6cbBFsoL+MDDo7H6duOpYggfsV9F7YRCyo8olUT7FE8Vy4+KQoQSqzebD3wFR
++/ADuTTV1Scr/RFitftpZgiPWpNNcDf15KoNLtHjF2bjyMQZVj77RszLnXMIt63SU
++z51PdNS/vwBGeptUmf7EFFkCgYACu9+8pIc5nFQWuNwGgoLDGOV/pDIoDt8cOvJf
++sZIuy5F190l8tX0mAQs29JrNn7ZHEG+vPDmf12cQPjr178FEJWRkVu+hZ/zNJNRF
++xgBkVFf7BtJh1g/kKJfT5TXN57FyevEnPOd97qOjphHDF1RCigguer2eEQx5zPS0
++TkEZNwKBgBJ6O2JV56ntAhbjyjvqsgPubXdLfeo5QSsk9vOvlCMcKC+lFcAx39pv
++INSuuBhDAXmLDUoU02dgMtsRJ9c3oZyvvV4581y/QvxvvffAnlj193X0tk+Fj0Zi
++fA+BzLMygG8z5aO5I7h2rTgrv7b+edchKhYFyyXz67zaiD2UmJf5
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/server.p12 b/examples/puma/client_certs/server.p12
+index 7f7e8ff..12cd7db 100644
+--- a/examples/puma/client_certs/server.p12
++++ b/examples/puma/client_certs/server.p12
+@@ -1,15 +1,14 @@
+-0\82\rL\ 2\ 1\ 30\82\r\ 2\ 6  *\86H\86÷\r\ 1\a\ 1 \82\fó\ 4\82\fï0\82\fë0\82\aB\ 6      *\86H\86÷\r\ 1\a\ 6 \82\a30\82\a/\ 2\ 1\00\82\a(\ 6       *\86H\86÷\r\ 1\a\ 10W\ 6    *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b~Ê.Ó\9fXyp\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10iDíÏ{òÔ¼ø\1e¸\910]\14n\80\82\ 6Àó\ 2\ 6\83S)÷\ 39\97\85el¨\14!\a?\1d¬ZáÁ\1d7Ì7Åu\\ 1D\a£3\9bË"ü\84*ÒÛ#\ 2':\95\15ý9ÃSû!\f\9e6\19
+-¤\960dÆÂ\94\ 5d+\17¹b{\17#\1cÐ\89\9b¯¢\1dÊ!|Þö¸\98Â\1f\9c#\ 5Äm       <¨O¢%4/®*ò\1a¢\7f\9eÍ7óélá·Öß\8c,z\923\96 »Â6s+,\83Ù\8e/x´gòéèAÓ\10R\15Øøö\98 \8bã<\ 3\17\8d*bsÄ\80\86\vf{ ×7=\9a\ 5\10p\a%)\91ÏH\8a®ð\9daht\ 6\87\81;F\85ÖôÿaÐÄ«³²°\1f÷ìD\8e   ú6g[o\16\9d\91£§/!R\9b÷Í4¾\887V¢ú^¿N\ 2Y\9d  \9aÿ¥ë½\15Ö¦ãÏn¿b¾%«ô`ô7?àëA\0â\15µô\8b~Íö¥À£è\96\87þ\ 6Ú\95rÐm\1f\13V     \ 4\91r}ñ\1e\ 4SRÿÎø\8bÓöPa!üØ\84ö\80ò\8fß\91ðB\9a*Ǥ¸ \12¢ð\12ÝÁ[\81ºTÿA\ 3\89?\82qÜ)\8b\aTI\9b®4\8bßGä\8c\92ç·ïl¿ØÜÀÔýÜ3~Ëhü\12\11ÀË\9b\1c\ªðg\92\8be\ 6\13\884\ e\19\96Lï?\8d'\93®\80dd\9a¢!ÿ¾Ô^_\1c\9bËÐù \10\r\98èòU:PýOw\1c<««¤Fõ\8eìæ¥µ\81jò"ô\92Á\eÎÎjÿ4È)uØiãKO¨\1fÏ#ê\84\8cç/Þ²\fâç2Iù\93²\vØ\9d³e×Và1rmù\ 2,       ØP«Ô|àþb\ 3V\18\86O\1dy0\18\82\17,Zäµ\8a\18\1e\1cmpÚ)\85«Õ|W\9b­BÐ\12íÌè§_C\0¨\v\98¦\80ì\9d\ 5æÂR"Ú¶\7ftÅ &EILóÌL&û@\12\99h5\ 4\8f\e¸o\1dpÜñFÌä\18\87af
+-céÆu>\eí¥\ 3\13`°½#\1f\99bý~*NÑEÄ~Y£f§ÿpî¼&ÕÍ+Ò\bTC§¿Z9Í\ 3\10\84)RÊZ\98ï\92\em\ fS2D\ fJ ¡hVÁìúÕØ6.¬øÚ¸fåZ\19\11¹¯ÌBÉ\18½üì\103\9d\86¯Qo3õ\85Ñ\86\ e\16\93¹JÞ\9d\94o\11\97ã\f´TVl,l\92þ¯êÚ\0\ 4\9a¶¦@âRuímÖ¹çÍÆSëªùÕð\99a\rr\rÙ\87³~R
+-?\ e\92F+yú¦\bä^Á­\ f\r`ºì\1a\93áúH]\89\18\89®Ú®LŶ|"\13\98\ 2K£ã\8d
+-é8\1c7\8fEÔ ÃÑÞ\94¤&\ f¸ÿ\9eF\9c\ 5\82¹\93Î\ f(0SÅ\1e\10,cî¶²\9c\17 ò®\vûRF¿§¾úEP&\9fñÙ\18\<*6\99ù\ e\8cær-¤\91ëèJ\v\8cv\9bÒ\1c\92AJm}Ѳ\84ðAíO¢ÔØa'Ïæ{\e\17\ 3\96\13<\9aÍ\94\95\9fºHÇÖ\81òLܹ:Û®*)Y\92'×ã¿»\8eQtQÉ\15µ\13\95¯z¼o\1e\12áô\90 ÿ\1c­örð\7f8\9bö\15\8ek\16\17\ 1\a\1e}\82\81Ñ\1dò\eé\9dÂÒN<çõOr\8fiáÖÏ3ÙV\1a\1e&CBMà\90ò¿3\a\1féÚ¦\99Þ°0qdu&ïU&d@@ènÒ|Ð\86¬\ f°M êVs\8eSµD\7fkBrªk[PÇ)ÕÝ\bÍ\ 3!n\rCýH4¶«/\fñ\88î\1cpÃÓÕyv\15O\8dßÝU\81Kí-Xý\94t'\13\ 2´y(Ò\95\90$uË`__²u7QY³}\86a\83ÔÚÂÁYU²\f\10åï\9e¡Ê\adºËÐ\1c¹\90{\8cÐW?\81ܽZrÁg\87\90d¯×\80G\14ï¦U»]\1eyLA\94BxøÜûSß\87\98Gw1{×\17¿sVsq
+-¡\18\ 5\87Ã¥±¿\9fé!\99\0#¥Q\82o\8fÿkÔx^Ó¾¾åý\98\96\89\8d\17R×,\18o\97\ 5\14}\r9Ã×~«ì@?zÌUÅ\ f\84ú¯ÇiD   ìnÄÆ~\a±\91ê\17Ý{Búºahzá/Þº\8cÐøÜ_ý\9fxLFl\8f÷*C\8eU\13ÿ\90£Ð´­ÇâØ%Z¦\9ap\82°\91Ãj\8f\ 2MC\80éÓö1^¡´ã\86ûa§3õ§èg,F\88ËÇ\a±\1c,¯,ËXåå\1c\9aÇtî\85&S²\83´KïFù!\85|v|òR>¸8FE¦0êÒ©Þ\rê\8ecX\8d\9e\ fé\1cë9\ 5Ò\7f\87Ð
+-\99\v+\1f\995÷rXô¶\88è´\1f\92\83õR\150%R÷ù6]Ù!®\99¹Æ\10\8dª²\1f.(ÁëªÇT\96U\85\92Ú\88öV¢çú´ì@\9bIq±Y(í½\85á\17y%è³bÓ5Sá\98Ü\ e©ñb\83\1f/sø\16¥\ e\ 4\ 5j\r\ 1]j®oÈÌ´æ¡pò¼\9b#\e\94\9c\ 4±8àw²\94ø\97e       \90S!K¦\18©y:°óÀb6Òø½#GÈÓ*½3\86\8eÉwnÿôO~q_\1e\91'Ñç\0\ 5M9!Â\16ç\12D1Xܸ^F\ 3KÏ¡\93WÛtK¤\1d¼1¢±3å\1dNÄÕ\1eOì*tXÉ÷Ã;\83^hͤ®\91g¡e\8a¯b5\9cp¶-\8c\178\ 2\17\8a:@x3Vbßìö\14/\93\aªR®Ôú0IÓ¾»Øüj/\ 1\19£UÜTË®%Ñð\14\1e\95¤0\82\ 5¡\ 6      *\86H\86÷\r\ 1\a\ 1 \82\ 5\92\ 4\82\ 5\8e0\82\ 5\8a0\82\ 5\86\ 6\v*\86H\86÷\r\ 1\f
+-\ 1\ 2 \82\ 510\82\ 5-0W\ 6 *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\92\aù÷"~n)\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10/\86\83C\1eÞ\a\12Ë\1e\9c\9c$\82\ 4\82\ 4Ð\ 2Øð\12\8b{ß`\9eX\81g5û\9fönæn\870ªK¥'obR \9eÁ\ 2$\ 2ôÓ\1f\\98Ñ\92W\84¦÷u\98\ 1~v       g¸Ò©\ 4>ÂöïøéØ¥]·`÷ ¾z\9a\8c·Áã½\99'\1akW\8dÊ"Y
+-Ùº½íw¸\1e=,\ 5\89¦/\19$ûò\93OUH\b\1c&7?Ñʦ%ÉM\15Æ{þBã\96?\8bF½\ÇlZï\9a\9c0\86\aÉ\e\90ÕW\ ehÖ\/OùyÿW\7f°È$ÄÝ]ÏÀÄ../\7fÅÙ{T±\aêÛø \84Où(ÒºT\97gyÖ­å\10Ê\ eOÍáw­¿}úÎr#:8U\1c\12-ç6\1fÓx&9>\93\bãÁ æÑ>\r\9aÙwd(ÛÚ¤ÔÿkT
+-S\8e;\9c4\8cê\18\91Ñ÷ã²\85Ú*\18\ 4÷>\1e§|×ûê\ 5\9b\ 2´´OP¨\88óì«ÍR°¬v\9eõä\9b\8e¯fV\ 6>Ùl\10C\842\ 4¦ \89U\9c<\84Y·Ì\8d\99\13ð\ 4À ÄÎxcÌά\f\92Ò
+-\1d÷ÛÖ¯\8b\ 2\8cÑ'7CvyU¤É\ eÊ­ËÞ'Ò\10Å1AP\97tRï§e2\81*â÷\1e7âcõ~ç7\vÏ\0Z\11\a P-®/\8b¿\1f2eh\8e\8bø\8b)zzVÉv 0ø&\8bkº[ò´Üõ©\9d\96\8apþ`\1f+¨`@|\96âñ¿\9c\92.\9eÔýú.\94C~Ø\18e\93ó(ù}ÝmäL¥`}­¼Èy¸ú\ 69îóC<º\8e8ý½­p\9c#_õÊÚ½\8eèR\18R\15ÎÏ\99Q    ö! ]\18\86FI`\83Q@bÆÛÙïÎ\9bп~\92\13\ 6À}WzKÁ_V\9f\8f\8b\13ý¹Á?qýG\80\82÷\81\ fúÑÕ_/P\83\13«an¦ÒÇÀôÝ\95\b$ñÏi\83j4)Üþ\1fϦ\7f@P¼³\89\92\17w\8bqàýi\9cËÏó\9dÈ\v¢M.7I\1c\84\16#JÉ\10¨\8eÝÓ\86\8d\12âT,=       \9fÞÇÕ\89Y¾kàò\7f\9dBc×\ 5?\9c\88à ¡\9d\ 5M\ 2\81m;GUÚv\1f\86®\80Ôûü}×1\ 2\9f\90ç<Iðñ2ßxRBÞhT²ä5ÕDLg³ @9{B8hM\17
+-[­¬Î:\8dïè=Ç´Vº\83\8dËLK$\7f\94õÏ*R\b\93¦\9b\90ú\ f­
+-\aª½\7fÐ{Äç\95\9aÿ\85\86¹=·cø¿:\90\18fÉ&\1a¨xiV,£eËV\91Û:dÖ\14(\91|\9aôüv¶É*pú?Ä\9aÀËÍ=        Ýa*\13èË"á\97(\96\1fÿ\8e0\8e÷çÿÄnVå\a\93       Ä\94\ 2\rú£B\19ÀÈH\ 6uzï\8c(]\ 5¶6Îrêy#ä­OÙÚ?aÂ*\1f\eÃ^\8a(
+-\9e\ 2\9a\8c\1al g¦½\88\bʦ¢\0¾¹½\1aÔõ6ÿ&Çè\ ewó*\8bõõÜë\93\13§\93X\8fÏÊË!\8e3×Ý\ f\1c4\97ËHÝ|\bc
+-Q×pn_E\93\8aêy3ì\9bÛú½\18õjl\0ç\9fzÍÂ\15q\84\90qͶ\84\88}`\8c\0$\17\ 6/s\91:¤ÎëÃùÔ \1eiyáu»«ÙÂ\8b\91\86µCD \91K$      qå\8cÔdohÝ_ÜN\17\ 3!\8coD÷<Nkàï\99´Ã\92\12âÚ]r~ÓõJ&þ'cÿ~Á\18Ûß\8c\18\e\1f\91hVÃf\b\8d\8f\1c½u\8a XÎÒ%àV;$ç:Kò*\8ax;øµó¶ô§#\83Ï\92\96¦¥ü\84¬Ipóy\94\9cA°O\9bÕý¸3MaÔ@3L]V:Jlô¡508²\ 54tÐ\bÏϹqÃ÷ý\9dµ;\0Õ\9b¨Ô\8c¶héf\8büé\16ÊÉÎ\1d"\\17v\13ìAñhüWùD^ºæN¥t\13·cZÕóÌêhÁ)ÕY9\10cüSxð³íM0}\1cüÁç\Ék}£1B0\e\ 6     *\86H\86÷\r\ 1 \141\ e\1e\f\0s\0e\0r\0v\0e\0r0#\ 6    *\86H\86÷\r\ 1 \151\16\ 4\14QìwB\1fI×ùç[÷\90\16\19³|C\8a0A010\r\ 6        `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 ×Wc^WXßjêbèC'q+Tcµ\11fh\87\0T\19\9d3\14t\98ÚÚ\ 4\bÔ¨p\99ý\9dÕt\ 2\ 2\b\0
+\ No newline at end of file
++0\82\r\\ 2\ 1\ 30\82\r\12\ 6  *\86H\86÷\r\ 1\a\ 1 \82\r\ 3\ 4\82\fÿ0\82\fû0\82\aJ\ 6      *\86H\86÷\r\ 1\a\ 6 \82\a;0\82\a7\ 2\ 1\00\82\a0\ 6       *\86H\86÷\r\ 1\a\ 10_\ 6    *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10&¤¯\88\9f3øÐ8îF²¥\1d\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10K&\87f\90\v\10ûC:o$\95t\80\82\ 6À\8bôM\9d|\e¥\97ó´l\88\8a\7f\86Ǻbø\8f
++\ 3"¨ýs\136CТ\84þ\89\ 4\10éV\15O1\9d\15\14%eú  ¨;\8e\9f\ 1-5Frþ-8<\8e!è«Ó\8fÄ´çÁ)\7f\f\96g*B\8bUÄ4\88\ 1¼À\82)û¼\82CzBM×ar¡âÜ\ eX\e´¾óú\rq\ 3Ó\8bÂrL \ 4â\92w\v¯ª\91\16Ø\98n\13׸5>u¦\9e;_2Ñb¿ð@¥Ñɺ\eûztç¿Þ2foË vée<}7?\16âÎé¼ÑCcL\8bIÇ/\1c\8aî\81\±¢²\8f\9a~ðýòeÍA uâ\f÷¡       $tñª\1d\99·Æ¬Q\ 6dQ·\ 3\1c²J\9d\ e #\eÒVÓ5Ä}\17a9\91²^\ 4J¾~ ý#ä:\8b&cþÅÆ¶\9d²,\95\87\0Úe¦³`ÞîK\1c¥lw\b\v1­[\84%Ü|\9d
++îÂN á\81\93j\18=\9d\1f»âÊÅ4Ã\ 5\0ýÉdK\a\8b|\r\80«Úñ\14¤gLvÎw\ e¯/\9bs\èã\87\16ãz¶\8cøÈ\18ðÔ?0Âû£vì\81½ù±,    7<é\9b\99\8e\81\98\97¨¿yÜv\ 2àêNû\ ft\9fØô]ÃkÚ­P\90¬/Òàâ©ããnaCyåF3ÿ6\ 4«;-\95\8b\84Ûj£%\12ÅcJÁ[s\87\13\ 4yoo\97\14\ 2\90ã§!­\r\92L\ fn8^\16\88\90\11\ 2Ͷ\85\84JBp\aÖXsR\98\0©\18ùFC>\916.r\8aÎ>¨N\9bBÆk\8fd\ 1Ím\vj\949¸Lh\11Þ\81\8b©M#,¢l\8aP\89í!\16õ
++W\e\ 2\82¦ï\16C³Úî\1aþ%ú\15\1cå\97\8cBàÉáÍ?\ 4}\14­<\83£s2oaz ·\ 6»­\96ï\1dÏ\9dÔ LÈѸ0¸\9b\fg\ 1\ e\9aÊ\11G\îûûE¾ëÙmÝ9fðÎ\89\86C÷ùË\95jqÉ^Ú) rºý\96\80<v£¯"Z6\993AÙ\12B\82\8b\11\81¯µ\8d¬\9a¬]\ eé\16.7 ñ(½kk½Ï¤\9b\1aÖ?°k\1fQt¹QÒlæ/jþ0eÍ-Ö\11®_\96f>Xc\93f®É\84\ eÝ3I\7fÖz;)\ 6Ôß§c°Ôo_\9d¼>L·\8aîÌL·\83\9eôб\ 1\1f\92\17Ô\\1d\ex\8a\9b\18\1e5Íf\15?\1eZ#¤p\8c«I®?³vY\1f~_í*Jú\82mB@Í,õw\9dâûO\ 1\83©ÿ#¤²&T\1f¶<[\f\f9\v\19âÂÓS,øí̲a"4\82ê\10}b®\950\12\ 4g\9d\84\97\926\8c\rk\90"®nCÝ\a\128@øÒo\8b\1f\ f|\14\e[o¿Þµ\19&\93qcÇ\9bo\1a\95C§ª\8eÃ3´kÀf\19\96Û                ÕÐ\16q\vÿ½\10µûäT@Ú5\0Øý\92Í\17§vpL_ÚSÛÕ*²\95!\a\90Zâ9«\ 4ÚèG8\13\11\1a\8cßêK¬[ÿMê3m\19äq\14Í¢¼\98Ù\fûð\94¸A\18V    \vȶ\ 3G\10£\r|¼mP\96à\rNDÂw\16ûµìqTyʰ©7\ fHs\bj"\15ýBÜûwºý¸ÏÞ
++RË-W¡×í\1e·/Û8;~FÓ½Yx£I gÉ\19\12$¶P"K+5s©&¢Ý'>ûì#Ñ\ f¾H\17j\96\ 6z\88ÁLåeó\12\10,0aÿ\8aÓ\11\8c\16ÿ\ eè"{\82hÄÃÂ\8ccìw\92®;M(\87\19\v\1e7\8eÿä\1a¶¾}¼HFÄ×y~\1c0\97¯-Ôæ@fw\84
++{\86^\85^y§_Å'\ l×G\11²µaÿ\9dR\8cÿ
++\94\81\1d¥KhB¬`,\9e<0<µÎÑCï\95\80t§O\94©Ym
++,pP&d9\8c¹?\aÙÒ»\ 4\17N\95\ñ³¦t$Úà\0\8d\80Ú!¬'ç[»6ÿ=£·zX%¢×Ö\e³ã³ñÁ §íÉN/·\85{Á½µkÂ\1c\16eÂQÅÙ v/r\97¡Ó欦ÙD¨Þ¯UI9§Ãi±°\ 6?\1dÆnù4 \87\15d\1c¥u[ùý\vª\9cK       Ú\90\9eC|£f\16ܯ«;B\17t³GÂ\13A\8b&ØÂ\1f\84^\ 5\95³\87¼­\15ÙíV\8b\92\9bqÛ!(OÚÚËRD:uô¹)\1fO¼r\10YxWr\840Ò}H\ 6\ 2möw!s[ÔÛ'e\91À\86\9bw\80l\81     8T9c¿\ 4wu\96gÞãÌVK\98ʰ\19\93ïß\19\1aä}\e´mÒx\83ÑáW\ 5Ð\1a\ 3¡·\ 2å,\99À¡\ e b*]ÞÖ\8c±q0m\16Ña©HT_¤0|9QÎ*)±*o\9b\8bª¿A?G\86\1e?µ"]\81Æ¥§ï#\9eÝc)\87=<\8av\98\93Á»MÍ\15Ѩ^Ó¿Ðp\82g\aíH*£®\98-Û$=]\8e]\v\8b°ÛG6\(À\95\83\9a \1c\b´Ð \10\85Î\11\aÙÍ÷Úñ1\87\84¿\vWɾ¨±jë.e\edFzêR\ 3\vÎ#WdG\96\8e½\9a-\ 5\1f<\f~\19\ 5ÀJ\81\ 2\8f\10\96vwÂO\ 4\15\f0+À8Í\ 6\1f$<Â\uN8GÁ\88{\v\94£¡rëA\8cXÚ5v\1eù~©\172J6ÌÐ)c\9eSç_,­¦1p\1e¿1P)¥<ó\16©f\9bàS\97ZwçThé27\8dù+\7f\92Í{\80kþÕ\aÅQÛ²\90ÂÉ\92uÝb0\82\ 5©\ 6  *\86H\86÷\r\ 1\a\ 1 \82\ 5\9a\ 4\82\ 5\960\82\ 5\920\82\ 5\8e\ 6\v*\86H\86÷\r\ 1\f
++\ 1\ 2 \82\ 590\82\ 550_\ 6 *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10`\r\1aÇu\1fåß\98ú·\9a\81\\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10DÑlÑAdwÓìT\8aÑéì»î\ 4\82\ 4Ð,\1a7áCv\e\17ÅA+9Í8¹á6\118|\0È&òÊ)ü\81Øp"\99$Ö:K+ß"\aÜ¢%q&\8dûE¬P§ÒÂÀ\a\85¿I'\^¨\14\90U|ÐãýTåoè̵\8fw_òÆñ»\ fr°½.ÌYß¾ÑFëk        s,\b'Sa$\8a\eO²wZ\rb¥àk;Èñ.\14ù!X\9d\a\86j\814
++l\1e~uï\9bVA\99x\18yoÜìï­\8fW\¶Ì¡±Þ\13®õî¸D
++ÕÜH\ 6  >\81>\81©{.\88­\1c\13\15q\ 1b\94b3'ÊôÓ+&\12Ôú\0\12E«¾êÙ\83â'w{Ù\99\93KJn\87\95´\14\\ e@Ççç8\ 6ë\19ú\ ev5@Ìi{ʸ\8c­Uô\8c£E×Å\1dH¯[\1a@fZû\8eÚ\8e\ e\99Î]ÓFÓ\1dì+ªptø~\80çð\1fIc6\93\1a\11]p\82­mö\9b\8d\1ad\97¹¡/I*ù\1dôïfRg6\eå»\80p,wîkîËÏÆøöwô´,¸ú\9eË\19ÿ_À\82øq9Ë=Ê)d\89çK3\9c!\1a*Ù½\83\ 5ÛÄB~ô\884\98\8c#YêÂoI|\88b&\88x\1a\ 6OÞi\ 4ù7^©;`d\1dùÒÃÅ\84\94F\97G|=ÈVëæhCÖ­\0\99\96(\89'a\9fmtJ\15Ðóþ\95ô\aBÀßA\80Mؾ­\9e\82$\90N¸ô\9d.1¬ê\82\ 6\9coL£ËªÇhïÕ£þë¸\1d\7f͹\88\15½\98\12ªs\98\99\e·¤#ª©gR\96'­¾0/p/\0'kým\9euc6ì¦\ eÀ\12ðû\92íp\âÂ`\8b\16\ 1æÏú\81\94\8f\1faI\84þQ~Òr/\9e¼\1e%\9aM\1dvV\9côðÝ\85¼\8e\16U\81KRi\v\ 2S\11\83\r|â³\89 \99W/ßÉ?\1fú²E³Ö¨¦\8b\92,\88\10Q{y¨\1e\95ù9A\98Ô\94ô_gP²­Ëk*ÏÄüp\15\80\18ë5ö\eº\9e¦\98Ã\ fX(¸Â/à\91êt³\9f\87ª~f53-N-Ï\ 6}"Ú\91­Â\91\1cm\fÏ×EBn«VP\96\1e\83jª°Kôå?\v\r\v\98\14ÔÌñ-\90(\96w\8fÿÒáÞ*ä\99\1eÛ\91\9bÆ?hL\989uî\ 3°Ia\9b!.£\86ýð[\80§È)!Ñ\10ID|ÿÁB~l2ù-Ù\ e»¸\8bS\9e²\85\ 6X"Ã\ fpt±   \9a\9aÆÌe÷m¥¯D§ÜÞD*cä²]´4¢Â\f>\94\9c\1e\80\9bg¦-é\82oÝ!t ô¡Ý\99\f\16Ý\10\95,,\9d\8fùÛ\7f«\11 ¢õs¤;7\8cð÷²Ke6ªÁ÷ý¨Ùh6?
++\99§\94M Ök\82ñþv\81J\1f\9b\94fâ¡m\f\12îDR     \9aS\1e±Îª±\bѤ\80È\8b¯¯«nÅ¥Vüذ+\1f\11\8cir²ÞDÞWFÖc*<U×\9cÆ/ý\13\1e\93:l=gÀßP°\18½[<ÿ\95
++^I!\83g,w\19G¬©T\9aU\ 1\83áL¥8Òס\0?\1eºZ\aÃ\80ý`©\81µWZL\11#_TÚwsZjß©a°51\8a\ 2íÆÈi5-<3ýw»b\v±1\9f\10X;e+\ 4\83*\1e¾2\80m¹ò6û¸ÂÓ\84Â×¥Ê\ eW`:q\89#¼)\rÀµ£\17\13 ÍQÑ\90tçÝeº¢W\842\11»\95£¶l¨_Q\88~\f\92.Ý¡Ì$OÚ\v@\88¤gtÃ\89.\ 6¬1h\98\15Å#TÓõ\8fq@\ 4¿^Y`é\83\96¯«©l\1d\93\r\90Ü®D\9ev\18g=G_D,\8b\8aE]\ 4b/I\82gÖóÁJ{*ÁYøÏÍ\1f³£z\90MÁÓ\ 1g(j\9b¬
++\9e\1coO+>ðýÌÉ\ 3÷¬þ\8bÙ\89ª9\99Q\14C_\1f½ÙyÊ\ 3\8f.I\9fcªµÈqO\b\99    Þ1B0\e\ 6  *\86H\86÷\r\ 1 \141\ e\1e\f\0s\0e\0r\0v\0e\0r0#\ 6    *\86H\86÷\r\ 1 \151\16\ 4\14\94@y\94~(\ 1\89ò\95i8Å.qwB\0\fg0A010\r\ 6        `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 g:\ 3\89P\1dt\1d\1cäu\ 2­\15su\8aßé÷ÖØvh\ 1Ë\1d`\82äx\83\ 4\bÏ\18£y¶ZØ"\ 2\ 2\b\0
+\ No newline at end of file
+diff --git a/examples/puma/client_certs/unknown_ca.crt b/examples/puma/client_certs/unknown_ca.crt
+index 5c50d8f..4b07a87 100644
+--- a/examples/puma/client_certs/unknown_ca.crt
++++ b/examples/puma/client_certs/unknown_ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDEDCCAfigAwIBAgIBETANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI0
+-MDgwMTAwMDAwMFoXDTI4MDgwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI1
++MDcwMTAwMDAwMFoXDTM2MDcwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
+ dDEUMBIGCgmSJomT8ixkARkWBHB1bWExDDAKBgNVBAMMA0NBVTCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAKh5VmSGmeN97MEPb9Td++UYcWHhYVj+yxi9
+-leDzcLpAgqtd+z0yBYCS2ULRQqomf8uIYODEuWxaepVNjjRN5Y22Hzlodnp+kJ3G
+-CXQva6GtwxbTIxyZ21Yn8APPgb7OTHZ/js1EhZpJUSjum19PnSS8rPfQRkr6m2eg
+-HKDkzV3jrJXTpNdvUhTi2NVVo0vNzLYV5Kj45vqirlTEesLxdxHtDNx8vanYHaJY
+-JY7OryIJhPsxKYplSbQ7ydJuHtpx5SiFjRckw9ddhRzGjYsAQFE2eVBPjhiYJnDL
+-tmEnb2e+tgRNiru9ttffpfzN4EG3/d9qnyZV9nua03yn+tqe0sECAwEAAaMjMCEw
++hvcNAQEBBQADggEPADCCAQoCggEBAO17pO0lTeGMVgMplzEn/4IdsVQXt45z1MgS
++3irQEGPfIKkZHnVdPElJnag3pTg5bmFQ/yPOEdbP04Ao8/BvCgvUO6jqkTR9aic2
++PqnlXbTPeHckjskihhcbcr+ZKO23dBP42U40E+6TakZponUsZs/YlKE4pKUfjsYq
++btVyDxe0SQWxSp85XUNn6Sd2Wm274/wQtjjDdMeMtYANqGRJStKG6qZAe9bYwOlw
++UFddMu2osIV8i5CQcmJnkVW0MagUrpvGZSni6HO9i3h7Y63r+d76NlR+anFPz4+l
++kZKBugfWGI6lC1rSQ7q85ucEJeqSJN77dHGRyNITy2+PrYGcNAECAwEAAaMjMCEw
+ DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQAD
+-ggEBAAp+1M6+Z8T/CA+C0288CRF27tXKn5Kd5Iffrx1Dg7I5HrFGJl87tkzLRoZi
+-MKj+FfpF7fJ/QSyQt+UZa53R2vmJig6JUEQwfzXc5Bp+fusJgmkGPZQ1A5tnbwCZ
+-TTuyy8Sy9reCWdJkmdDWyK3ah55mjiuOwZ+woA3RAoC9vCRtIT4w08NqrISBYp2i
+-NeQCv3gooiQrbJuCUuo56Qm73juJ4T7GXElRMF+SupmhC2SHwFVGAbu0/g6Yc+ye
+-i6/T36t/GTT0fG3kKfGfFMq3NCvY3WI3vcPzYtK9fN8QYVy3LjdnsjcTV2L3SaxG
+-3fYURa9nn7mrxlMBX88UWLUIPlc=
++ggEBAOgqzVzIQwZAtnhBhZ52J49MQzw7e0jlUoI0nSBNcT1QckxOGNE2jGoh9gHr
++Ti1VlesIEO7v5IXAyDuL66sOWPWzmPdU2uKDoWmUE5ry02dJu4W2OoueTCQYilAg
++vmaPXgH6GySOsazj1LK2RNkAzbj0Kw49bwa4vOxEnrkPCLlZBonEAmMnhOh0t3iP
++TUk2wMTnSJrJ002xDArUQol+sjVXGktYWT/bReERDBnGA6opFqtMVap48kGqgCOV
++6lHEEOg+F86ubhM0wLfdpFp4j4q7aAFQTtapihnLlFXMKiz9imjpuAWllSKh0owP
++ZDowdJZgG1trNkK0oMgfICIYKlk=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/unknown_ca.key b/examples/puma/client_certs/unknown_ca.key
+index 830cd91..06e0f03 100644
+--- a/examples/puma/client_certs/unknown_ca.key
++++ b/examples/puma/client_certs/unknown_ca.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/unknown_ca_store.p12 b/examples/puma/client_certs/unknown_ca_store.p12
+index c74c940..04afb8b 100644
+--- a/examples/puma/client_certs/unknown_ca_store.p12
++++ b/examples/puma/client_certs/unknown_ca_store.p12
+@@ -1,10 +1,16 @@
+ 0\82
+-\1c\ 2\ 1\ 30\82        Ò\ 6      *\86H\86÷\r\ 1\a\ 1 \82     Ã\ 4\82     ¿0\82     »0\82\ 4\12\ 6  *\86H\86÷\r\ 1\a\ 6 \82\ 4\ 30\82\ 3ÿ\ 2\ 1\00\82\ 3ø\ 6       *\86H\86÷\r\ 1\a\ 10W\ 6    *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\16\15ZÃîï\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10\8a\97I£i;Ã\v\1eå ÖÒõ\80\82\ 3\90\f¢<j   ù ËÏ`òB©º\98\ 5áÅ\8chÒb\97¬Æ±ðe?î\rC¾V\86\153§ujÐêéße\rlK¼p\eÑ«\8b\96Ì\1f\v\9f\9d»       ÒðÅtb)~½Mè5@òö¿ð)v\8c+?CE¯\e\15\88\aÏè¿\1f_4\r¸qlµê]j~¤)ü{®«BÇydÌ\9fmÍY\95\82\95i ³\9a\1f\aÉO 6\10\vICx7\10´ãºD}\81Iµ¿­/n"%\fµ£2eßB\vc{\90
+-\87\ 5\7f_®é[\fÒG\ 3m\14itö]æ9$º\0Îò\v¹\13¤ý\86B?/гl\89ohø30 ÿýn¥\168yÍj×Å\15\8e\96<C\8d\9c\80×yÆÅ½ü\9eû\89EòCA\ 4\13`ØÄ!\96\9f\9em\a\89ì®C\ 1z\82ï*
+-\84ÊÚ)\90f\82\18\99DÏÀ\va\912t     /«P\98\8f1\94KW2­Ç\ 1´ôC ×\ 1?\0ìã³±löÊáþ\98@Ð,ù\1a¯X\rv>vÓ¯\89T+Á«\8b5\10@1\19õì§Åh|\1e2¤¸       dV\15ò3\89¨¬½s\aiÿ±èT%Ç\99ô<M\9e\87J¸Mçæº\9e¸jKí­ø¬}\9c\13ðþº Í\91yÄ:âC\e\1d´ \91ÒÆîûbÏD²Åw%\9b\rë\15\11c¸%´\81?Ü¢æÏeM*#ü2\ e    K1)µçVpÉ^n\94\15E\r\158µPQ#µ\9d«íïÆûá\8a§Ï/\1e\v}¥±±û¨\v¥1\90/(\aÃ\ 6àÜ$\8b\83\93ÚI< TI¾\ 3~\8bå\14\ 49\ 2­\vß\95øVXÆ\bôZÃnòp\ 6¡\93Ó\95¹!
+-ñ\1a\0æ¡\95\1axKónó¦\9cö(ÇØØ\87 \bÎù\15\8aðÿõ8ºÙÞ4%öü=A\96\93ß(¾ày\9a¨\86¦*\9az\9aܺ\99xsÜ`\ 4`ôRBBáÍìÌ{øQ(|Á\95<è$|\8e±ñ&*.¾ëüX³õYYþ@%Á\82M\18u§VW©\90Å!ÑÃ\ 4,\84¬\18åÄ,ÑvÌ\99=\b\9f(\ 3\b\ 1a\12Ú\1eU\16ürx\0\8eíäæ@9BñJ²\9chdDÜÞá\92Û\99\ eÇå[É?;N\8b\12/-ÑäÝ\8bÜdñ³Ý\98\b\1cÞ´Ð\8bÙ36ÊgI\19­°NdF\ e*ÐyÇyÖñ>||z\ 3³\97ùvÞHY¯\95\83É}ö5\ 1áþÕ\10ª\1fàè\15kvÁë\89èä¶_D7|\88,ÌüpX;ÓBwáAPè¡\91Î\92ê\12ç'Ö(æ\18\xÐ\96¬¯\a\98\8fÍÞ)rxR´ýÛÌO\15\92RrU\ f;\91;«`\83L³pyå3OÌ q+\1e\10\8e\ 2w\80\ 1AB\9dY×M¶®\ 6#J</å\eþÊ\eu*Ñ«\16s\8eH\84<I$\19o\93ªCò\83I\8bñh:=±70\82\ 5¡\ 6  *\86H\86÷\r\ 1\a\ 1 \82\ 5\92\ 4\82\ 5\8e0\82\ 5\8a0\82\ 5\86\ 6\v*\86H\86÷\r\ 1\f
+-\ 1\ 2 \82\ 510\82\ 5-0W\ 6 *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\12åA×\vú¾\ 1\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\101\10îøe\87Ùýý\85ZÌh½\14c\ 4\82\ 4Ð<ÖWLg1\9eï±V§\ 5:ùü¦ø\93\14®b¶O\ e\84MÝÑ,w]\ 5*$\âõ\83íÃ\18Y\b·±\88\7f\83»\rb}-\19\7fäLÄíI¸º\83(ïðÇ\85kÄ­(Eµ\97\85/\8aN$p5²£DncðLúª\voâïò\13%¬Ö¨~\0t{\1fjs6ÖgÈç+ë\1dø¢üÁ,àÀ\9fõVsJ\82\9e\86µcËeì\8a+\13\8bi5\88\85&\1c{ÃM¢vuzÃÇÎVHêH\83\14\81^\9d\17=H\8e³ÍÓá\f\90²\9cïüÉ\89'F\0öA\81\90f\8eÜ#\85ºu\8aBM]Ú\9eë¼¢
+-`\ 4¶ÿô\ fX0-\1cÒêøß\ 6á\83eÊÿÞ\15«f\97ÀGf\86³8P´1ª\9e]Û        ]§A/ü\8b;VÁÖ\9b(¹]Üm\9f¯úÂN0.í\94\19çÒ¥\ 3)dm\ 6FÍiÙ\92\10*"      S
+-I\89¸y¾^þ%+\15-}áªwOç0c#\r`5.*µ \85íf©rC¸äy\8b0sð*3\87¯\13\93#½¨ÔI\ e-\!Q}«®zû9,ÒpA\95w\eÈ\7fÖ*\MÎ\17ÃO.ذ\83Â\97±\86ÎÀ|üèáÆ®\81\14Sk\r>\8b²\86\19\94¾\10Ç\88vÄõç\8eú6NÁó\8f\17R\82oO¬#¡ç3Z\88)ë{2¹¬`­\ 2¢^Æ¢£¹Õ\93KJG[    *7è \b»\r³{`\86G>fd\9c\154\8bÕ+)Ô\ 4Á§\8d1z\9d $ûVÀmÞ\85¤\92ׯ\ 3}Âòƾ1r\99n¦s Ù[H¢¶éÑ5¢Ü+6ð!,¹\16ãý\1380-/ã¨\v¥Q~&ß\ 6ã5\15þÕäÍÕ-Ç®öÐ\ 3u#nzn.mÚ±lÐXÖqÈ\ 6ÎÀÕÜg1Þ°»JÇ\81\12²J
+-ãjöd\80ìVfÿ\17Àr\91ªÐX­´\82`ïìâôÝ\16É{\992âìsï&\8e\8e\0£Ôºj"º6\1aËÖc<b\15뮬\9c\eBäè,>\15ë3\16\88p\9c\0\91Ø\9cTú}m\87ìÐ/DÒq_/`ñry\12*H\18m8æô»\13¤`­±×\98M·c\82ÒÌÑçÔ\rú#¾ð§Þ\r\e+kÓA\11\9dWù(øî>Vi        \80\1a \8d² ·Rûì2Ý\8di1Ó¶ÏêUørÂ\1f\ 2T\15\ 5%:H&q\85jV\81Qr[®6\13P©O2X2NL\rQ\93\8f?b¥³Kg}E\1e\1aW\91\ 4\9bÍÚ±©ÜÃcÓ¶Cá]@*\e\8c8óæ»Ü«ÐYÅÒïþH9¾\89ÉAv@ãMɽ\86\9b½Í´*ríöÇô\83Pf¥/ 7åÐ\9dm8ý6\vÛòÝûâoª·¼ò\8e»XjDg\ 6d¿³'Ü,yiGà]\8cp~ù¤üûåÇM#]6I³[\91X¬ïe³\9fç\96\8c<é¡;uþ\92\0òÛrý³Øbzíó×Îd.\1f^¶'\97\89*~\19õ7\7f<'»\aWçͶåÌ\89AýÏ­Li\r{\1e¡*\e\8b{\f+\ 5L\88\ 3at\ 45IÄPÏ\ 5!ÔtׯãÑW%\1fã\ráf\ 1\ eíîËÎÁg<\10¿ø·\87$(5\94C\9cã½\8cAµï\11\1eÚ\9cN\96\11XNón2ؤ\91\15¡¨±àé+\vä·?ß\85ÛfÃqf*ÙÌ%2ë\8cÝ\87\96Wg·ÙéH\1fçE\ 1"g[È\18\14R/ñÁ\93C\8bÂ:È\8ax\85Ðï\86^|SO\9eotʧ®\9e¬ê\85®Úm\ 6"\9f-xôö\b\8c6z\89¾v¶l\19²,ú]Ý\84qµmøøÑ\ 4 §½\b\f´í\b\14"f¨ \17\1fè\91á\1fÙwMÈ®g\93ç\9cÒ´r\ 4<'\84Àk^\8dÈù\ 6Õ\vÕ=\84\ e\91&·¦¿ÓΨKÃ\90\90Ëa@1B0\e\ 6      *\86H\86÷\r\ 1 \141\ e\1e\f\0s\0e\0r\0v\0e\0r0#\ 6    *\86H\86÷\r\ 1 \151\16\ 4\14=¼E
+-à\95\17ôÀö\80q/õë\fÃU\82_0A010\r\ 6       `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 ÕZì@øÕ1ÜõñGíUqÙÍ3=ýÜ(½\93\8f;:>É\86×½_\ 4\b\93Éù·\94U\82Â\ 2\ 2\b\0
+\ No newline at end of file
++,\ 2\ 1\ 30\82        â\ 6      *\86H\86÷\r\ 1\a\ 1 \82     Ó\ 4\82     Ï0\82     Ë0\82\ 4\1a\ 6  *\86H\86÷\r\ 1\a\ 6 \82\ 4\v0\82\ 4\a\ 2\ 1\00\82\ 4\0\ 6       *\86H\86÷\r\ 1\a\ 10_\ 6    *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10£U´\0?¸#U¥\9bÌó
++ãÒA\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10\b¤\99\9b`Õ÷q\8cÄ\ 3\9e\83\9e\80\82\ 3\907\15"Ðÿ]\14M\99\80
++!@_
++òÂ)\af\ 1Z\82\9a\a$+\98\8e\9dö&\8cÂv³\e¿`¦Í\93Ævxå ÝªÂ¦¿°Öu\9e×S\8f®\9d-\8c~7^
++)\10\94:eÞÎíA\9c\8eØ \80\9a{m\18bè×»,\8av+÷k\91uÚùÂBQ\a\1aBÕïg£\9c)¢ÝËñ6\87×\1c\a&fI¯È6\ 21\ f৤\88¸\89²Dè-.ån\15\10\ 4²\v\ 6Y"-8\vÎÈç\1eæ7á1»\17\ 3!\ eÓV\ 3\91ùú\1d
++\14¤f\bÀeåé\10\1f\8e{d)ñã>º_×.xqÁ\f\1a£þ´Vz\17¬É\97zw9/Õ\ 2|\94±\0'Ûn\90\9e\ f³¡±_\891#IDH´\13·ÓR.\85(ãÍ\9c7ÐVÕ3
++\95\84\13Ù\86ß¡\80\ 6QfgÏ¢-\1aNG,
++Ë\ 5n(\1d¥k~\81n\f\9bdEívkTõ\9e2æÆfìEìÈÖP"lm*\ 5\90× gªH¶?\7fÑä/#\bjLá\88¯Q:þ §Ø\9a}º ½e\ 4aÖ:f\18\18Vô<\87f\10\13côÀ¤³ÕÌ'2\ 1x\ 4\95Ý\91Jo`\90é6R1÷\9eÔ½ðà\8cÈieú6á\92LVe&ß<ù\18\v\83\12\13\9e\11¥z\7f®ÆïÖâÞ\16¢/½¥¨ÊÒcõ[å}W+$¼¥àÎ]2Mh¯ >ip1TÄ\9e°\ 2\9eA¿ì\ eèÿ÷HY\16¶NîYá\8dB}ÆÃj©æ×ѬÎ\12ì\8d\11\8b\11\82`\vì\8eh\8f*_\1e\18\e»â\88V\ e¤     7ôÝ\ e|÷&\96\90+µ?÷¢¸kjü;\11ª>z\ 2Óæ\1dQ¬Tóz\9dà7\10¨j\9aK\92\7fÞ0\rÛUç#\16Ä\94\83ëáëàõ\19lEx\16Ñd\83h{\12\0¢Â\10\vd¨f\\8f{R!%\8f\14xv7RÏ\ e\8e¿IYz.xÂT\ 4\ 1Tq5ñ\89\8d0h¸0·.\v\83±ÙÜ~±»)úb\94\1ePBH\17ý\aí\9aÖK´\81juBj[\rÎ|m$¾£*\87­¢f\9aéd\13@\v\97\8bÐN4´Öè\8bý{\9a\92Q·Qª68÷¹¡ï\84\87\9eÀ\1dµ \ 6+6ýý¾uÄ9¿w\89K¯<ô¯¬¸ÖÏ\7fE;\9fÖ?pýÕ÷\8b¸q²±¥\8b\f)óCª$ö\ 5\11\ empãb\91\10n\8fêÛ\9bw\1c\85\10µ\r2I§o\0\9c\ 3.x+à\9fV¨²þ
++º\8b\9dØÝ÷Ó\1a\ f´OLÃ\ e\ euaÖ¾µþ\82zh\13\ e\9e\95G®åâ®3\ 5øgI\ 2[Q\r\8dî¯\99¯\ ecî \89ÏÕAç¾v\8a\1cÙíM\1a)\1d\97Á\1fó\12\11qÍá½b°~úÓ\86\ 2ÌÍt\ e\9c¨\1aCã6\9c2Ûÿ½\81?!­\ 3¤\15¥sö;¬\ 6Àêܶ\ebÓ0\82\ 5©\ 6   *\86H\86÷\r\ 1\a\ 1 \82\ 5\9a\ 4\82\ 5\960\82\ 5\920\82\ 5\8e\ 6\v*\86H\86÷\r\ 1\f
++\ 1\ 2 \82\ 590\82\ 550_\ 6 *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10Í4gÞsrPÆ93\0\16\1e\86·Þ\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10 W\84\84}GΫ×v\84±%´\rÉ\ 4\82\ 4Ð\18]\97\ 5@º   E2Ý×9Ëäø3t\8foèTÂ!d\15\fÊýÁ¢\ 2\9bå\ 497E\89\80ÁC8\90Ñ´\19ª\16\\892³±#8É!\9cÓÐ5X!\96Î\94É.¯¦úRÐ,s9\97Ñ\8eÛø\rѪ#út\ 1f\ fk\aS ¾A2z\9bÛãb\145ãß\82ý¶\8e\v\81É6\99\\10\1eþ|öü\8e|elo\85²ÅM\85ë\ 2w~\ 6\1d%\ fÕ\82g<\85ã¥Å,\ 2A\88¬+\1c²óCÚ\9aÁ\8f\97]\\8a\10|æÏç]H\14å\95ób\1cG7N²YzyýÑ\82¡\99\99fVJجî·>Ù¿ÑxRÜzl#Ô­OHð+Ý^\96\8cgX«k!tË\9dA¾4\8e¿\aÌhsTNØNõWPUpS*\98q§]gÄ®®\83g\8eAéÊÀö\98\84\84\86rÉ4X\1aE      -!\ 2\925=©ðí\91Ñ¡Þ\ 5jõ%*qËì²N`OOWÂ\93ò¾|¥\16î\81\8cÉn\9dÈv\86\11\ fó4«ü\8b\8eü§Þ×H[$¯ª|
++\9a\1d\ e\94CÛ§ï5J\ 3\13'¥eÈ1M$àèzheës\1a6ÜP\1d\ fo\92<H)¸\819<)\18È\8bóK\ e\88\0\89j9Ìë\ 5Y\1fÿ\0@\87è\10( hÿ¸¼Ê<W5=Aí\8aÜ\15\1d\91Â\ 3¢| Ã\11\ 5\19Åé.W¤I\92\18A¡¢<ïA÷\14)\91\17Ì#\82\r      \ 4ü­Á\8eG\8b
++\1cÕeJ\1ctÂÀ\ e]G¹²\1fåÒoú^\9f\9aL¯Y\99üc\99Èÿ\81®a\7f\9aZG\1f:Õæ\8eáý\0æò~\15$Ãüµ.W~R®Ð\85\ 3R«¤\ föN\83½\11\94oaÕ5tûHDR\96\fD\8dI²2\10^\83[[´K,k\85\et<ÝÏ\1cU\964\87r}\9dÎÂ.ì5HùÊ?Ö\11±Õ\97b\99Zú8ÞoÚ\91\f<PÆS\9eH.¼\8cê2¯\8a\1c\89ã%ö@Æ\8b\10$
++rä\85vÏø\1eû\ f     éf¼\al\ 5¸\13\ f®¹\90;%Ôæ\\9afÓ1÷8õ©è¯²Æmw·\9cª¿~É(üÒ\9f\1f¢Áç¶Å:\87dùh«qÀ\9cÜåx¡Ã½Vå\e\ e\88\87Ñ[\8a\ 6`e|\88?1\96â\9b÷¢(\96î±®p\82¿®¬\12\9cÅ\94²Þ\ eN7ô\84j\94F\93\19qe\98\ f¸c²tÃe$ù4%øu\ 5.%èNmPU+KK0n¡%Y&7>\8e{\94o÷h´}\Ê¥U!HêùPì\82\e\ f\13ý)\84P\93¿³øN±\91\aïêýQ~\1f\f\96\9a\1fáÊ\ 1ÆkÑ\7fÃ\1ca\9f,NÛ\86\82öc\87\93ÌÇþãÑ*8'ÒÆòNÓaÑË'lÎ4Ã\98HÂq\1a}=
++*®dû{ ÂIç¼\95\16\9cåä0\aDu\9b\1e\vpv\99\92ÓßXÇ"л?\9b-Ô¬"akÁ¶\15_\8eÄ=xÕ Ày³>w=ã°\82ä\ 6\ eG¢§õ\ 1Éhx\8b0]\11\95ÉsAn\95Õ\8cM\1ayC?H± D®\8f5Nºyr¬xkè\ 6Ãæ\91:«dGáe\94Åþ¤\160{{>\ 6\f§_m¦ØàR\b-;³p9¼54\ 3\97ÐÃ\ 5u\93ËP\ 40§c\ fÒÁ\94æ\ f7L·nºúLjv÷4Úõz\16$Cýt?/7\b>\91W¬¤\8fçf¨UÔz÷N¯\92\9f\ 2çÐÄêKø0ïpÞkÆ¢)|)õ\82\0\90\ 3\91TEu_'ðr«x×kÒ`\81\87\18?½ ¶ïuóê²:â¬fÐáõì\1e\7fϯDB©$´¼ð\11*/\83æE;¹¨v«\fY¢¢].\b\8d7Ë`\bË{\8a°rãÖ\ 5L£a\1dÂwÿ"rÞ÷Iù\97ãÑ       \9c\13;Q\ 2Dù,dáÆ\ fW0V1R\94LY(¦E1B0\e\ 6    *\86H\86÷\r\ 1 \141\ e\1e\f\0s\0e\0r\0v\0e\0r0#\ 6    *\86H\86÷\r\ 1 \151\16\ 4\14K$\85\14³\9e\10\82m(Ïð×
++8Û¹\100A010\r\ 6   `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 ÑE¯×)ç\13\98\18d\ 5\94kóɧ\90\84ö/>\99\ 3í,\ 2\10Épv\ 4\bª\15­æÿ\1eZ\96\ 2\ 2\b\0
+\ No newline at end of file
+diff --git a/examples/puma/encrypted_puma_keypair.pem b/examples/puma/encrypted_puma_keypair.pem
+index d876594..25becf1 100644
+--- a/examples/puma/encrypted_puma_keypair.pem
++++ b/examples/puma/encrypted_puma_keypair.pem
+@@ -1,30 +1,30 @@
+ -----BEGIN ENCRYPTED PRIVATE KEY-----
+-MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQISBM1VRFFvlsCAggA
+-MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAKCsPjHKrhK1EnlPvxcBeWBIIE
+-0DwRydTdGeqyWPblEhdZZYpjbCMtTEDucl9Non/a6yXAO+igJCSPRze5OxAp/Smt
+-iGk4LFcGTj/OlQWghqP0rBN6PPctjWRogh1t6hLfASBkmALg9Rsy5pnm103rwvJ2
+-s9hDDwavJ5guGFm6KE9Gd3ijbD0pd6JXftu3qry2jajsLEn0pkBFfTTotj45nMNz
+-ByONJcs9daHduSyKmn6LimemgzK4ylRwjaycwIqmByNbN9psrLDYvgSndeDCnOk5
+-x1IwDzzBJfprjgc/ldQ+XKX/7naVN4KXiQ40cUHCzZciZzzx1M1GPk5zJlJavSmT
+-BZHbTbj0M+txYArnxExBjaaA4mc/fk2JMhgJ4eWU4UHJMeS2dE7l4rBLDusmRs/r
+-lG4zLEeK1vlSb8pxMIOkbm699WZQJyzcSF/RmyvVUVUJFt3swm2duWQN/8U1U269
+-uqiORRShsPaIXtGbdyklhMEVRb9jAB9nkvx4H9SYwT/YQU4oebxGZGWP8LctXJMi
+-aAfFAQWs3b1PWBJ0tZee+qjmzevsQ7CdDPfVfvMz2YHGtcNgHljQDnkehFsmrp/w
+-ulPwSVe3pOh9ce2Y7pIejsm+V8a/AVdpmgPGslWqOjNPdUHwBbg3ckuGV1TpuCK3
+-ku6QR65Mpx1+MBBa+P49+7QhCJXQk63F8rAc1ms2ggIDAbvf7K19UCIngiqGGts/
+-srlZMRB3dd+2U5CZ9jr3FC6czeb4mqFuDD/TZFnupvQ6f27ho+6Wx8DhOLGjdZYt
+-kwKMbvI6eHjId5buFApcShQdkkv6hQq9smrgvL9OpkVCjT2diYnxeyH0nznNDPyE
+-OUwqZ1lcNT0BKtv1EAirt7oRM8uK1xKgJfWCB4FVBaz7yBAE+hW21hKaJxU2hm+w
+-u6TKBtEg7YVCF7VPadT1tfcPUaO3MtGZ80iesjgi/2+zNC5gr7595KteKSJoC5pj
+-pI+HM8Yx0YlKu/bYLkxcltQEdLoMqjk/Zk+EruNvS2j71pvNRpIQ1qhVBH9P11G5
+-xMebXxiG/oDF3XTdbM54+yX9orElyfIKmAk8lz/YmK+9OpW/SVmFv73owJEvEvxE
+-fZgEZmyavG3G+WosaJBCBG5blSRY1f68DeaBrMqZdYyyw2YC8q22xZW9u/DyzkOI
+-IPafwTStUDAl0CJnNMOZIG144QLUcR5YI5RBinNC7qAvcXd+bZPH0mhzP2nWt1A/
+-nB6n2ar71PkRh9/uv4j2ySD1L2hmd98QAXBZNDc6CGfgUYqY5LqUG+XfgHKAjKiH
+-ysRzv5867WwqJoZ98YOVTqVpm895pCaJwg2BWTCX3N3nxuLkPDEUi1Jy5r5BsMRc
+-cC1LDRZM+9+btOBU3DDMp/37V1EqGbh40waBJBJdRZ7V/yCwEgi4ioLc9Z5AGsJh
+-gQptVJXGzbfjRrxyjlu7Lim5XJOq82ARTwIIyDwEJaI1B9UREFCH594fze+4AfKe
+-ftFmibsBpqlaWBedYCpqBInK9KcRLjXf1L6cA2yRto3I4JP1jKo1vMSa4uVTMft0
+-hHa7L53vf6+jF0nS3EkTk80PcMET9WyC5LeafSGn5MqYa7XepVyu7BF+WlSH61uO
+-aDJls27YgbLjkGRh9NNETCafXGRclSHag+qHNk92c1vC
++MIIFNTBfBgkqhkiG9w0BBQ0wUjAxBgkqhkiG9w0BBQwwJAQQ2oLhM2tsjfJ2LsyE
++umcdzQICCAAwDAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEEIB2uyOufJD+f4G+
++/OpWEMkEggTQCsFpb7qpvSYQjqfTuMwL07nsYX/S6eQhwoiiuPi5LkKABVtWZewh
++CFEYtdDTp99T44/mwE/BJmoPfptxb0ukHrOGe1ppSl9ZdWaJDS6kPiGuWEvQNLGZ
++tX4FzeGFinNY8MfefICwmetDp5dIpYtWm/+WutInBqQWDAG+Yi/7a+L5ZLDlSZfD
++AwS+ibPdLFzkdziyUzmXeQYRLY5KkXF0SmezAdjOIvqVLw0vFc6rujY4rV7G8EqD
++jZ43et94DM28dXBD2qF1TWMT9/N9ikunlMNDAoPEu0thYywNSlmpGUsVB7bctwXI
++YiO+mRWtLvziV+J6fNs38t6eOsn31Wg8uMkYN9ov8jiSCSTNIsh3sygKEKAnp/j3
++5Cu8rxGbAnbt9YssFUrYO45akYMOh4zTEUSsv5Csrr77WFdo6s8eR6K4D0kpAzNv
++6PM5rxYVlA9m5azVAiPucI27Lfam6KDD9BQ/DBjtOGB0IzC5ZyBq9CwFnJ0TlWBS
++62Y9LrtVM5suLtUPIRCsaxwtKSTefoRT5OzViJCQGkkMzKWCih2tLF6VkCgRSuVB
++wJWGPTnXSmL0J8je60REBSAwoCumyFK4aaOOdT5etIp6a498HkM9LEv3qfp9Ti0q
++osIJJC/wKZ2pMEMqvYTXqdaPh1EZ4okMRpXZPj43Cqlw0HdbkfKppaN6VLYESLqj
++HbQS3ZaqX1VZTjLBj5F5kt6xasqdnZgxRMOHVtMk5J4qcodYLAl4pg60K4vxszI+
++gjPST/1NICHBim25aTHh6HKafUZGCvNBs1UddbDz9TnieYeTyaFtPEYtmiKF7cVB
++LMacdWcnpAgFEEXkZaVPWwqathaazR74SdHrqWv66i1eB9C8ul39GXB3KTTnHTqQ
++WNQHQDIxkirCEYUMEHoSh+2J9B4bGUIVru8ErbgZZE9YUfHsDUFtBtS7MoOciFXK
++9ETcdY9qHgJv6Ewd6kp/klz4Y8j1WMGfsyCTQI4U+CNbcezt5rMnuXbFN59wLrzO
++Mqmh94lU4bUQtA15hjZQUQvvM/97SHZorp3diNxhAPyJiSn66tFVa6gUzqwij16e
++H36BXFWkmYkeOWnzk0Oggmm+WtHnWlJQOod2sz7sVuS2yjHE1MPXhuC/h0nJTLrY
++XHyVJnQlQlBRQcEvmS2hCW4qga22GRYYdtU63b1dtp6vtg2naKs4AoFFRKQy/psE
++AlIBfiy5wcxkbJcL6bmb4vifuC5Eqo1FqJimUEWYrtFzw0UVQWroAE0glt4j1rm1
++Ojs/JQZNR7FHswirJ0/UXTPhfSAplQW40Zy+dSFTIoCM4Jh+reWQwliilPpl8rIj
++GG9ZSwV6WoyEZrYVL7oYeKKSGG1lHWM1J4Vyt5cEqKs81HeqXkck7JINQNVFf3vm
++XZ1QrtM2C9Sti5WYse3S0U79ym5Ko65CkImHJohIfdSjWvZlQCv/UVFI2PoedLWf
++Q0YTSPtnHgF2UJ1cnobM8urrwqEjwLgAPnWWLXB4QW9vCpKjAPDwGAaav6gztUef
++NyUXHgkvbdkgi01c+/3WiwBnxsbuBoXsPDAIRnoWkmarFBkDkK3H3IXdKyHOKJoL
++pSgP0ZWwPBWk7B0LsoHYNT6uSnjMSf8GOr7xdGSTku+3oQVborwjrWw=
+ -----END ENCRYPTED PRIVATE KEY-----
+diff --git a/examples/puma/keystore.jks b/examples/puma/keystore.jks
+index e36f314..ef92af2 100644
+--- a/examples/puma/keystore.jks
++++ b/examples/puma/keystore.jks
+@@ -1,16 +1,8 @@
+-þíþí\0\0\0\ 2\0\0\0\ 1\0\0\0\ 1\0\ 4puma\0\0\ 1\91C\94)\7f\0\0\ 5\ 20\82\ 4þ0\ e\ 6
+-+\ 6\ 1\ 4\ 1*\ 2\11\ 1\ 1\ 5\0\ 4\82\ 4êÝ\9dË\9fmÍü\86\14\91Å\10\aÞ{\96ç\98ÚÁ.¼¡\82ºýû[9G\7fÍ}çD\1fu\ 1\8a¨\eëò{\80ÿ\98ìÎäÂ\87ÍÑ&éð\ 3¼)\8b\8b±\8f²Ìâa\8fß5v©Ù\1eíqÝlﳡ\ 1\14\9fµ¾\98RϺYÇ|\ 6\95RrÏ\86 úL¾v÷\ 5zô§Äy+¯`,ô\eÖ\90òJ19\1aJ\vß5ØÜNÏ7x:ËÌæ\15\92Ã\7f¸ÒæÍ´\92\ 3qõþ´\eÈåÀÝ`\13o2\ 3?w\89¬l@¦\80Ŭ¼âü\88§¨\8d§rÿ\8c\19¥±®hs¸\8dßÚ\85Ég£\ 5ó\1a\84ÆàÔas\8aé_t!{a\ e'=\96\bX]¡\ 3l\]iq¶¤ó\11~~K4°s94çl\90¹\99\be1À*Á\96BBw\ 5ß\95Cåq^tgl{\80îkº(¼Ï%§u\ 4©3\88\12úÂëjùUêt\97\f\92\0ã\9c9#\87Lgº\93'°M\7f-Êá\8aü\80¥ôû±H
+-E\11,\82?hcS\8fÔ\1cÒ±]yB\r\ 1W\8aG\r\1eäcİé;\87-\ fu\92\1a6\ 3\7f"\17#®Ò\11ç\89¤\82æ\ 4Ø<\ 2\82¼bô\ 5hbG\9f\8dd{fç\84æ$Ì]zÃ|å\10H\97\96\12\8dÑ«\aÍØt\97´¥ eã\9d\15\10'=?Õ:¼£6µJ[\8a\80»\16!ðSù³R2\18­êßp¡\ eÇ\1e±Ò²\85\ fög\90ê­\ 1íE\9b´iìzv\16\ fv\1c ÷¢:P\1eAI#\9f\96Ú\98Ë\84\16U'£\ 6\7f8\9bç¶\1dÓ¡l\8aÈ*&ln@\ 6Ã\ 6<Z\P!ÈIjµ\1e\94h4D\85´¦ÊAþÚ\r ^+
+-5ãÄøîº\e3×ÃÌ]Y@=¦¦\9fìÜæÇ%Ȥ1\10c\8c3j®ð\89˨b1ü\84^\e\96\1fåL\96=eª\97\1d»"À©fðµr\9aí\86%:2\8bô-Q=mß&A.\ 2åÖú\1dc:)X\95e~èÜýøs%oÉÏ:ZuåJ¢.4ï&\9c×P
+-¹É\1eàÞE²ÏqûFS\9d·\1a\8ft\92Î\85AÜËtrࣣÀ oa°G\91\17\97@\a¾x®¸Ä­Í°D5\16d\9b=\8e÷GFIwi\ 4ã¤A\87ÀG\14ÎI²ö=]'ö¶<Ë_\rñ)IKÀ\90\ 2u\ 1eÔvb6tÕ»Õ/\88\80eUZWÔYà\11\12\9e,\91çíæÁþ1ú\7f¸|)\9a³ûR\ 6Í\8eÞ\8e1Oºl\8bÈî\v\8eÚ\94ä\9dJù$]¾gê]9\ 1\89Ï\ek8Í   PYº'/'ó\8eøi\9a¤:G\93û\84Øg)\rÃe¸
+-ßñU\8f\88ª\96N\1eñ\vU\r>Ôî¡Æ\1eÿò«\ 3\1eÜ"|^  èÏCmn\ 1´M$<QÕ:TùØ6\9ec\9b\18\ 4Îe\9e\14\e
+-ÌÆ\14¾Wÿh±Ç6\1a\ 2¦¦Æ\97Þòý\93\15\f\aÚA\12\18ê\841¬t
+-\b@
+-\v
+-K\9e¢\83äVµ6ã³ì²æ\1d        Û\8d÷SY\#õ$LuÌõ°¡pî»÷\99\1dVñÜûÉ0\90x\80\ 4Ú×Ýå\v¡\86=Oë³(ÓiÁ1EW=º4y\101}eC\83Q\ 1K\8b¨ßüwnoZ9\17l/81!»U<\8f\1c£\16\87£}dobuéC9(Ñ\9dëZQ\94\80|þËÙO\8fy\ 6¤b\80»\ 5ôå\8d\8dÐË;Þ\v2²õ¨ª=Î]6Å\8dtµV\12®¶þ¤\13<ÒʽjÏ\86i\91îÞ¨Mð\ 1þ_¿µ|\87?ý=*\86fú)\12á_\\1a%O¬\ 6\12´uºá¸w\87\81\9cÚ³\14\ e=#1±qúW@a\9fLÿ\80\15j\92Í\18½ï7ôA£õïõ\ 1e*X!\8bo\ eÜÍ\ 2¶y_®³Pu\89èÍAîéÀk@^\1f\87\10\11EܱjS=J\9f\8fmg[\9c\15Ïý²Äé5}\ 4Ϊ\1eõ`IL\82\87õE\9eb¸ø\10\9a¸ÿ6\0\0\0\ 1\0\ 5X.509\0\0\ 3\860\82\ 3\820\82\ 2\ 3\ 2\ 1\ 2\ 2\ 1\ 20\r\ 6       *\86H\86÷\r\ 1\ 1\v\ 5\0091\v0        \ 6\ 3U\ 4\ 6\13\ 2US1\ e0\f\ 6\ 3U\ 4
+-\f\ 5local1\r0\v\ 6\ 3U\ 4\v\f\ 4aero1\v0     \ 6\ 3U\ 4\ 3\f\ 2CA0\1e\17\r240801000000Z\17\r280801000000Z0H1\v0  \ 6\ 3U\ 4\ 6\13\ 2US1\ e0\f\ 6\ 3U\ 4
++þíþí\0\0\0\ 2\0\0\0\ 1\0\0\0\ 1\0\ 4puma\0\0\ 1\98\17ðdÑ\0\0\ 5\ 10\82\ 4ý0\f\ 6
+++\ 6\ 1\ 4\ 1*\ 2\11\ 1\ 1\ 4\82\ 4ë&ä¨DÅ\8c¾"\91ìQÉ}Û\17ú\81ÊÅsâ\98ßíbù¨íÅ©³l\1aÂ\9d¥I\1dÖW2ó'ó\10²$\957\a÷pé\8fKu¤\1d9Iiz¥Íø\12\1d     ¼?»Ñû\f\99µmdö\9d8{®o°mj¬^1\\81ìö§Zg»±Ñ×g\ 5\aK\11yþ=êH®N\85®S+à3\8cëö\89*QÛÚMÝ¡ê\1ao±ËyÊnüâã\91¨U\96\16°YÐ3EæËÜ\16½`¯¹ÝÞ\8c\8c\ fÒcµì\15\15N¢Y\8a\1fwüNÔÌ\80¼ö~¤\16\86~äÁ6ï\eì2¬\ f¿JѺn½¢\8b\84\9e\81\a-r\1aÌ6+ßæ\ 6Ы\8e\94ñÓ\11\82ÊLtg\1eóëíçÄ\87 atÞ\ 4\8aL\84ü\88nz\1foýª\97ú§ö>F2RæµEÀkEî?DK]Ó!$aO/xÔ'½L¨æ2\10\ 6Û[r\1eh\f¨\9cG\9eð3ò\0l#ß\11\80Çh\ 6\8a\9d±m\171,EÆ\1aüÇiçË\16\87\ f½'\10µì?fð¥:ç\86*}8\83USúêZ\13î\ 6á\9eËwRàdã(ß\99\9c\rÒòÄDeQÆ\95\82%M<]xö#\1a\82\9ah\892\95\97Ü\9c5x[æ6=\1fyØüqsò9ÂÞ\1e\8a\9815\9a.\ 2e¤Ç\92à÷˯%jßi1ò'Y>þ\19ùì.Å\8d\98­ÙÉôîù´\91ú#\\7fûÛÛ|¶»ÎñZÌ2óµ¶ôcf©0M´â\17\ e\88ò8|ç\16þ¶k\18VZ}\11J¨3zÏ+hr\19\1a¿\87ìÐ{)XÿOÒ\8f\0Ø\1cj¾liÒ¿\91lÕ#ã¼Öc\13a\8d\90m\1dý\12ÐýFÐ\96I\ 5áñÚR\88N.ðÞ\11_¬5¤pËMlºKÚ7cãüÞóæ\1a\83Æ|7åRc= ®J\13¼áÑfOí½£!¬å=\89\92NE_\83µÈ¹\b\9c¡\16Ò\9eÇÐ\fó~ÓæMC\94\ 5\e¥x3â02Ï0D"ÑeE[G\8dN3I¢"!Åãñô\19\17\ 2\12£n\95ÈLþ°(+\88\ e0x°F#²W®¦\ 6¢Y0+(\88%ps5PNP¾®ÌÎiúG³°2êä6?hoHUÒ\1eDäá\eW¤ë\99Ãñnë#\1aÅ~\7fç©\88½êøà\97#<åÛ¼äp2¸õ\eN<±F¬/n\82C\14âg\18\1ft\84\98ñÈ1PZÿ\8bó\89U û;\92\1aæüó\eÝ\fi#ï\84J3Í7=í\8d\82xº$±¼·\8b\96\1a\ 2\9frÛQ\15\9bÙ\8b\rå"BØ«ve·\9cQáXÑ\[\ 5\80\bt\e$×QM@}@X%\1ao,Ú\ eØJÈ\16¡\10?ÐO\83\98j\1fë 5\87.\1fl@I\9c\8cyÀ,Cò\93$\85pÍ%gw½I\1f.\9c\1e¿@\98¡7g~6\81À]ðKÐÿP×ï\víÀß³¡%Ó¥«nÀsÇ\1d\7fñ\8fðµ9\14ª<î¿9þ\ 1n\12ÈÜýL\11&#)7\17õãX\fb¹ª\99àXK\1a\18Q;\13Û\fÒÕUÛêxköÈ0\14×\82\16ñ©=ÿ\92-\ 1l\1a¾\vt«6éöª\1e^\10@Ç©;KF\10¹\9b¦b=¸²ÈTî'{­\16ÞWô*Î\ 4\8e\ 1\7f\80VYt\80¨\81o\8aæ\85\11\80Ñ´Áaøõt
++VP\r£\88ÎùWÅ×1\87@\91æw\94F\f\13\f·ÇÞ\7f\11?u¡ã\ 6f;ÀÕD«b!ç\ f($éáÄÝLà\1fAP7)Ïó~$7+ļÑ\8dgÄ!\¿\93¤mí\81~\9eî1\ 1\9dàæ\1aÏ­k\90\12ø®¤:$o\1dõ\83½\97§u1ÌïH£x³\85\17\f\eÚ[¡= \8fHwÈeÈÈNel:nº\99\91¨·\ 1\9dk\97,\87üAK\86\17y{Ü\1c Ïܨ
++1¹\f y\9d¹\82T6(yç £4zÛT»\1d\14rθ\15\97N\0\0\0\ 1\0\ 5X.509\0\0\ 3\860\82\ 3\820\82\ 2\ 3\ 2\ 1\ 2\ 2\ 1\ 20\r\ 6        *\86H\86÷\r\ 1\ 1\v\ 5\0091\v0        \ 6\ 3U\ 4\ 6\13\ 2US1\ e0\f\ 6\ 3U\ 4
++\f\ 5local1\r0\v\ 6\ 3U\ 4\v\f\ 4aero1\v0     \ 6\ 3U\ 4\ 3\f\ 2CA0\1e\17\r250701000000Z\17\r360701000000Z0H1\v0  \ 6\ 3U\ 4\ 6\13\ 2US1\ e0\f\ 6\ 3U\ 4
\f\ 5local1\r0\v\ 6\ 3U\ 4\v\f\ 4aero1\v0     \ 6\ 3U\ 4\v\f\ 2CA1\r0\v\ 6\ 3U\ 4\ 3\f\ 4puma0\82\ 1"0\r\ 6 *\86H\86÷\r\ 1\ 1\ 1\ 5\0\ 3\82\ 1\ f\00\82\ 1
+-\ 2\82\ 1\ 1\0ó\95Í\93@bâ\97¯É8Ý\ 5ÏøUú$VyñþØ<m$&0\9f\ 3\1f\ 5\95\19%ºÀ\a\93»\7fÉ­p¶"\bÇÿ©bÌÕ3Ü\91êäÚÛ\ fR\95\87~çSøéuôÐb´Üê\19ì­\141ãÁ\91²b\9a\95ÞGÌCè\88@mÞ!-4A\92\15\94b![¡ó\88ÈB\14¸\11g}Dcf\8dÆ<\90\8avH¤\1d»¨\ e\19WEÌ\ 2\91\8d{\10M®r¸\fÛ\93\bâ\17p~b\9b0à­w\9aä\84 Ø\8dÇ@£ö²ù\ f'Ý`\96É©öÖôË\1aBgr6\84z#\12Z\10q\7fÀ$2j®baåf\ eÏO>`R\8d®\ 4÷®­3ð\ 2tÀ÷òº@|t¨\9f\9aĤ\b\19\93íÊàôuüsÇÜ\1fÛÿ\95\9bàÌè\12\1f\ 2\ 3\ 1\0\ 1£\81\850\81\820\f\ 6\ 3U\1d\13\ 1\ 1ÿ\ 4\ 20\001\ 6     `\86H\ 1\86øB\ 1\r\ 4$\16"Ruby/OpenSSL Generated Certificate0\1d\ 6\ 3U\1d\ e\ 4\16\ 4\14ò\ f"e\99\80CÁõ\9dF>¥Xkèc\8däô0\v\ 6\ 3U\1d\ f\ 4\ 4\ 3\ 2\ 5 0\13\ 6\ 3U\1d%\ 4\f0
+-\ 6\b+\ 6\ 1\ 5\ 5\a\ 3\ 10\r\ 6 *\86H\86÷\r\ 1\ 1\v\ 5\0\ 3\82\ 1\ 1\0Z¦µ3_çò4=¼âhÝ¡þ#ÃÃÉ\85@3­7¨\13XQ\v3ö!ÿCmÙBK\90îüo9~á¾.IÀn«A:QÿèJ\róò\bñÜæ[>\16/\8e£Ï£t\1c\16ʱF\L/\10\18ó\14ë(\13j
+-Äz,GS×e\90¶ßé\86?ZgÉ\9d0\ 5\95\83ï\11Âw\8da®NhýÉV\14[úîH\11´h&\1d\8dÔà¼àx]KT-\1a\93þB¾+\9d½2f(Åå\ f\80ºÏ\1a{ס+ãé>MKË1ôî®Ø\12\a\82O\16Æ\fÓ$VÌH\17\ f¡2!²\91\88$8\99u\\93\8b²\e\ 2¥£à\e!oa\89²\v\9d\9cè2*OE\87\19\1c\ 3\83ÜV\1dÙFád\15\80\ 5¦ÎkS>¥\1346¢S\8bÜ!ª\97bè4þn­_
+-[\95\88ð ÃÀ
+\ No newline at end of file
++\ 2\82\ 1\ 1\0·¬ÙæCÊp\92\8fÿ\ e\1cæÃG\85äÒ/5°¿nb/\89D\80Ýä\b\ f\8d¸æºÖ\99§Þ¨a3z\94·\7f?U\8b\ 4\13{b\95¾\83yB¢]\89éÉEÄ]'Jê\99\97¹° ¿*\9dÊ\9aXb|«\9e¤E¢X×ä}öá)ì\18\92\15\ªñ\7f\1e\8d\aqb(]˸\80/6±75Üaõú\99\90Hjn2Ò6Ü+ª6\9a\ e\93çø®¼\96<Ù®PùS0p$L>>ò]÷Y§\8d\97°å\8aAÆ¢\16\e£ î±Ï[d\98óÂW\96e\ 1Ì4Ì"Ö\80ò­a\1dÐ[Ŭ   k\88%{_;\0m%¯}ù\ 6G°üp\9f-¡Ã.m º¯ú=¦µTëøßÍg*£\9f\9d%XÅnÄß_¡ã\13j\85\87Z5\13\ 2\ 3\ 1\0\ 1£\81\850\81\820\f\ 6\ 3U\1d\13\ 1\ 1ÿ\ 4\ 20\001\ 6   `\86H\ 1\86øB\ 1\r\ 4$\16"Ruby/OpenSSL Generated Certificate0\1d\ 6\ 3U\1d\ e\ 4\16\ 4\14ò\ f"e\99\80CÁõ\9dF>¥Xkèc\8däô0\v\ 6\ 3U\1d\ f\ 4\ 4\ 3\ 2\ 5 0\13\ 6\ 3U\1d%\ 4\f0
++\ 6\b+\ 6\ 1\ 5\ 5\a\ 3\ 10\r\ 6 *\86H\86÷\r\ 1\ 1\v\ 5\0\ 3\82\ 1\ 1\0W¯s\ 1kW³\91+<(÷Jï¶V\9eN5UWÄÆc´×\95û\ e\1cÕNé5úØd\fÞxZÒéÀ¨\ 3\95NîE\ 3Â\81Bʺ\82\87´S\vݯÉq­\87cð»\82G\88\rð\99\15wà¡\87h}ÿ\12p\10#'\ 5ZPg¥°\1f{§'\95\82Ýû\ e\13\9bIxX   àÁô5âJq\84\ 6UÆiþj­\84\7f\12;\8cv0Wã¿ß\v§à9e­c{`\84\%é\13Ô!Ãs­(èæ¡\84T6C¦sÐ/.\r\90\ 2oK» \0ðiq¬Ä4á­$?üçºu\97\9aöNûy̰»N\18È¢¦±·Á\ fâoÇZ;àSq\ 1u\9cHëypUѽz\89^-V\ 2ØÇfé\8fÙ,´]Sen¤÷Õ,&áH\12J\86\9aµ¼\1dpw\8cØk){dI\1d3$®Í\92\8b
+\ No newline at end of file
+diff --git a/examples/puma/puma_keypair.pem b/examples/puma/puma_keypair.pem
+index 1aded78..f1c333e 100644
+--- a/examples/puma/puma_keypair.pem
++++ b/examples/puma/puma_keypair.pem
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-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
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/server.p12 b/examples/puma/server.p12
+index d928a19..49f76f8 100644
+--- a/examples/puma/server.p12
++++ b/examples/puma/server.p12
+@@ -1,13 +1,15 @@
+ 0\82
+-\88\ 2\ 1\ 30\82
+->\ 6    *\86H\86÷\r\ 1\a\ 1 \82
+-/\ 4\82
+-+0\82
+-'0\82\ 4\82\ 6        *\86H\86÷\r\ 1\a\ 6 \82\ 4s0\82\ 4o\ 2\ 1\00\82\ 4h\ 6       *\86H\86÷\r\ 1\a\ 10W\ 6    *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\bùØ{T¸ÌÝ\13\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10\91\10¯²8\Ã]}Ì\9b\98{\84<)\80\82\ 4\0ÜTHâÏ9ô{#CÀ¼Æ­>üO̱]\ 2¼fT\83®\1f[éªèǨè\11\8eçÁs\87V\1c:\8f·\1e!°þ\99\0^\vY*\Üa\fõ\1aö& \0à\8dHUty,¨w\7fw ®\ 5|z\92k\7fj¯$\85õ\7f÷»V\8aÂr³,+ö0z³\10øRÞe}Fm.òû»,:øÜ\ 5]\87\16\11´µ\ 3dT\82a\96Ã\88\12Á{#,ô ð/ÐzArÊÕìH¿\14±h\1aî\81j\r±ÿ²ö&'\87$\85k\86\85òÉ.\18\.tØ6D+ß\88Ï\17\85\17\9d²\ e®¥#¿Y;Î-Ñbji\rb³£ <¿½\JJ¤k\162%\fàÃb´wíÕ½þ\8c\1dÊBjðõ¿I¡ê\83M\85ËIÖÜìñèS\1d.\91\8d@\8a\9bÆ0È&V\87¼¾¢ RgXA\8bXUhHæÁ+Ji\ 4¥ºW\9c\85ògvò4(ù|ãl¢¿=\8a\ 4c\93nygï\12«PÊ\ e2\v\11¼\80³¿â\95\ 2)7©yÊd\98,\89`Æîv|Ãf*\82÷©VHæ»\13¥\19\ÿ(\9anq\véfÕ\93\88\ 4\7fæ'\82"Ã×å¢\17±\8e¯\97\9døm!\89\1dà\82Û!ö\18\8f9p\17¸Q\1cc\8c¢£\17 \ fn\fØ)4ææWýD\84\8eçäi\13\0Xy\93ì\8dÿ¾3¢mÛ\ 4Á%\ 5F\8e\90·\v\ 4F,(w\96U˸\9a\13\0ï- Q˵\86K¡ò\ 6<È·È¢ï=í·Ý \0S7\18\9d\9d\87\92ì6Ù\15^y\ 4\92Aίc»\ e-«-\9a÷\fLLc\87\1e\8a¿B||-*\ 6øÕú Yõ.\9e\12'MÞ¸N\7f\11Ryù\99b\1dË<ÞþËç \8a\91´\1f¶|\8e\17\85/24\a\98l\86ó+\15µ@ïVéô\ 5÷TûÛìP¢\bÝ   RöþI£·Õ\14\80\94óc\91ÂBµÙn\97¯b\94È_÷¸õ\ fóWxçä\7fì42y\94\15Ê\8d]Æ./Ï·c¬é}ã\a[\15\v»çàè\o¯×\92\1ad9þük4\19Yv¢¼\aÀ\8aÕí˧í_ë3[´\10Ì¥\15\89û1\92o¦vá,\0aæ>\aW\85>î^\1d7èÂ\88Âk\88¬\96¾K-{o\19µ¨\18A;'Ê\11\86\87\1f\8f9p©\96ù\8a\9e÷\ 5í\92à¦â\1f\ 4u6Ò|\11q"\ 2È¡² SïS\1c£\b·,Åw\94\b4ÖÇàßf£Ð\ 5âó\83.\9c¹6G\18\bìò\10v@U·xf$rýÃ\ 5ëý¬Ì\9c\14¬"NÒ9\15\84²dn¦Þ\17\83¼\15\1aÍ\98x¶Ï\13\rÌcê¹s\15)nX_Æ"\16[;+\82çìS:;íjv\15\99¾cr\12\91g<ãZ\8e\9cI°É8u\95\r7+\16}DüµønB\83Óô¯D{øë\ 4\ 2\ f¥\83Q8\11®·§\8eV¹rJ\ 57I2èlC\ 2ʲ4¥0öÈ\83ÍÌ\9f\16RPRëÐ_ð\86\15h\8cI\ 5C\ fó\1f\93\9aua\97\0ZØêwº\av¡ÇÑwDôEO.X\96·\12ö\10\v\12ë/&ä×ÚÞ?ÉGY¸ Xßâgé\12R\92:Mk\87±Tϱc
+-\86     Y0\82\ 5\9d\ 6  *\86H\86÷\r\ 1\a\ 1 \82\ 5\8e\ 4\82\ 5\8a0\82\ 5\860\82\ 5\82\ 6\v*\86H\86÷\r\ 1\f
+-\ 1\ 2 \82\ 510\82\ 5-0W\ 6 *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\1a\8bR)?\e¼ù\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10­l\9fï\14rRQ\83\9eqÈïÕv\92\ 4\82\ 4Ð\15éZ~knÔ´(\a\94³ä\10[_\b£¥ù\15_"\9a\8dö<oÖ~7¦\9fS¨áÈ
+-\1cIj\1d,éð\98Öµ==¨æ±fñ¡Ö$/£`ÑAS¡Lm-úÕs\8a\18»¶j\ fvÍß`\80.\12ÓD{ý¨\91m=q1\0\ fº\ eê¯\1d\8a\80\88\ 3²oX\89OÔ°Aç\b\93\13\ 1
+-\ 14`G|\11O4áP=&\83\9f¬\0y8_ÚÃIÅÂBO    \85\15ôÀù!\18\ 4i3:Í\83[£>ðïB\16]_dÆ£\85\95+¬=o%\97îV\80}T*Ä55ä\9e·ÿ1`\bôpx 2\1d¼¶{ORÈr\82v¤Å3\rZëÅ\a\98ý0À\11&õ·Í`
+-\89O\82®Ý·%M+ÿ7Ö\9f4ÔÊMË1èz/\a\13ÜÕ2Ö\10\82A\999\9eö\82ýâ\7f¶^Ê\93\89ö\89m\80\83\89wÓÞ\87\f\97ê/«>å\82TCÃk$j'âÆÙ\9fæapDV'Ç \ fB\9cè\ 2«Û¿ý\91\8d\9aÜ\ 6f\85¦)ç\9dù²\95à­!o\81\ 4˧ñEð;\r\ e5ß³ø±ëQË\8c]¼è\r<M\0\88\18·º¢B8Î\ 4!YÚ\92\8d\9f\e\vÉýÏ 
+-½XH\0T\16u¥ê\9b\ 6û^A\ e®\96\9f\ 6þî] á)w\90¹ ¥²©­Äð\8dâ6\1e\14\19÷\9e¶ÑV^\11    mã\ 6·Y%Û\1aï´\10¼\92õÚ躯À¼ly6\13\16ÎOÐþuÝ\1f\96SoI}\94T5~\88ç_g~e       :HOfr÷X"µ.D\84c¿*\ 4æ\8f\ 67SRý\90 àÅ¡\ 2\11ã\8e\ 1\17×sCúm\9d\e\rvüÁo¾\8a©²ÌS\b'p\0Ú\7fï¬ÊÂ>T\fàÂRi¶2\9eá\85X\19R©X±C6½f\86S'\ f?     \e#\bñ|&  Ô\88e`ð\08\r#\1fùJ¤Û÷Þ±\vÅç´\ 6ðýû|\19v³FµN}äm\96q$\1e\1c³\81\ræa׬ðK\1e\97E\8a+Y\17(\81´?ÿIÍØAÃç?¡\96Üç/}\1fÑÊ}Ád¯\17\ 5J¯3\87ëæo±ö\86\94ó\v\88üi¾,@èx\8e\16õäOhê@\19+Z¦Ê3,       \10¦{{õ¾Õ-®òþt\ 3Ï&ªÏÞòÀ\9a[t%¤íäªvëÛùÚ´¸ÍÒÛ\9c\ØBj\eié?êº*\1e[V5Ý=^H\ 3\9c>DÃÏ=\v-s\ \15 q\18\9cKX<$²ñG\8c\ 4\9bóÓ\1eqG¯án¸<¨EW\18Û\ 4yX\a\14jyä÷\91ÓÕ\ef\10\95¼\86ת\0©òD\10õVBQ0DR\12´V6áj~ö\18\93æØ|3\80Â8Àðm»¸¸\17\93\ 2s{\93$\88ó'Jñ¸b¶ÚÒ¦¦´\14×áýÄn\8b\9d)3Ø>ç;ÑÂÙQ\v.ã|\ 5\93B\11\ 5¿Ô\81ë~\84H\aÁ_èÏài        ¹qÁȺ¥Ø\8d¸\86\99ÞÜù}h\ 1VDò[Fm½\85SbP<1\9fÌõ|¨Ê\97àYÌ\97\1f\160TIÜ\94a\eË`\15xÇ:´Â\93Ûw\1d\_b\85\8bê{§âe\1f\1c\13\ 21±w\96\8ahúü\91;S\13ÍÏ\8f]\83\b8\93\95\rÂxþ×Fl0<ýóJ\90ؤñaX#\90ÐÑæÉ¢xãß?û\13÷\99dÈY\9f½\89\8aØQ+ª8\84\ 2ÚÈÏ\ e\9d,\ 6\95³ì\9a _\9d:\87<q¨ò¹Ù\eÈ\9d\7fkAÎ\7f4]k~ãM±ËÍÒ:Ü£Æë(X>\89¡<WϦ\8fñ\18½s}­âVd%ÿA6=\ 6R^}ö\1e½|)·'Ò(§MrYâñ\9e\84m»I¤÷\1e\v×§¸\13\82\8bi">MÓ\12\8fa>ê(Lµ\ 2RÌlÙ§^vfið\0V\82¥</\8cÕ\8c\92\8f\80ÑÛ¹Å\10¨\95\18/j\171>0\17\ 6  *\86H\86÷\r\ 1 \141
+-\1e\b\0p\0u\0m\0a0#\ 6 *\86H\86÷\r\ 1 \151\16\ 4\14Ô\97S9ÓW\88\ 1w#½\93\19\ 5Á\92ø\1el00A010\r\ 6        `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 ´\r\86\10öX(»6#¹È\1aÚ+Ç\90a®OÁ\13Jº}¤\15ä\9f¯I\8c\ 4\bØ\ba\82\ fÈ^\97\ 2\ 2\b\0
+\ No newline at end of file
++\98\ 2\ 1\ 30\82
++N\ 6    *\86H\86÷\r\ 1\a\ 1 \82
++?\ 4\82
++;0\82
++70\82\ 4\8a\ 6        *\86H\86÷\r\ 1\a\ 6 \82\ 4{0\82\ 4w\ 2\ 1\00\82\ 4p\ 6       *\86H\86÷\r\ 1\a\ 10_\ 6    *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10ÀéE¥n¢äã©#d\94VUép\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10¶ÏtøÐå\ 2õo&¥d»[ÒS\80\82\ 4\0ð;\86\95ÌÝÄp\99ÄF×qØÛHò\ eÄ¥yÑ\952¿hVP9äÏÖú\ 3à\85|\89Ãf\9blk»ÿ ±\96n\bL¸ª\87Ä\1a\1fð5$ÜÂ]8Wù:<¦ßâIÏÈÕúI~   #t»_jKÛH5ÊQ¥kç6L\ 5\r\13\1e\bÔÝ÷G
++J³±\83\ 6\ 1á\ 3\9c¦üí\ 4¯7_+3Ü*Ù\9fA¾ÜGÃÞ` \98Ê\8d\fé\96ÀÃ)\9aÊ\95{\89Q\93\18B\8d®\17Xb\ 1Ö¾¶\95ÔØì\8f        \9fð\18\1a\98àÅHª"̪N~£aå]\15ìI4\r\1eg\83\93-ukó<¥^àgj+\14j|\e\ 6[\ä
++ì<­qSÑ2wÏtí®RwZ\ 1r\97¡ç1Ì\ 6 µ_³3É\92j4\8b®\8a\83@sóÜ\ 3\96ø\81ûÍß°    Àý$\15\eÅfr\ 46 ÎÓcR\81_\bÍ\8d o8\17úf®½$<\1dû\14vg(Í   §¼8±1Hîvvý\7fä Ü\12\93¹T\12\fäÃÿV\93t²¿tC¶\9c\1c\ 5KKà.'ò\1068     µæ\94\ 3°#\9eÔ|vú)Â2\11\89'åI@\8cá\1eQ\10\1c\9eÎZ´]\88Ì*ù\7f©\8c\16S\ 6ã\vãËV.äãõbNu}oÑ\18ZS.ü´x\8aM\81Ý#ñ\95SZ.8\eÁh¼¾é\8de"\ e\ 2n\ 5\8f~"* \0\11ý\96\86\80\91\1a¯\12XdÏ\8bÒ£ùÁÌ<S¼\87±ö\8c¶ÏþDqoKWO"S×A^¤¾\9d\9di\17aßÝô\9c\0\r\ 2\8fÁ\1e¨~GwÃ,¿LÚwn\7f\14¿\15o\92N£@Úà:\15\87³;\12\11ôb³Ó\866»ñ7AÝÖ¬Ú\84d\15\r\83MyQ\ f·­Cdgí%\80\ 1XÁ§{\12\ 1óÕi\vß9ª\v\88\9e·ÇH\aãm^"\ 3¬
++DOá.K"Á7Kä¨|wDÃH\8e\9bõ*\8b\ f\99ó¶\ 5\1eCÓxõ\ 2*g¬\v\10ÂárÖ*eÀ\18r٥°£¹¹Ç®Öí\ f²é%$Xé\9ciOr7ú¦\8bÊâ\7fÔî¥
++Ú<Ú|[i-äeö\q#\ 3hº7\0fy\99\93:\ 6zyØð\9c\8e\9fL\13\1dbÝú-d,:w~\82{\9eÕÏ[\12)¡4ÅÛAJ1\ 4&ËW[ùjOM]UO{U1RÁÑ¡'ÍÁ\87\8aÄì¼¢÷Û\8e'bÉÙ\84!\93\9f<\9fÓ\85\1f­\b8\93Ú¹\1cÔõs<Ê5ÑÜ\8f\1c£(¬nM¤Ù=\1eô$hïl\8eqæm|\8fiD\v©þ|\83\ 5\ 1K¸µ\84\f?kc«Øópx9\90\8e-\91\r%ûåL\8b¹=7°Zz"\9eÜ\84~\93z°û\9cD?Uü\ 4Îi¹\a<ÜÛMLµÇ\1fåòÔ©Vw¯êß\96C\80\83/+Ø\83Î?8+\80:uCØAê@\8a±IÕÔ\e\98Ò\F\aÜÃ\9câc,Üu\93\8c\96\87-üV£\9bý'\19Ê\99\ 6ØìËJ\9e!K\12\8aS\91íÜ&3x/ê\86ÿÝ­mEè\9fæÆÙ%¦.Wáf?4\95%ëþúb¾qq!m\88/iÎö°Q'Ü\8a·I[01A>.3ÙáBið\930\82\ 5¥\ 6        *\86H\86÷\r\ 1\a\ 1 \82\ 5\96\ 4\82\ 5\920\82\ 5\8e0\82\ 5\8a\ 6\v*\86H\86÷\r\ 1\f
++\ 1\ 2 \82\ 590\82\ 550_\ 6 *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10j¿º\7f<ÑÔw^Rä&Üz¾o\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10}Ý+ã/KâVýDÖ\8a\96\80v4\ 4\82\ 4Ð\10F¸Ô¹\8dÌgc¼iÌh\ei9\8døïØ{BV 2²\1d\90ÍzéZ\94f\8e踡¹a:é\96\9f3h\bÊz´à3_\90\82⳩wY#æ\ 2r\9f´ì&K\94|èõÛN\15¿'\16ëÔ\12µ 2G\1f\9fÙ=ç)iy¬îé]Ù      ×+ãí\0î\1f\8cØÃ\r\ 47jÚÍ¢÷e%\17H`O=t\94²Îð\8ap1¿Bhæ\92Ö
++§VA\8fçg\12µÔ&b\ 5CZ\13c\0\98é\98ÕÂ\80B\87\v#õæ\81\18ܯÛ=pbSFD<:t+Þµ¤ìG\94\ e'QKèè-ë\9dmN,&&ï\b\86¦ê\9f^j\19Ë?h,8u¡\7fÅt3\ 5¤È\98<fë¨\8dtôs£Yy\84h\17÷\18\ 5P\85qÇVA3\1eäÇ\99­°$pF;`\ 2î¥\8a\8cã\19E¯GÌËgVo\17f\8d\a\8b\19£Ý|Y¨Ç 0`kK\vÀ\1e\93\84ÿW&m 5\1eYÛ®áPû!¦²8òÖñh:tÀH[\10\11.ÂsÁ¨øtóÅ1\ f2}6w×åÁE`µ\87³W\8a\1fß\81\198]{ÅkÞ´\f&¯[\8a\8bç\1f´Íkt      \8dg|\1esÇl-ø\ fV)\9f\1e\13u6\8f·)ø\13a\96ÓË÷Þ6¢jDÑ&Î{þá]\1a±Aô/¶{»\87\16öqnn\ 4:~GSøMO;¬\9a\9fѰ\0\93âõrcêk\9dîD¼\13þ\86ÊÁ\96ô³Í\11f0Ë#\v寽\84\1f\13À6½Ò\8f£Øxr$ð\8aÃ\ 2\aúöÃ\90\88\ 6\ 5\8f\17\19\96¬Ù\9fM-Û;ñ>\89\91;\9c\v\15/8hn\92éÙ©äU|L+\ 1\94³\ 2¤°îB«wMå[\90q1ø¥\18\90oû8¶mrp2A,Õñ¨&¡ò\95N¡fÎ\80\92áÝÎ\r9\b\91~
++A\8c\8atíàÎt\97T\90Â\96¿v\17\ 2S\1eĤL+\ fLSé\9bà¹G\ f¼\98z}\94Ls4\88~Ûx¯ù\89£ým\ 5%\98ã©\f\9bÔ\87O¢ö®"r\89*½ê,¸é§lþ\e%h_\ 4\9dÍ\16ãE{µ\85p\9f\19  ã]u\93\9b³tC\16\82\86ú´B%Ác\ 4ßÚeä\82Wø_*ÃXöç,n¹jg{\1e\807²   R^\1c\99Ü8°\88\fû¢O\e\80\92µ\17ï\92\e
++ð`Þ<I¿³¦Ý\91÷q÷Ù$2c\9b¢\92¥Á\84èÔH\82£å\8cÐ\18\8b¹~WïûAbµ\9cÁ¥\e\98-C<{HR\9a:ÆþN\1cí\r\82é\95\1d\ f½E¦X'&Ò7\123/.ìD\\90©z®\97\1f\9aáåp\8d/£Ø%åÒÏfã\96H6Ò\88)»Í°\9câ\rANÂ^\9b\15|$\89âÙB\11\8e¾Í\91Qd\15È\ 1\84\11¾¡{âù\ eÉjä§dÐìÒn\85n5MÛ\ 4«æ/`\9fÂŹñ©#è\91i~ê\84\91§MÈ)ê\83ó\1dÉ\ 4´-d-Í\ 1\1a-ØRf\82CR       Æf!I\18*ÇÎ\ 5ùÕ\92ò\9bM_fÖÂ¥\94\81´^üÉO¸×qs\a¨×\925ÚÐé¾g\95Í\9fe¯J\ 4 \ fèV^˵ |µÎi¬R¿\10%G\80\0NCÜâ0\11W\0\97\97pöY|Ñ\\9d\ f\8d\bé\94a\1c±ò\1c\ e\Vå\0Ú¡´§2©cÈ\0«\eC\988ÞòÀÄèkã`vÒ\13\vÄs\1c\15\18\9cþ\82ZÜ¡Ë\12`M\ f(êj\ fBP\86\9aëLP\94ð¡Í¼ð¡8w÷\98¿O_\12\aoK=\989dhË\10\98Æ6\86@\10>µpë¦\83Èl\90ͯ,\ fã&·Eú\1fÖ]Q0\8b\a\13\98\19><xy\10\7f¯H\85\129W½Ü6ô©4C\v¥>   ²\95Å3:\ f\95Z¡LF³Ø`Ü\87%\98\7fl\18oݦ\ f\1c`iý}¼g\89t2O§ZÖ1>0\17\ 6   *\86H\86÷\r\ 1 \141
++\1e\b\0p\0u\0m\0a0#\ 6 *\86H\86÷\r\ 1 \151\16\ 4\14ß7HåÁRnõí\96¼ñOò\84À"ðôK0A010\r\ 6        `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 \1aªÈ\1e\ f73Ú\1ez{D\8aâFlý\8a\13\ 3\82\90½NrHO\9dqkñ4\ 4\b{¸ï\88ý\83\92\11\ 2\ 2\b\0
+\ No newline at end of file
diff --git a/patches/series b/patches/series
new file mode 100644 (file)
index 0000000..f1e77b9
--- /dev/null
@@ -0,0 +1,12 @@
+0004-puma.gemspec-drop-git-usage.patch
+0011-disable-minitest-extensions.patch
+0012-disable-cli-ssl-tests.patch
+0013-fix-test-term-not-accepts-new-connections.patch
+0014-disable-test-failing-on-amd64.patch
+0015-disable-different-output-test.patch
+0016-disable-test-failing-on-arm64.patch
+0017-disable-test-failing-on-armhf.patch
+0018-disable-test-failing-with-ruby3.2.patch
+0010-Disable-test-concurrency-without-concurrent_ruby.patch
+0019-adapt-test-certs-generation.patch
+0020-update-ex-certs.patch
diff --git a/puma.1 b/puma.1
new file mode 100644 (file)
index 0000000..47a94c3
--- /dev/null
+++ b/puma.1
@@ -0,0 +1,165 @@
+.TH PUMA "1" "January 2020" "PUMA 3.12" "User Commands"
+
+.SH NAME
+puma \- fast, concurrent web server for ruby and rack
+
+.SH USAGE
+.BI "puma [options...]" " [rackup file]"
+.PP
+.B puma [\-h | \-\-help | \-V | \-\-version]
+
+.SH OPTIONS
+.PP
+The following options are available:
+.TP
+.BI "\-b, \-\-bind " URI
+URI to bind to (tcp://, unix://, ssl://).
+.TP
+.BI "\-C, \-\-config " PATH
+Load given path as a config file.
+.TP
+.BI "\-\-control " URL
+DEPRECATED alias for \fB\-\-control\-url\fR.
+.TP
+.BI "\-\-control\-token " TOKEN
+The \fITOKEN\fR to use as authentication for the control server.
+.TP
+.BI "\-\-control\-url " URL
+The bind \fIURL\fR to use for the control server and app. Use \fIauto\fR to
+use a temp unix server. This requires to use a \fB\-\-control\-token\fR, which
+needs to be given with every request to the control server (\fItoken=foo\fR).
+.TP
+.B \-d, \-\-daemon
+Demonize the server into the background.
+.TP
+.B \-\-debug
+Show low level debugging information.
+.TP
+.BI "\-\-dir " DIR
+Change to given directory before starting.
+.TP
+.BI "\-e, \-\-environment " ENVIRONMENT
+The environment to run the Rack app on. Default \fIdevelopment\fR.
+.TP
+.BI "\-I, \-\-include " PATH
+Specify \fB$LOAD_PATH\fR directories.
+.TP
+.BI "\-p, \-\-port " PORT
+Define the TCP port to bind to. Use \fB\-b\fR for more advanced options.
+.TP
+.BI "\-\-pidfile " PATH
+Use the given path as PID file.
+.TP
+.B \-\-preload
+Preload the application. This loads all the application code prior to forking.
+Preloading reduces total memory usage of an application and is only available
+in cluster mode.
+.TP
+.B \-\-prune\-bundler
+Prune out the bundler env if possible.
+.TP
+.B \-q, \-\-quiet
+Do not log requests internally. Default: \fItrue\fR.
+.TP
+.B \-v, \-\-log-requests
+Log requests as they occur.
+.TP
+.BI "\-R, \-\-restart\-cmd " CMD
+The \fBpuma\fR command to run during a hot restart. Default: \fIinferred\fR.
+.TP
+.BI "\-S, \-\-state " PATH
+Where to store the state details.
+.TP
+.BI "\-t, \-\-threads " INT
+Min:max threads to use. Puma will automatically scale the number of threads,
+from the minimum until it caps out at the maximum, based on how much traffic
+is present. Default: \fI0:16\fR.
+.TP
+.B \-\-tcp\-mode
+Run the app in raw TCP mode instead of HTTP mode.
+.TP
+.B \-\-early-hints
+Enable early hints support.
+.TP
+.BI "\-w, \-\-workers " COUNT
+Activate cluster mode and define number of worker processes to create. In this
+mode workers are forked from a master process. Each child process still has
+its own thread pool and the \fB\-t\fR setting is per worker.
+.TP
+.BI "\-\-tag " NAME
+Additional text to display in process listing.
+.TP
+.BI "\-\-redirect\-stdout " FILE
+Redirect \fBSTDOUT\fR to a specific file.
+.TP
+.BI "\-\-redirect\-stderr " FILE
+Redirect \fBSTDERR\fR to a specific file.
+.TP
+.B \-\-[no\-]redirect\-append
+Append to redirected files.
+.TP
+.B \-h, \-\-help
+Show help.
+.TP    
+.B \-V, \-\-version
+Print the version information.
+
+.SH EXAMPLES
+.PP
+The following examples show how to bind TCP or sockets:
+.PP
+Bind Puma to a socket with the -b (or --bind) flag:
+.RS
+.B puma -b tcp://127.0.0.1:9292
+.RE
+.PP
+To use a UNIX Socket instead of TCP:
+.RS
+.B puma -b unix:///var/run/puma.sock
+.RE
+.PP
+To change the permissions of the UNIX socket, add a umask parameter:
+.RS
+.B puma -b 'unix:///var/run/puma.sock?umask=0111'
+.RE
+.PP
+In need of a bit of security use SSL sockets:
+.RS
+.B puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert'
+.RE
+.PP
+The following example show how to Create a control server and use
+.BR pumactl (1)
+to interact with the control server to restart \fBpuma\fR.
+.RS
+.B puma --control-url tcp://127.0.0.1:9293 --control-token foo
+.br
+.B pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart
+.RE
+.PP
+
+.SH "CONFIGURATION FILE"
+.B puma
+will look for a configuration file at \fIconfig/puma.rb\fR. If an environment
+is specified, either via the \fB\-e\fR and \fB\-\-environment\fR flags, or
+through the \fIRACK_ENV\fR or the \fIRAILS_ENV\fR environment variables, it
+looks for configuration at \fIconfig/puma/<environment_name>.rb\fR.
+.PP
+The \fB\-C\fR flag allows one to pass on a custom configuration location. If
+the value specified is a dash (\fI\-\fR) \fBpuma\fR won't look for any
+configuration file:
+.PP
+.RS
+.B puma -C \(dq\-\(dq
+.RE
+
+.SH "SEE ALSO"
+.PP
+There is extensive documentation at <\%https://puma.io/puma/\%> and
+<\%https://github.com/puma/puma\%>.
+
+.SH AUTHOR
+.PP
+This manual page was written by \fBDaniel Leidert\fP
+<\%dleidert@debian\.org\%>, for the Debian GNU/Linux system (but may be used by
+others).
diff --git a/puma.docs b/puma.docs
new file mode 100644 (file)
index 0000000..b43bf86
--- /dev/null
+++ b/puma.docs
@@ -0,0 +1 @@
+README.md
diff --git a/puma.examples b/puma.examples
new file mode 100644 (file)
index 0000000..e39721e
--- /dev/null
@@ -0,0 +1 @@
+examples/*
diff --git a/puma.lintian-overrides b/puma.lintian-overrides
new file mode 100644 (file)
index 0000000..711e981
--- /dev/null
@@ -0,0 +1,3 @@
+# this is one of several sub-directories; no need to rename it
+repeated-path-segment puma [usr/share/doc/puma/examples/puma/]
+repeated-path-segment 3.1.0 [usr/lib/x86_64-linux-gnu/rubygems-integration/3.1.0/extensions/x86_64-linux/3.1.0/]
diff --git a/puma.manpages b/puma.manpages
new file mode 100644 (file)
index 0000000..8c2d587
--- /dev/null
@@ -0,0 +1,2 @@
+debian/puma.1
+debian/pumactl.1
diff --git a/pumactl.1 b/pumactl.1
new file mode 100644 (file)
index 0000000..67e70d6
--- /dev/null
+++ b/pumactl.1
@@ -0,0 +1,99 @@
+.TH PUMA "1" "January 2020" "PUMA 3.12" "User Commands"
+
+.SH NAME
+pumactl \- command line client for puma
+
+.SH USAGE
+.B pumactl [options...] [commands]
+.PP
+.B pumactl [\-h | \-\-help | \-V | \-\-version]
+
+.SH COMMANDS
+.TP
+.B halt
+Halt the server.
+.TP
+.B restart
+Restart the server.
+.TP
+.B phased-restart
+Restart server but phase out old workers while starting new workers one at a
+time.
+.TP
+.B start
+Start the server.
+.TP
+.B stats
+Show stats about the server.
+.TP
+.B status
+Show server status.
+.TP
+.B stop
+Stop server.
+.TP
+.B reload-worker-directory
+Reload the worker directory.
+.TP
+.B gc
+Start garbage collector.
+.TP
+.B gc-stats
+Show information about garbage collector.
+
+.SH OPTIONS
+.PP
+The following options are available:
+.TP
+.BI "\-F, \-\-config\-file " PATH
+Load given path as a config file.
+.TP
+.BI "\-T, \-\-control\-token " TOKEN
+The \fITOKEN\fR to use as authentication for the control server.
+.TP
+.BI "\-C, \-\-control\-url " URL
+The bind \fIURL\fR to use for the control server and app. Use \fIauto\fR to
+use a temp unix server. This requires to use a \fB\-\-control\-token\fR, which
+needs to be given with every request to the control server (\fItoken=foo\fR).
+.TP
+.BI "\-p, \-\-pid " PID
+Define the TCP port to bind to. Use \fB\-b\fR for more advanced options.
+.TP
+.BI "\-P, \-\-pidfile " PATH
+Use the given path as PID file.
+.TP
+.B \-Q, \-\-quiet
+Don't display messages.
+.TP
+.BI "\-S, \-\-state " PATH
+Where the state file is.
+.TP
+.B \-H, \-\-help
+Show help.
+.TP    
+.B \-V, \-\-version
+Print the version information.
+
+.SH EXAMPLES
+Create a control server and use
+.BR pumactl (1)
+to interact with the control server to restart \fBpuma\fR.
+.RS
+.B puma --control-url tcp://127.0.0.1:9293 --control-token foo
+.br
+.B pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart
+.RE
+.PP
+
+.SH "SEE ALSO"
+.PP
+.BR puma (1)
+.PP
+There is extensive documentation at <\%https://puma.io/puma/\%> and
+<\%https://github.com/puma/puma\%>.
+
+.SH AUTHOR
+.PP
+This manual page was written by \fBDaniel Leidert\fP
+<\%dleidert@debian\.org\%>, for the Debian GNU/Linux system (but may be used by
+others).
diff --git a/ruby-tests.rake b/ruby-tests.rake
new file mode 100644 (file)
index 0000000..67a5a4a
--- /dev/null
@@ -0,0 +1,22 @@
+require 'gem2deb/rake/testtask'
+
+Gem2Deb::Rake::TestTask.new do |t|
+  t.libs = ['test']
+    t.test_files = FileList['test/**/*_test.rb'] + FileList['test/**/test_*.rb'] - FileList[
+      'test/test_integration_cluster.rb',
+      'test/test_worker_gem_independence.rb',
+      'test/test_rack_version_restriction.rb',
+      'test/test_preserve_bundler_env.rb',
+    ]
+  t.verbose = true
+end.tap do |t|
+  exclude = %w[
+    test_application_logs_are_flushed_on_write
+    test_hot_restart_does_not_drop_connections
+    test_logs_all_localhost_bindings
+    test_multiple_requests_waiting_on_less_busy_worker
+    test_term_not_accepts_new_connections
+    test_prune_bundler_with_multiple_workers
+  ]
+  t.options << ' ' << "-e'/" << exclude.join('|') << "/'"
+end
diff --git a/rules b/rules
new file mode 100755 (executable)
index 0000000..da15652
--- /dev/null
+++ b/rules
@@ -0,0 +1,14 @@
+#!/usr/bin/make -f
+
+export GEM2DEB_TEST_RUNNER = --check-dependencies
+export DH_RUBY = --gem-install
+export DH_RUBY_GEM_INSTALL_EXCLUDE = benchmarks/* docs/* win_gem_test/* tools/* bin/puma-wild
+export LANG = C.UTF-8
+export LC_ALL = C.UTF-8
+export TEST_CASE_TIMEOUT = 300
+
+%:
+       dh $@ --buildsystem=ruby --with ruby
+
+override_dh_installchangelogs:
+       dh_installchangelogs History.md
diff --git a/salsa-ci.yml b/salsa-ci.yml
new file mode 100644 (file)
index 0000000..33c3a64
--- /dev/null
@@ -0,0 +1,4 @@
+---
+include:
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
diff --git a/source/format b/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/source/lintian-overrides b/source/lintian-overrides
new file mode 100644 (file)
index 0000000..362d49e
--- /dev/null
@@ -0,0 +1,2 @@
+# no signed tarballs by upstream
+puma source: debian-watch-does-not-check-gpg-signature 
diff --git a/upstream/metadata b/upstream/metadata
new file mode 100644 (file)
index 0000000..cbe22a2
--- /dev/null
@@ -0,0 +1,7 @@
+---
+Archive: GitHub
+Bug-Database: https://github.com/puma/puma/issues
+Bug-Submit: https://github.com/puma/puma/issues/new
+Changelog: https://github.com/puma/puma/releases
+Repository: https://github.com/puma/puma.git
+Repository-Browse: https://github.com/puma/puma
diff --git a/watch b/watch
new file mode 100644 (file)
index 0000000..b06856f
--- /dev/null
+++ b/watch
@@ -0,0 +1,5 @@
+version=4
+opts="searchmode=plain, \
+  filenamemangle=s/.+\/v@ANY_VERSION@/@PACKAGE@-$1\.tar\.gz/" \
+https://api.github.com/repos/puma/puma/tags \
+https://api.github.com/repos/puma/puma/tarball/refs/tags/v@ANY_VERSION@