diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d7043f6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+*.swp
+config/NaturalDocs/Data
+docs/dev/*
+docs/user/*
+docs/test-coverage/db
+docs/test-coverage/html
+release
+snapshot
+.DS_Store
+build
+Makefile.old
+bin/pt-mongodb-*
+bin/pt-secure-*
+bin/pt-pg-*
+!src/go/pt-mongodb-query-digest/vendor/vendor.json
+!src/go/pt-mongodb-summary/vendor/vendor.json
+src/go/pt-mongodb-query-digest/vendor/
+src/go/pt-mongodb-summary/vendor/
+!vendor/vendor.json
+vendor/
+*.bak
+src/go/*.bak
+src/go/.env
+config/deb/control.bak
+config/rpm/percona-toolkit.spec.bak
+config/sphinx-build/percona-theme/*
+coverage.out
diff --git a/.travis.yml b/.travis.yml
index dbc6f2d..3540d04 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,7 @@
 language: go
 
 go:
+  - 1.15.x
   - 1.14.x
   - tip
 
@@ -9,6 +10,7 @@ services:
 
 env:
   global:
+    - GO111MODULE: "off" # TODO test with "on" too
     - DOCKER_COMPOSE_VERSION: 1.8.0
     - TEST_MONGODB_FLAVOR: mongo
     - TEST_PSMDB_VERSION: 4.0
@@ -27,7 +29,7 @@ env:
     - TEST_MONGODB_S2_SECONDARY1_PORT: 17005
     - TEST_MONGODB_S2_SECONDARY2_PORT: 17006
     - TEST_MONGODB_CONFIGSVR_RS: csReplSet
-    - TEST_MONGODB_CONFIGSVR1_PORT: 17007      
+    - TEST_MONGODB_CONFIGSVR1_PORT: 17007
     - TEST_MONGODB_CONFIGSVR2_PORT: 17008
     - TEST_MONGODB_CONFIGSVR3_PORT: 17009
     - TEST_MONGODB_S3_RS: rs3
@@ -35,10 +37,10 @@ env:
     - TEST_MONGODB_S3_SECONDARY1_PORT: 17022
     - TEST_MONGODB_S3_SECONDARY2_PORT: 17023
     # REVIEWDOG_GITHUB_API_TOKEN
-    - secure: "px8XYeNEAFTSTb1hYZuEOxqOXUxvp3EoU+KCtPck/KNozkoS95eBd9klgr3Os4wPKloLdMhrr0VE98lukogUxA/NmnYnos01kegjWgwwM6fkob8JxaN5KK4oUFF1wmirBlrjGlw8vUErPwINmrK4BywKpDbw6Yip6FzxdlWESHI="
+    secure: "iba+2pzxc/zfMxnYki9qM9pCZs1uTEoqfPTaG9qtVr8cMutDzCJvMftn0bb6gSUrglt2mjSNhV65HX7mZl0qh8p/6a46QpzFiwZmaTH+E1tGQf97Z55tx3tHgrcoFI8LGPEHpTQehcI7V0VVo69aBhz+8lNNScOuJwt8ulyuVwE="
 
 matrix:
-  include: 
+  include:
     - MONGODB_IMAGE=mongo:3.0
     - MONGODB_IMAGE=mongo:3.2
     - MONGODB_IMAGE=mongo:3.4
@@ -61,8 +63,9 @@ before_install:
     - docker-compose --version
 
 install:
-  - go get -u github.com/golang/dep/cmd/dep
-  # install reviewdog and golangci-lin
+  - curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
+
+  # install reviewdog and golangci-lint
   - curl https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh| sh -s
   - curl https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s latest
 
diff --git a/Changelog b/Changelog
index aba4e94..ffd6241 100644
--- a/Changelog
+++ b/Changelog
@@ -1,5 +1,16 @@
 Changelog for Percona Toolkit
 
+ * Fixed bug   PT-716 : pt-summary reports wrong memory size
+ * Fixed bug   PT-1914: Column data lost when 'Generated' is in the column comment
+ * Fixed bug   PT-1919: pt-online-schema change drop_swap can lose triggers. (Thanks Bob)
+ * Fixed bug   PT-1943:	BEFORE triggers are dropped after pt-online-schema-change run
+
+v3.3.0 release 2021-01-14 
+
+ * Fixed bug   PT-1857: pt-heartbeat cannot reconnect. 
+ * Fixed bug   PT-169 : pt-online-schema-change FKs error handling.
+ * Fixed bug   PT-1892: pt-summary says sshd not running
+ * Fixed bug   PT-1881: pt-upgrade fails when query including format strings and SQL errors is given (Thanks Nayuta Yanagisawa)
  * Fixed bug   PT-1859: pt-pg-summary fails for Postgres12 (Thanks Sergey Kuzmichev)
  * Improvement PT-1853: Added --no-check-foreing-keys to pt-osc
  * Improvement PT-1851: Backslashes missing from documentation
diff --git a/Gopkg.lock b/Gopkg.lock
index 503bad8..5510c05 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -60,6 +60,14 @@
   revision = "d4cae42d398bc0095297fc3315669590d29166ea"
   version = "v1.46.0"
 
+[[projects]]
+  digest = "1:fd2ee29b7807f198e72dbd6371267b34d05aa83151c8c81b2ade14854e50f4ee"
+  name = "github.com/go-logr/logr"
+  packages = ["."]
+  pruneopts = ""
+  revision = "d18fcbf02861580d05a1f23601145b272c4e7b4b"
+  version = "v0.2.0"
+
 [[projects]]
   digest = "1:b6581f9180e0f2d5549280d71819ab951db9d511478c87daca95669589d505c0"
   name = "github.com/go-ole/go-ole"
@@ -71,6 +79,17 @@
   revision = "97b6244175ae18ea6eef668034fd6565847501c9"
   version = "v1.2.4"
 
+[[projects]]
+  digest = "1:d69d2ba23955582a64e367ff2b0808cdbd048458c178cea48f11ab8c40bd7aea"
+  name = "github.com/gogo/protobuf"
+  packages = [
+    "proto",
+    "sortkeys",
+  ]
+  pruneopts = ""
+  revision = "5628607bb4c51c3157aacc3a50f0ab707582b805"
+  version = "v1.3.1"
+
 [[projects]]
   digest = "1:a01080d20c45c031c13f3828c56e58f4f51d926a482ad10cc0316225097eb7ea"
   name = "github.com/go-stack/stack"
@@ -80,7 +99,7 @@
   version = "v1.8.0"
 
 [[projects]]
-  digest = "1:68c64bb61d55dcd17c82ca0b871ddddb5ae18b30cfe26f6bfd4b6df6287dc2e0"
+  digest = "1:530233672f656641b365f8efb38ed9fba80e420baff2ce87633813ab3755ed6d"
   name = "github.com/golang/mock"
   packages = ["gomock"]
   pruneopts = ""
@@ -103,6 +122,14 @@
   revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4"
   version = "v1.1.1"
 
+[[projects]]
+  digest = "1:16ecf9e89b8b1310d9566a53484c31c5241bb47c32162eba780b46c0dfb58fef"
+  name = "github.com/google/gofuzz"
+  packages = ["."]
+  pruneopts = ""
+  revision = "db92cf7ae75e4a7a28abc005addab2b394362888"
+  version = "v1.1.0"
+
 [[projects]]
   branch = "master"
   digest = "1:4fbfcfe715329e2f09ea644657aa791b81e73a0c835a4f79b9a0dfff0513e2b8"
@@ -202,7 +229,15 @@
   version = "v1.0.0"
 
 [[projects]]
-  digest = "1:55dcddb2ba6ab25098ee6b96f176f39305f1fde7ea3d138e7e10bb64a5bf45be"
+  digest = "1:9d1d58facb0409ecf634fec680d83b6f57f4e619458f7b7b5e4dda1665fd89ec"
+  name = "github.com/prometheus/common"
+  packages = ["log"]
+  pruneopts = ""
+  revision = "f39dfa2b000545b3a763b844012958c275a62266"
+  version = "v0.13.0"
+
+[[projects]]
+  digest = "1:9d35a914be9b807050704f377becb1f864ee46b000f590566a8b9fb871d6c571"
   name = "github.com/shirou/gopsutil"
   packages = [
     "cpu",
@@ -212,16 +247,8 @@
     "process",
   ]
   pruneopts = ""
-  revision = "e4ec7b275ada47ca32799106c2dba142d96aaf93"
-  version = "v2.19.8"
-
-[[projects]]
-  branch = "master"
-  digest = "1:99c6a6dab47067c9b898e8c8b13d130c6ab4ffbcc4b7cc6236c2cd0b1e344f5b"
-  name = "github.com/shirou/w32"
-  packages = ["."]
-  pruneopts = ""
-  revision = "bb4de0191aa41b5507caa14b0650cdbddcd9280b"
+  revision = "9aa2bee419e8b592ecf9f46018f3f1f6a5474c10"
+  version = "v2.20.8"
 
 [[projects]]
   digest = "1:1a405cddcf3368445051fb70ab465ae99da56ad7be8d8ca7fc52159d1c2d873c"
@@ -309,6 +336,20 @@
   pruneopts = ""
   revision = "71b5226ff73902d121cd9dbbdfdb67045a805845"
 
+[[projects]]
+  branch = "master"
+  digest = "1:adcb9e84ce154ef1d45851b57c40f8a211db3e36373a65b7c4f10c79b7428718"
+  name = "golang.org/x/net"
+  packages = [
+    "context",
+    "http/httpguts",
+    "http2",
+    "http2/hpack",
+    "idna",
+  ]
+  pruneopts = ""
+  revision = "112230192c580c3556b8cee6403af37a4fc5f28c"
+
 [[projects]]
   branch = "master"
   digest = "1:9f6efefb4e401a4f699a295d14518871368eb89403f2dd23ec11dfcd2c0836ba"
@@ -324,6 +365,8 @@
   packages = [
     "unix",
     "windows",
+    "windows/registry",
+    "windows/svc/eventlog",
   ]
   pruneopts = ""
   revision = "749cb33beabd9aa6d3178e3de05bcc914f70b2bf"
@@ -343,6 +386,58 @@
   revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475"
   version = "v0.3.2"
 
+[[projects]]
+  digest = "1:15d017551627c8bb091bde628215b2861bed128855343fdd570c62d08871f6e1"
+  name = "gopkg.in/alecthomas/kingpin.v2"
+  packages = ["."]
+  pruneopts = ""
+  revision = "947dcec5ba9c011838740e680966fd7087a71d0d"
+  version = "v2.2.6"
+
+[[projects]]
+  digest = "1:fccda34e4c58111b1908d8d69bf8d57c41c8e2542bc18ec8cd38c4fa21057f71"
+  name = "golang.org/x/text"
+  packages = [
+    "collate",
+    "collate/build",
+    "internal/colltab",
+    "internal/gen",
+    "internal/language",
+    "internal/language/compact",
+    "internal/tag",
+    "internal/triegen",
+    "internal/ucd",
+    "language",
+    "secure/bidirule",
+    "transform",
+    "unicode/bidi",
+    "unicode/cldr",
+    "unicode/norm",
+    "unicode/rangetable",
+  ]
+  pruneopts = ""
+  revision = "23ae387dee1f90d29a23c0e87ee0b46038fbed0e"
+  version = "v0.3.3"
+
+[[projects]]
+  digest = "1:75fb3fcfc73a8c723efde7777b40e8e8ff9babf30d8c56160d01beffea8a95a6"
+  name = "gopkg.in/inf.v0"
+  packages = ["."]
+  pruneopts = ""
+  revision = "d2d2541c53f18d2a059457998ce2876cc8e67cbf"
+  version = "v0.9.1"
+
+[[projects]]
+  branch = "v2"
+  digest = "1:e56755c5336ff37d20befca76df29097085c85ea1fe58af746e3df6b815decfa"
+  name = "gopkg.in/mgo.v2"
+  packages = [
+    "bson",
+    "internal/json",
+  ]
+  pruneopts = ""
+  revision = "a6b53ec6cb22a3699387a57a161566f9402ee85b"
+
 [[projects]]
   branch = "v3"
   digest = "1:2e9c4d6def1d36dcd17730e00c06b49a2e97ea5e1e639bcd24fa60fa43e33ad6"
@@ -351,6 +446,52 @@
   pruneopts = ""
   revision = "eeeca48fe7764f320e4870d231902bf9c1be2c08"
 
+[[projects]]
+  digest = "1:a249e341b9bf261a982ab262c69f08223e839302d0a21cfe6e00f2ef2e8695a2"
+  name = "k8s.io/api"
+  packages = ["core/v1"]
+  pruneopts = ""
+  revision = "f822fed505d4c9dd4eb2c5f4ca2f4c49c19ea394"
+  version = "v0.18.6"
+
+[[projects]]
+  digest = "1:74eeecf1188777314a92348555adcb977912d530269130143daf7fc0e80bb512"
+  name = "k8s.io/apimachinery"
+  packages = [
+    "pkg/api/resource",
+    "pkg/apis/meta/v1",
+    "pkg/conversion",
+    "pkg/conversion/queryparams",
+    "pkg/fields",
+    "pkg/labels",
+    "pkg/runtime",
+    "pkg/runtime/schema",
+    "pkg/selection",
+    "pkg/types",
+    "pkg/util/errors",
+    "pkg/util/intstr",
+    "pkg/util/json",
+    "pkg/util/naming",
+    "pkg/util/net",
+    "pkg/util/runtime",
+    "pkg/util/sets",
+    "pkg/util/validation",
+    "pkg/util/validation/field",
+    "pkg/watch",
+    "third_party/forked/golang/reflect",
+  ]
+  pruneopts = ""
+  revision = "fbe88689c3c2735e949f67884a4f58cb99379159"
+  version = "v0.17.9"
+
+[[projects]]
+  digest = "1:5ad0a3bf1b13f9b8bd99f4079c635cb813d87b70db65b98fe5503762e1d39735"
+  name = "k8s.io/klog"
+  packages = ["."]
+  pruneopts = ""
+  revision = "b5c3182dac44f851522e32c97c86ac32755c296d"
+  version = "v2.3.0"
+
 [solve-meta]
   analyzer-name = "dep"
   analyzer-version = 1
@@ -368,6 +509,7 @@
     "github.com/pborman/getopt",
     "github.com/percona/go-mysql/query",
     "github.com/pkg/errors",
+    "github.com/prometheus/common/log",
     "github.com/shirou/gopsutil/process",
     "github.com/sirupsen/logrus",
     "github.com/stretchr/testify/assert",
@@ -377,6 +519,9 @@
     "go.mongodb.org/mongo-driver/mongo",
     "go.mongodb.org/mongo-driver/mongo/options",
     "golang.org/x/crypto/ssh/terminal",
+    "gopkg.in/mgo.v2/bson",
+    "gopkg.in/mgo.v2/dbtest",
+    "k8s.io/api/core/v1",
   ]
   solver-name = "gps-cdcl"
   solver-version = 1
diff --git a/Gopkg.toml b/Gopkg.toml
index b8bc287..1457c93 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -24,4 +24,4 @@
 
 [[constraint]]
   name = "github.com/shirou/gopsutil"
-  version = "2.17.11"
+  version = "2.20.8"
diff --git a/Makefile.PL b/Makefile.PL
index 2add783..754b6a5 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -2,7 +2,7 @@ use ExtUtils::MakeMaker;
 
 WriteMakefile(
     NAME      => 'percona-toolkit',
-    VERSION   => '3.2.1',
+    VERSION   => '3.3.1',
     EXE_FILES => [ <bin/*> ],
     MAN1PODS  => {
       'docs/percona-toolkit.pod' => 'blib/man1/percona-toolkit.1p',
diff --git a/bin/pt-align b/bin/pt-align
index b3b67e7..d4031a3 100755
--- a/bin/pt-align
+++ b/bin/pt-align
@@ -1359,6 +1359,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-align 3.2.1
+pt-align 3.3.1
 
 =cut
diff --git a/bin/pt-archiver b/bin/pt-archiver
index 2f2cfc8..e084acf 100755
--- a/bin/pt-archiver
+++ b/bin/pt-archiver
@@ -45,7 +45,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -2018,9 +2018,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -6970,6 +6971,7 @@ sub main {
                   }  
                   sleep($o->get('check-interval'));
                   $lag = $ms->get_slave_lag($lag_dbh);
+                  commit($o, $txnsize || $commit_each);
                   $src->{dbh}->do("SELECT 'pt-archiver keepalive'") if $src;
                   $dst->{dbh}->do("SELECT 'pt-archiver keepalive'") if $dst;
                }
@@ -8654,6 +8656,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-archiver 3.2.1
+pt-archiver 3.3.1
 
 =cut
diff --git a/bin/pt-config-diff b/bin/pt-config-diff
index 5d0fea5..0baa169 100755
--- a/bin/pt-config-diff
+++ b/bin/pt-config-diff
@@ -43,7 +43,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -5912,6 +5912,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-config-diff 3.2.1
+pt-config-diff 3.3.1
 
 =cut
diff --git a/bin/pt-deadlock-logger b/bin/pt-deadlock-logger
index 0bbe677..769f1e2 100755
--- a/bin/pt-deadlock-logger
+++ b/bin/pt-deadlock-logger
@@ -42,7 +42,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -5702,6 +5702,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-deadlock-logger 3.2.1
+pt-deadlock-logger 3.3.1
 
 =cut
diff --git a/bin/pt-diskstats b/bin/pt-diskstats
index c887d34..f35a09f 100755
--- a/bin/pt-diskstats
+++ b/bin/pt-diskstats
@@ -38,7 +38,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -5677,6 +5677,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-diskstats 3.2.1
+pt-diskstats 3.3.1
 
 =cut
diff --git a/bin/pt-duplicate-key-checker b/bin/pt-duplicate-key-checker
index 379694e..8e6f98a 100755
--- a/bin/pt-duplicate-key-checker
+++ b/bin/pt-duplicate-key-checker
@@ -39,7 +39,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -405,9 +405,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -5765,6 +5766,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-duplicate-key-checker 3.2.1
+pt-duplicate-key-checker 3.3.1
 
 =cut
diff --git a/bin/pt-fifo-split b/bin/pt-fifo-split
index 84a6355..96453ef 100755
--- a/bin/pt-fifo-split
+++ b/bin/pt-fifo-split
@@ -1648,6 +1648,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-fifo-split 3.2.1
+pt-fifo-split 3.3.1
 
 =cut
diff --git a/bin/pt-find b/bin/pt-find
index f85a39a..0067cea 100755
--- a/bin/pt-find
+++ b/bin/pt-find
@@ -35,7 +35,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -1955,9 +1955,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -5126,6 +5127,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-find 3.2.1
+pt-find 3.3.1
 
 =cut
diff --git a/bin/pt-fingerprint b/bin/pt-fingerprint
index 39360be..73df06b 100755
--- a/bin/pt-fingerprint
+++ b/bin/pt-fingerprint
@@ -2239,6 +2239,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-fingerprint 3.2.1
+pt-fingerprint 3.3.1
 
 =cut
diff --git a/bin/pt-fk-error-logger b/bin/pt-fk-error-logger
index a5f5c97..2f2707b 100755
--- a/bin/pt-fk-error-logger
+++ b/bin/pt-fk-error-logger
@@ -37,7 +37,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -4688,6 +4688,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-fk-error-logger 3.2.1
+pt-fk-error-logger 3.3.1
 
 =cut
diff --git a/bin/pt-heartbeat b/bin/pt-heartbeat
index ea2efcb..dd2298d 100755
--- a/bin/pt-heartbeat
+++ b/bin/pt-heartbeat
@@ -44,7 +44,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -3630,9 +3630,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -5947,6 +5948,7 @@ sub main {
 
    $dbh->{InactiveDestroy}  = 1; # Don't disconnect on fork
    $dbh->{FetchHashKeyName} = 'NAME_lc';
+   $dbh->{mysql_auto_reconnect} = 1;
    $dbh->do("USE `$db`");
 
    # ########################################################################
@@ -7384,6 +7386,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-heartbeat 3.2.1
+pt-heartbeat 3.3.1
 
 =cut
diff --git a/bin/pt-index-usage b/bin/pt-index-usage
index b245cc7..2f6a5ad 100755
--- a/bin/pt-index-usage
+++ b/bin/pt-index-usage
@@ -45,7 +45,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -3194,9 +3194,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -7695,6 +7696,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-index-usage 3.2.1
+pt-index-usage 3.3.1
 
 =cut
diff --git a/bin/pt-ioprofile b/bin/pt-ioprofile
index 5e9dc69..ce0d344 100755
--- a/bin/pt-ioprofile
+++ b/bin/pt-ioprofile
@@ -1127,7 +1127,7 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-ioprofile 3.2.1
+pt-ioprofile 3.3.1
 
 =cut
 
diff --git a/bin/pt-kill b/bin/pt-kill
index 28870a6..0fdc003 100755
--- a/bin/pt-kill
+++ b/bin/pt-kill
@@ -47,7 +47,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -3020,9 +3020,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -8554,6 +8555,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-kill 3.2.1
+pt-kill 3.3.1
 
 =cut
diff --git a/bin/pt-mext b/bin/pt-mext
index 7963d7b..893cba7 100755
--- a/bin/pt-mext
+++ b/bin/pt-mext
@@ -804,7 +804,7 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-mext 3.2.1
+pt-mext 3.3.1
 
 =cut
 
diff --git a/bin/pt-mysql-summary b/bin/pt-mysql-summary
index 16fc637..cb54263 100755
--- a/bin/pt-mysql-summary
+++ b/bin/pt-mysql-summary
@@ -3289,7 +3289,7 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-mysql-summary 3.2.1
+pt-mysql-summary 3.3.1
 
 =cut
 
diff --git a/bin/pt-online-schema-change b/bin/pt-online-schema-change
index 8c9ffe7..0a4a807 100755
--- a/bin/pt-online-schema-change
+++ b/bin/pt-online-schema-change
@@ -56,7 +56,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -130,13 +130,13 @@ sub cmp {
    $v1 =~ s/[^\d\.]//;
    $v2 =~ s/[^\d\.]//;
 
-   my @a = ( $v1 =~ /(\d+)\.?/g ); 
-   my @b = ( $v2 =~ /(\d+)\.?/g ); 
+   my @a = ( $v1 =~ /(\d+)\.?/g );
+   my @b = ( $v2 =~ /(\d+)\.?/g );
    foreach my $n1 (@a) {
       $n1 += 0; #convert to number
       if (!@b) {
          return 1;
-      }  
+      }
       my $n2 = shift @b;
       $n2 += 0; # convert to number
       if ($n1 == $n2) {
@@ -144,8 +144,8 @@ sub cmp {
       }
       else {
          return $n1 <=> $n2;
-      }  
-   }  
+      }
+   }
    return @b ? -1 : 0;
 }
 
@@ -220,7 +220,7 @@ sub new {
       rules             => [],  # desc of rules for --help
       mutex             => [],  # rule: opts are mutually exclusive
       atleast1          => [],  # rule: at least one opt is required
-      disables          => {},  # rule: opt disables other opts 
+      disables          => {},  # rule: opt disables other opts
       defaults_to       => {},  # rule: opt defaults to value of other opt
       DSNParser         => undef,
       default_files     => [
@@ -383,7 +383,7 @@ sub _pod_to_specs {
          }
 
          push @specs, {
-            spec  => $self->{parse_attributes}->($self, $option, \%attribs), 
+            spec  => $self->{parse_attributes}->($self, $option, \%attribs),
             desc  => $para
                . (defined $attribs{default} ? " (default $attribs{default})" : ''),
             group => ($attribs{'group'} ? $attribs{'group'} : 'default'),
@@ -474,7 +474,7 @@ sub _parse_specs {
          $self->{opts}->{$long} = $opt;
       }
       else { # It's an option rule, not a spec.
-         PTDEBUG && _d('Parsing rule:', $opt); 
+         PTDEBUG && _d('Parsing rule:', $opt);
          push @{$self->{rules}}, $opt;
          my @participants = $self->_get_participants($opt);
          my $rule_ok = 0;
@@ -519,7 +519,7 @@ sub _parse_specs {
       PTDEBUG && _d('Option', $long, 'disables', @participants);
    }
 
-   return; 
+   return;
 }
 
 sub _get_participants {
@@ -606,7 +606,7 @@ sub _set_option {
 }
 
 sub get_opts {
-   my ( $self ) = @_; 
+   my ( $self ) = @_;
 
    foreach my $long ( keys %{$self->{opts}} ) {
       $self->{opts}->{$long}->{got} = 0;
@@ -737,7 +737,7 @@ sub _check_opts {
                   else {
                      $err = join(', ',
                                map { "--$self->{opts}->{$_}->{long}" }
-                               grep { $_ } 
+                               grep { $_ }
                                @restricted_opts[0..scalar(@restricted_opts) - 2]
                             )
                           . ' or --'.$self->{opts}->{$restricted_opts[-1]}->{long};
@@ -747,7 +747,7 @@ sub _check_opts {
             }
 
          }
-         elsif ( $opt->{is_required} ) { 
+         elsif ( $opt->{is_required} ) {
             $self->save_error("Required option --$long must be specified");
          }
 
@@ -1131,7 +1131,7 @@ sub clone {
       $clone{$scalar} = $self->{$scalar};
    }
 
-   return bless \%clone;     
+   return bless \%clone;
 }
 
 sub _parse_size {
@@ -1646,7 +1646,7 @@ sub extends {
 
 sub _load_module {
    my ($class) = @_;
-   
+
    (my $file = $class) =~ s{::|'}{/}g;
    $file .= '.pm';
    { local $@; eval { require "$file" } } # or warn $@;
@@ -1677,7 +1677,7 @@ sub has {
    my $caller = scalar caller();
 
    my $class_metadata = Lmo::Meta->metadata_for($caller);
-   
+
    for my $attribute ( ref $names ? @$names : $names ) {
       my %args   = @_;
       my $method = ($args{is} || '') eq 'ro'
@@ -1696,16 +1696,16 @@ sub has {
 
       if ( my $type_check = $args{isa} ) {
          my $check_name = $type_check;
-         
+
          if ( my ($aggregate_type, $inner_type) = $type_check =~ /\A(ArrayRef|Maybe)\[(.*)\]\z/ ) {
             $type_check = Lmo::Types::_nested_constraints($attribute, $aggregate_type, $inner_type);
          }
-         
+
          my $check_sub = sub {
             my ($new_val) = @_;
             Lmo::Types::check_type_constaints($attribute, $type_check, $check_name, $new_val);
          };
-         
+
          $class_metadata->{$attribute}{isa} = [$check_name, $check_sub];
          my $orig_method = $method;
          $method = sub {
@@ -2199,7 +2199,7 @@ sub parse {
    foreach my $key ( keys %$opts ) {
       PTDEBUG && _d('Finding value for', $key);
       $final_props{$key} = $given_props{$key};
-      if ( !defined $final_props{$key}  
+      if ( !defined $final_props{$key}
            && defined $prev->{$key} && $opts->{$key}->{copy} )
       {
          $final_props{$key} = $prev->{$key};
@@ -2339,7 +2339,7 @@ sub get_dbh {
    my $dbh;
    my $tries = 2;
    while ( !$dbh && $tries-- ) {
-      PTDEBUG && _d($cxn_string, ' ', $user, ' ', $pass, 
+      PTDEBUG && _d($cxn_string, ' ', $user, ' ', $pass,
          join(', ', map { "$_=>$defaults->{$_}" } keys %$defaults ));
 
       $dbh = eval { DBI->connect($cxn_string, $user, $pass, $defaults) };
@@ -2537,7 +2537,7 @@ sub set_vars {
       }
    }
 
-   return; 
+   return;
 }
 
 sub _d {
@@ -2618,7 +2618,7 @@ sub run {
          $parent_exit->($child_pid) if $parent_exit;
          exit 0;
       }
- 
+
       POSIX::setsid() or die "Cannot start a new session: $OS_ERROR";
       chdir '/'       or die "Cannot chdir to /: $OS_ERROR";
 
@@ -2644,7 +2644,7 @@ sub run {
 
          close STDERR;
          open  STDERR, ">&STDOUT"
-            or die "Cannot dupe STDERR to STDOUT: $OS_ERROR"; 
+            or die "Cannot dupe STDERR to STDOUT: $OS_ERROR";
       }
       else {
          if ( -t STDOUT ) {
@@ -2682,7 +2682,7 @@ sub _make_pid_file {
    eval {
       sysopen(PID_FH, $pid_file, O_RDWR|O_CREAT|O_EXCL) or die $OS_ERROR;
       print PID_FH $PID, "\n";
-      close PID_FH; 
+      close PID_FH;
    };
    if ( my $e = $EVAL_ERROR ) {
       if ( $e =~ m/file exists/i ) {
@@ -2869,7 +2869,7 @@ sub split_unquote {
       s/`\z//;
       s/``/`/g;
    }
-   
+
    return ($db, $tbl);
 }
 
@@ -2999,7 +2999,7 @@ sub generate_asc_stmt {
 
    die "Index '$index' does not exist in table"
       unless exists $tbl_struct->{keys}->{$index};
-   PTDEBUG && _d('Will ascend index', $index);  
+   PTDEBUG && _d('Will ascend index', $index);
 
    my @asc_cols = @{$tbl_struct->{keys}->{$index}->{cols}};
    if ( $args{asc_first} ) {
@@ -3388,9 +3388,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -3914,7 +3915,7 @@ sub new {
    };
    my ($dp, $o) = @args{@required_args};
 
-   my $dsn_defaults = $dp->parse_options($o);  
+   my $dsn_defaults = $dp->parse_options($o);
    my $prev_dsn     = $args{prev_dsn};
    my $dsn          = $args{dsn};
    if ( !$dsn ) {
@@ -4053,7 +4054,7 @@ sub get_id {
       my $sql  = q{SHOW STATUS LIKE 'wsrep\_local\_index'};
       my (undef, $wsrep_local_index) = $cxn->dbh->selectrow_array($sql);
       PTDEBUG && _d("Got cluster wsrep_local_index: ",$wsrep_local_index);
-      $unique_id = $wsrep_local_index."|"; 
+      $unique_id = $wsrep_local_index."|";
       foreach my $val ('server\_id', 'wsrep\_sst\_receive\_address', 'wsrep\_node\_name', 'wsrep\_node\_address') {
          my $sql = "SHOW VARIABLES LIKE '$val'";
          PTDEBUG && _d($cxn->name, $sql);
@@ -4083,7 +4084,7 @@ sub is_cluster_node {
       PTDEBUG && _d($sql); #don't invoke name() if it's not a Cxn!
    }
    else {
-      $dbh = $cxn->dbh();      
+      $dbh = $cxn->dbh();
       PTDEBUG && _d($cxn->name, $sql);
    }
 
@@ -4166,22 +4167,22 @@ use warnings FATAL => 'all';
 use English qw(-no_match_vars);
 use constant PTDEBUG => $ENV{PTDEBUG} || 0;
 
-sub check_recursion_method {                                                       
+sub check_recursion_method {
    my ($methods) = @_;
-   if ( @$methods != 1 ) {                                                         
-      if ( grep({ !m/processlist|hosts/i } @$methods)                              
-            && $methods->[0] !~ /^dsn=/i ) 
-      {     
-         die  "Invalid combination of recursion methods: "                         
-            . join(", ", map { defined($_) ? $_ : 'undef' } @$methods) . ". "      
-            . "Only hosts and processlist may be combined.\n"                      
-      }                                                                            
-   }     
-   else {   
+   if ( @$methods != 1 ) {
+      if ( grep({ !m/processlist|hosts/i } @$methods)
+            && $methods->[0] !~ /^dsn=/i )
+      {
+         die  "Invalid combination of recursion methods: "
+            . join(", ", map { defined($_) ? $_ : 'undef' } @$methods) . ". "
+            . "Only hosts and processlist may be combined.\n"
+      }
+   }
+   else {
       my ($method) = @$methods;
-      die "Invalid recursion method: " . ( $method || 'undef' )                    
-         unless $method && $method =~ m/^(?:processlist$|hosts$|none$|cluster$|dsn=)/i;     
-   }                                                                               
+      die "Invalid recursion method: " . ( $method || 'undef' )
+         unless $method && $method =~ m/^(?:processlist$|hosts$|none$|cluster$|dsn=)/i;
+   }
 }
 
 sub new {
@@ -4210,7 +4211,7 @@ sub get_slaves {
    my $methods = $self->_resolve_recursion_methods($args{dsn});
 
    return $slaves unless @$methods;
-   
+
    if ( grep { m/processlist|hosts/i } @$methods ) {
       my @required_args = qw(dbh dsn);
       foreach my $arg ( @required_args ) {
@@ -4223,7 +4224,7 @@ sub get_slaves {
          {  dbh            => $dbh,
             dsn            => $dsn,
             slave_user     => $o->got('slave-user') ? $o->get('slave-user') : '',
-            slave_password => $o->got('slave-password') ? $o->get('slave-password') : '', 
+            slave_password => $o->got('slave-password') ? $o->get('slave-password') : '',
             callback  => sub {
                my ( $dsn, $dbh, $level, $parent ) = @_;
                return unless $level;
@@ -4792,7 +4793,7 @@ sub short_host {
 }
 
 sub is_replication_thread {
-   my ( $self, $query, %args ) = @_; 
+   my ( $self, $query, %args ) = @_;
    return unless $query;
 
    my $type = lc($args{type} || 'all');
@@ -4807,7 +4808,7 @@ sub is_replication_thread {
    if ( !$match ) {
       if ( ($query->{User} || $query->{user} || '') eq "system user" ) {
          PTDEBUG && _d("Slave replication thread");
-         if ( $type ne 'all' ) { 
+         if ( $type ne 'all' ) {
             my $state = $query->{State} || $query->{state} || '';
 
             if ( $state =~ m/^init|end$/ ) {
@@ -4820,7 +4821,7 @@ sub is_replication_thread {
                    |Reading\sevent\sfrom\sthe\srelay\slog
                    |Has\sread\sall\srelay\slog;\swaiting
                    |Making\stemp\sfile
-                   |Waiting\sfor\sslave\smutex\son\sexit)/xi; 
+                   |Waiting\sfor\sslave\smutex\son\sexit)/xi;
 
                $match = $type eq 'slave_sql' &&  $slave_sql ? 1
                       : $type eq 'slave_io'  && !$slave_sql ? 1
@@ -4884,7 +4885,7 @@ sub get_replication_filters {
          replicate_do_db
          replicate_ignore_db
          replicate_do_table
-         replicate_ignore_table 
+         replicate_ignore_table
          replicate_wild_do_table
          replicate_wild_ignore_table
       );
@@ -4895,7 +4896,7 @@ sub get_replication_filters {
       $filters{slave_skip_errors} = $row->[1] if $row->[1] && $row->[1] ne 'OFF';
    }
 
-   return \%filters; 
+   return \%filters;
 }
 
 
@@ -5178,9 +5179,9 @@ sub new {
    my $self = {
       %args
    };
-   
-   $self->{last_time} = time();   
-   
+
+   $self->{last_time} = time();
+
    my (undef, $last_fc_ns) = $self->{node}->selectrow_array('SHOW STATUS LIKE "wsrep_flow_control_paused_ns"');
 
    $self->{last_fc_secs} = $last_fc_ns/1000_000_000;
@@ -5216,11 +5217,11 @@ sub wait {
       my $current_time = time();
       my (undef, $current_fc_ns) = $node->selectrow_array('SHOW STATUS LIKE "wsrep_flow_control_paused_ns"');
       my $current_fc_secs = $current_fc_ns/1000_000_000;
-      my $current_avg = ($current_fc_secs - $self->{last_fc_secs}) / ($current_time - $self->{last_time});  
-      if ( $current_avg > $max_avg ) { 
+      my $current_avg = ($current_fc_secs - $self->{last_fc_secs}) / ($current_time - $self->{last_time});
+      if ( $current_avg > $max_avg ) {
          if ( $pr ) {
             $pr->update(sub { return 0; });
-         } 
+         }
          PTDEBUG && _d('Calling sleep callback');
          if ( $self->{simple_progress} ) {
             print STDERR "Waiting for Flow Control to abate\n";
@@ -5335,7 +5336,7 @@ sub _parse_spec {
       }
    }
 
-   return \%max_val_for; 
+   return \%max_val_for;
 }
 
 sub max_values {
@@ -5622,7 +5623,7 @@ sub new {
 
 sub switch_to_nibble {
     my $self = shift;
-    my $params = _nibble_params($self->{nibble_params}, $self->{tbl}, $self->{args}, $self->{cols}, 
+    my $params = _nibble_params($self->{nibble_params}, $self->{tbl}, $self->{args}, $self->{cols},
                                 $self->{chunk_size}, $self->{where}, $self->{comments}, $self->{Quoter});
 
     $self->{one_nibble}           = 0;
@@ -5659,7 +5660,7 @@ sub _one_nibble {
       my $explain_nibble_sql
          = "EXPLAIN SELECT "
          . ($args->{select} ? $args->{select}
-                          : join(', ', map{ $tbl->{tbl_struct}->{type_for}->{$_} eq 'enum' 
+                          : join(', ', map{ $tbl->{tbl_struct}->{type_for}->{$_} eq 'enum'
                           ? "CAST(".$q->quote($_)." AS UNSIGNED)" : $q->quote($_) } @$cols))
          . " FROM $tbl->{name}"
          . ($where ? " WHERE $where" : '')
@@ -5756,7 +5757,7 @@ sub _nibble_params {
          . " /*$comments->{nibble}*/";
       PTDEBUG && _d('Nibble statement:', $nibble_sql);
 
-      my $explain_nibble_sql 
+      my $explain_nibble_sql
          = "EXPLAIN SELECT "
          . ($args->{select} ? $args->{select}
                           : join(', ', map { $q->quote($_) } @{$asc->{cols}}))
@@ -5845,7 +5846,7 @@ sub next {
             sleep($self->{sleep});
          }
       }
-  
+
       if ( !$self->{have_rows} ) {
          $self->{nibbleno}++;
          PTDEBUG && _d('Nibble:', $self->{nibble_sth}->{Statement}, 'params:',
@@ -5875,7 +5876,7 @@ sub next {
       }
       $self->{rowno}     = 0;
       $self->{have_rows} = 0;
-      
+
    }
 
    PTDEBUG && _d('Done nibbling');
@@ -6012,7 +6013,7 @@ sub can_nibble {
    }
 
    my $pause_file = ($o->has('pause-file') && $o->get('pause-file')) || undef;
-   
+
    return {
       row_est     => $row_est,      # nibble about this many rows
       index       => $index,        # using this index
@@ -6057,7 +6058,7 @@ sub _find_best_index {
          push @possible_indexes, $want_index;
       }
    }
-   
+
    if (!$best_index) {
       PTDEBUG && _d('Auto-selecting best index');
       foreach my $index ( $tp->sort_indexes($tbl_struct) ) {
@@ -6155,7 +6156,7 @@ sub _prepare_sths {
    return;
 }
 
-sub _get_bounds { 
+sub _get_bounds {
    my ($self) = @_;
 
    if ( $self->{one_nibble} ) {
@@ -6168,7 +6169,7 @@ sub _get_bounds {
    my $dbh = $self->{Cxn}->dbh();
 
    $self->{first_lower} = $dbh->selectrow_arrayref($self->{first_lb_sql});
-   PTDEBUG && _d('First lower boundary:', Dumper($self->{first_lower}));  
+   PTDEBUG && _d('First lower boundary:', Dumper($self->{first_lower}));
 
    if ( my $nibble = $self->{resume} ) {
       if (    defined $nibble->{lower_boundary}
@@ -6182,9 +6183,9 @@ sub _get_bounds {
       }
    }
    else {
-      $self->{next_lower}  = $self->{first_lower};   
+      $self->{next_lower}  = $self->{first_lower};
    }
-   PTDEBUG && _d('Next lower boundary:', Dumper($self->{next_lower}));  
+   PTDEBUG && _d('Next lower boundary:', Dumper($self->{next_lower}));
 
    if ( !$self->{next_lower} ) {
       PTDEBUG && _d('At end of table, or no more boundaries to resume');
@@ -6270,7 +6271,7 @@ sub _next_boundaries {
       $self->{upper} = $dbh->selectrow_arrayref($self->{last_ub_sql});
       PTDEBUG && _d('Last upper boundary:', Dumper($self->{upper}));
       $self->{no_more_boundaries} = 1;  # for next call
-      
+
       $self->{last_upper} = $self->{upper};
    }
    $self->{ub_sth}->finish();
@@ -6620,7 +6621,7 @@ sub value_to_json {
 
    my $b_obj = B::svref_2object(\$value);  # for round trip problem
    my $flags = $b_obj->FLAGS;
-   return $value # as is 
+   return $value # as is
       if $flags & ( B::SVp_IOK | B::SVp_NOK ) and !( $flags & B::SVp_POK ); # SvTYPE is IV or NV?
 
    my $type = ref($value);
@@ -7128,7 +7129,7 @@ sub _split_url {
                   or die(qq/SSL certificate not valid for $host\n/);
             }
        }
-         
+
        $self->{host} = $host;
        $self->{port} = $port;
 
@@ -7603,7 +7604,7 @@ my @vc_dirs = (
       }
       PTDEBUG && _d('Version check file', $file, 'in', $ENV{PWD});
       return $file;  # in the CWD
-   } 
+   }
 }
 
 sub version_check_time_limit {
@@ -7620,11 +7621,11 @@ sub version_check {
    PTDEBUG && _d('FindBin::Bin:', $FindBin::Bin);
    if ( !$args{force} ) {
       if ( $FindBin::Bin
-           && (-d "$FindBin::Bin/../.bzr"    || 
+           && (-d "$FindBin::Bin/../.bzr"    ||
                -d "$FindBin::Bin/../../.bzr" ||
-               -d "$FindBin::Bin/../.git"    || 
-               -d "$FindBin::Bin/../../.git" 
-              ) 
+               -d "$FindBin::Bin/../.git"    ||
+               -d "$FindBin::Bin/../../.git"
+              )
          ) {
          PTDEBUG && _d("$FindBin::Bin/../.bzr disables --version-check");
          return;
@@ -7648,7 +7649,7 @@ sub version_check {
       PTDEBUG && _d(scalar @$instances_to_check, 'instances to check');
       return unless @$instances_to_check;
 
-      my $protocol = 'https';  
+      my $protocol = 'https';
       eval { require IO::Socket::SSL; };
       if ( $EVAL_ERROR ) {
          PTDEBUG && _d($EVAL_ERROR);
@@ -7825,7 +7826,7 @@ sub get_uuid {
     close $fh;
 
     return $uuid;
-}   
+}
 
 sub _generate_uuid {
     return sprintf+($}="%04x")."$}-$}-$}-$}-".$}x3,map rand 65537,0..7;
@@ -7874,7 +7875,7 @@ sub pingback {
    );
    die "Failed to parse server requested programs: $response->{content}"
       if !scalar keys %$items;
-      
+
    my $versions = get_versions(
       items     => $items,
       instances => $instances,
@@ -8133,7 +8134,7 @@ sub get_from_mysql {
    if ($item->{item} eq 'MySQL' && $item->{type} eq 'mysql_variable') {
       @{$item->{vars}} = grep { $_ eq 'version' || $_ eq 'version_comment' } @{$item->{vars}};
    }
- 
+
 
    my @versions;
    my %version_for;
@@ -8238,7 +8239,7 @@ sub find_cluster_nodes {
    my $dp  = $args{DSNParser};
    my $make_cxn = $args{make_cxn};
 
-   
+
    my $sql = q{SHOW STATUS LIKE 'wsrep\_incoming\_addresses'};
    PTDEBUG && _d($sql);
    my (undef, $addresses) = $dbh->selectrow_array($sql);
@@ -8318,7 +8319,7 @@ sub autodetect_nodes {
    my $new_nodes = [];
 
    return $new_nodes unless @$nodes;
-   
+
    for my $node ( @$nodes ) {
       my $nodes_found = $self->find_cluster_nodes(
          dbh       => $node->dbh(),
@@ -8350,12 +8351,12 @@ sub autodetect_nodes {
    );
 
    my @new_slave_nodes = grep { $self->is_cluster_node($_) } @$new_slaves;
-   
+
    my $slaves_of_slaves = $self->autodetect_nodes(
          %args,
          nodes => \@new_slave_nodes,
    );
-   
+
    my @autodetected_nodes = ( @$new_nodes, @$new_slaves, @$slaves_of_slaves );
    return \@autodetected_nodes;
 }
@@ -8387,6 +8388,7 @@ package pt_online_schema_change;
 
 use strict;
 use warnings FATAL => 'all';
+use utf8;
 use English qw(-no_match_vars);
 
 use Percona::Toolkit;
@@ -8423,7 +8425,7 @@ my $triggers_info = [];
 # Completely ignore these error codes.
 my %ignore_code = (
    # Error: 1592 SQLSTATE: HY000  (ER_BINLOG_UNSAFE_STATEMENT)
-   # Message: Statement may not be safe to log in statement format. 
+   # Message: Statement may not be safe to log in statement format.
    # Ignore this warning because we have purposely set statement-based
    # replication.
    1592 => 1,
@@ -8436,25 +8438,26 @@ my %ignore_code = (
 $OUTPUT_AUTOFLUSH = 1;
 
 use constant {
-   INVALID_PARAMETERS        => 1,
-   UNSUPORTED_MYSQL_VERSION  => 2,
-   NO_MINIMUM_REQUIREMENTS   => 3,
-   NO_PRIMARY_OR_UNIQUE_KEY  => 4,
-   INVALID_PLUGIN_FILE       => 5,
-   INVALID_ALTER_FK_METHOD   => 6,
-   INVALID_KEY_SIZE          => 7,
-   CANNOT_DETERMINE_KEY_SIZE => 9,
-   NOT_SAFE_TO_ASCEND        => 9,
-   ERROR_CREATING_NEW_TABLE  => 10,
-   ERROR_ALTERING_TABLE      => 11,
-   ERROR_CREATING_TRIGGERS   => 12,
-   ERROR_RESTORING_TRIGGERS  => 13,
-   ERROR_SWAPPING_TABLES     => 14,
-   ERROR_UPDATING_FKS        => 15,
-   ERROR_DROPPING_OLD_TABLE  => 16,
-   UNSUPORTED_OPERATION      => 17,
-   MYSQL_CONNECTION_ERROR    => 18,
-   LOST_MYSQL_CONNECTION     => 19,
+   INVALID_PARAMETERS              => 1,
+   UNSUPORTED_MYSQL_VERSION        => 2,
+   NO_MINIMUM_REQUIREMENTS         => 3,
+   NO_PRIMARY_OR_UNIQUE_KEY        => 4,
+   INVALID_PLUGIN_FILE             => 5,
+   INVALID_ALTER_FK_METHOD         => 6,
+   INVALID_KEY_SIZE                => 7,
+   CANNOT_DETERMINE_KEY_SIZE       => 9,
+   NOT_SAFE_TO_ASCEND              => 9,
+   ERROR_CREATING_NEW_TABLE        => 10,
+   ERROR_ALTERING_TABLE            => 11,
+   ERROR_CREATING_TRIGGERS         => 12,
+   ERROR_RESTORING_TRIGGERS        => 13,
+   ERROR_SWAPPING_TABLES           => 14,
+   ERROR_UPDATING_FKS              => 15,
+   ERROR_DROPPING_OLD_TABLE        => 16,
+   UNSUPORTED_OPERATION            => 17,
+   MYSQL_CONNECTION_ERROR          => 18,
+   LOST_MYSQL_CONNECTION           => 19,
+   ERROR_CREATING_REVERSE_TRIGGERS => 20,
 };
 
 sub _die {
@@ -8474,7 +8477,7 @@ sub main {
    @drop_trigger_sqls    = ();
    @triggers_not_dropped = ();
    $dont_interrupt_now   = 0;
-   %ignore_code = (1592 => 1, 1062 => 1);
+   %ignore_code = (1592 => 1, 1062 => 1, 1300 => 1);
 
    my %stats = (
       INSERT => 0,
@@ -8490,7 +8493,7 @@ sub main {
 
    if ( $o->get('null-to-not-null') ) {
       $ignore_code{1048} = 1;
-   } 
+   }
 
    my $dp = $o->DSNParser();
    $dp->prop('set-vars', $o->set_vars());
@@ -8506,7 +8509,7 @@ sub main {
       # Parse DSN string and convert it to a DSN data struct.
       $dsn = $dp->parse($dsn, $dp->parse_options($o));
       $db  = $dsn->{D};
-      $tbl = $dsn->{t};  
+      $tbl = $dsn->{t};
    }
 
    my $alter_fk_method = $o->get('alter-foreign-keys-method') || '';
@@ -8567,6 +8570,21 @@ sub main {
       $o->set('drop-triggers', 1);
    }
 
+   if ( $o->get('reverse-triggers') ) {
+       if ($o->get('drop-old-table')) {
+           my $msg = '--reverse-triggers needs --no-drop-old-table';
+           _die($msg, INVALID_PARAMETERS);
+       }
+       if (!$o->get('swap-tables')) {
+           my $msg = 'Cannot use --reverse-triggers with --no-swap-tables';
+           _die($msg, INVALID_PARAMETERS);
+       }
+       if ($o->get('preserve-triggers')) {
+           my $msg = 'Cannot use --reverse-triggers with --preserve-triggers';
+           _die($msg, INVALID_PARAMETERS);
+       }
+   }
+
    if ( !$o->get('help') ) {
       if ( @ARGV ) {
          $o->save_error('Specify only one DSN on the command line');
@@ -8600,7 +8618,7 @@ sub main {
          print STDERR "WARNING! Using alter-foreign-keys-method = \"none\". This will typically cause foreign key violations!\nThis method of handling foreign key constraints is only provided so that the database administrator can disable the tool’s built-in functionality if desired.\n\nContinue anyway? (y/N)";
          my $response;
          chomp($response = <STDIN>);
-         if ($response !~ /y|(yes)/i) { 
+         if ($response !~ /y|(yes)/i) {
             exit 1;
          }
       }
@@ -8617,7 +8635,7 @@ sub main {
       $o->save_error("Invalid --recursion-method: $EVAL_ERROR")
    }
 
-   $o->usage_or_errors(); 
+   $o->usage_or_errors();
 
    if ( $o->get('quiet') ) {
       # BARON: this will fail on Windows, where there is no /dev/null. I feel
@@ -8709,7 +8727,7 @@ sub main {
    # Check if MySQL is new enough to have the triggers we need.
    # Although triggers were introduced in 5.0.2, "Prior to MySQL 5.0.10,
    # triggers cannot contain direct references to tables by name."
-   # ########################################################################   
+   # ########################################################################
    my $server_version = VersionParser->new($cxn->dbh());
    if ( $server_version < '5.0.10' ) {
       _die("This tool requires MySQL 5.0.10 or newer.", UNSUPORTED_MYSQL_VERSION);
@@ -8753,7 +8771,7 @@ sub main {
 
    # ########################################################################
    # Create --plugin.
-   # ########################################################################   
+   # ########################################################################
    my $plugin;
    if ( my $file = $o->get('plugin') ) {
       _die("--plugin file $file does not exist", INVALID_PLUGIN_FILE) unless -f $file;
@@ -8779,7 +8797,7 @@ sub main {
 
    # ########################################################################
    # Setup lag and load monitors.
-   # ########################################################################   
+   # ########################################################################
    my $slaves;         # all slaves that are found or specified
    my $slave_lag_cxns; # slaves whose lag we'll check
    my $replica_lag;    # ReplicaLagWaiter object
@@ -8788,6 +8806,7 @@ sub main {
    my $flow_ctl_pr;    # Progress for FlowControlWaiter
    my $sys_load;       # MySQLStatusWaiter object
    my $sys_load_pr;    # Progress for MySQLStatusWaiter object
+   my $process_error;  # Used if drop_swap fails
 
    if ( $o->get('execute') ) {
       # #####################################################################
@@ -8921,7 +8940,7 @@ sub main {
       # #####################################################################
       # Make a ReplicaLagWaiter to help wait for slaves after each chunk.
       # Note: the "sleep" function is also used by MySQLStatusWaiter and
-      #       FlowControlWaiter 
+      #       FlowControlWaiter
       # #####################################################################
       my $sleep = sub {
          # Don't let the master dbh die while waiting for slaves because we
@@ -8942,13 +8961,13 @@ sub main {
       };
 
       my $get_lag;
-      # The plugin is able to override the slavelag check so tools like 
-      # pt-heartbeat or other replicators (Tungsten...) can be used to 
+      # The plugin is able to override the slavelag check so tools like
+      # pt-heartbeat or other replicators (Tungsten...) can be used to
       # measure replication lag
       if ( $plugin && $plugin->can('get_slave_lag') ) {
          $get_lag = $plugin->get_slave_lag(oktorun => \$oktorun);
       }
-      else {      
+      else {
          $get_lag = sub {
             my ($cxn) = @_;
             my $dbh = $cxn->dbh();
@@ -8964,7 +8983,7 @@ sub main {
                      $EVAL_ERROR);
                   die '2> Cannot connect to '. $cxn->name() . ':' . $EVAL_ERROR;
                   # Make ReplicaLagWaiter::wait() report slave is stopped.
-                  return undef; 
+                  return undef;
                }
             }
             my $lag;
@@ -9043,7 +9062,7 @@ sub main {
             spec    => $o->get('progress'),
             name    => "Waiting for --max-load", # not used
          );
-        
+
          if ( $pxc_version >= '5.6' && $o->got('max-flow-ctl') ) {
             $flow_ctl_pr = new Progress(
                jobsize => $o->get('max-flow-ctl'),
@@ -9109,7 +9128,7 @@ sub main {
          tbl    => $orig_tbl,
          Cxn    => $cxn,
          Quoter => $q,
-         only_same_schema_fks => $o->get('only-same-schema-fks'), 
+         only_same_schema_fks => $o->get('only-same-schema-fks'),
       );
 
    my $vp = VersionParser->new($cxn->dbh());
@@ -9131,7 +9150,7 @@ sub main {
          tbl    => $orig_tbl,
          Cxn    => $cxn,
          Quoter => $q,
-         only_same_schema_fks => $o->get('only-same-schema-fks'), 
+         only_same_schema_fks => $o->get('only-same-schema-fks'),
       );
       if ( !$child_tables ) {
          if ( $alter_fk_method ) {
@@ -9158,7 +9177,7 @@ sub main {
                $child_table->{name},
                $child_table->{row_est} || '?';
          }
-         
+
          # TODO: Fix self referencing foreign keys handling.
          # See: https://jira.percona.com/browse/PT-1802
          #      https://jira.percona.com/browse/PT-1853
@@ -9181,7 +9200,7 @@ sub main {
             print "You did not specify --alter-foreign-keys-method, but there "
                 . "are foreign keys that reference the table. "
                 . "Please read the tool's documentation carefully.\n";
-            return 1; 
+            return 1;
          }
       }
    }
@@ -9223,10 +9242,10 @@ sub main {
          #   at /Users/daniel/p/pt-osc-2.1.1/lib/PerconaTest.pm line 559.
          #                   ''
          #   doesn't match '(?-xism:Failed to find a unique new table name)'
-         
+
          # (*) Frank:  commented them out because it caused infinite loop
          # and the mentioned test error doesn't arise
-         
+
          my $original_error = $EVAL_ERROR;
 
          foreach my $task ( reverse @cleanup_tasks ) {
@@ -9329,7 +9348,7 @@ sub main {
 
    # ########################################################################
    # Init the --plugin.
-   # ########################################################################   
+   # ########################################################################
 
    # --plugin hook
    if ( $plugin && $plugin->can('init') ) {
@@ -9414,6 +9433,9 @@ sub main {
             . "cause MySQL error 1146 (42S02): \"Table $new_tbl->{name} "
             . " doesn't exist\".\n";
       }
+      elsif ($process_error) {
+          print "Not dropping new table because FKs processing has failed.\n";
+      }
       else {
          print ts("Dropping new table...\n");
          print $sql, "\n" if $o->get('print');
@@ -9490,7 +9512,7 @@ sub main {
          $cxn->dbh()->do($sql);
       };
       if ( $EVAL_ERROR ) {
-         # this is trapped by a signal handler. Don't replace it with _die 
+         # this is trapped by a signal handler. Don't replace it with _die
          die "Error altering new table $new_tbl->{name}: $EVAL_ERROR\n";
       }
       print "Altered $new_tbl->{name} OK.\n";
@@ -9671,6 +9693,41 @@ sub main {
       _die("Error creating triggers: $EVAL_ERROR", ERROR_CREATING_TRIGGERS);
    };
 
+   if ( $o->get('reverse-triggers') ) {
+       print "Adding reverse triggers\n";
+       eval {
+           my $old_tbl_name = '_'.$orig_tbl->{tbl}.'_old';
+           my $new_tbl_name = '_'.$orig_tbl->{tbl}.'_new';
+
+           my $old_tbl = {
+               db   => $orig_tbl->{db},
+               name => '`'.$orig_tbl->{db}.'`.`'.$old_tbl_name.'`',
+               tbl  => $old_tbl_name,
+           };
+           my $new_tbl = {
+               db   => $orig_tbl->{db},
+               name => '`'.$orig_tbl->{db}.'`.`'.$new_tbl_name.'`',
+               tbl  => $new_tbl_name,
+           };
+           my $triggers=create_triggers(
+               orig_tbl         => $new_tbl,
+               new_tbl          => $old_tbl,
+               del_tbl          => $orig_tbl,
+               columns          => \@common_cols,
+               Cxn              => $cxn,
+               Quoter           => $q,
+               OptionParser     => $o,
+               Retry            => $retry,
+               tries            => $tries,
+               stats            => \%stats,
+               reverse_triggers => 1,
+           );
+       };
+       if ( $EVAL_ERROR ) {
+          _die("Error creating reverse triggers: $EVAL_ERROR", ERROR_CREATING_REVERSE_TRIGGERS);
+       };
+   }
+
    # --plugin hook
    if ( $plugin && $plugin->can('after_create_triggers') ) {
       $plugin->after_create_triggers();
@@ -9786,7 +9843,7 @@ sub main {
                elsif ( !$key_len ) {
                   _die(ts("The key_len of the $key index is "
                      . (defined $key_len ? "zero" : "NULL")
-                     . ", but this should not be possible.  " 
+                     . ", but this should not be possible.  "
                      . "See --[no]check-plan in the documentation for more "
                      . "information."), INVALID_KEY_SIZE);
                }
@@ -9833,7 +9890,7 @@ sub main {
                          (@{$boundary->{lower}}, $nibble_iter->limit()))
                   . "\n";
                _die(ts($msg), NOT_SAFE_TO_ASCEND);
-            } 
+            }
          }
 
          # Once nibbling begins for a table, control does not return to this
@@ -9989,7 +10046,7 @@ sub main {
          nibble => "pt-online-schema-change $PID copy nibble",
       },
    );
- 
+
    # Init a new weighted avg rate calculator for the table.
    $orig_tbl->{rate} = new WeightedAvgRate(target_t => $chunk_time);
 
@@ -10023,7 +10080,7 @@ sub main {
    }
    $orig_tbl->{copied} = 1;  # flag for cleanup tasks
 
-   # XXX Auto-choose the alter fk method BEFORE swapping/renaming tables 
+   # XXX Auto-choose the alter fk method BEFORE swapping/renaming tables
    # else everything will break because if drop_swap is chosen, then we
    # most NOT rename tables or drop the old table.
    if ( $alter_fk_method eq 'auto' ) {
@@ -10078,7 +10135,7 @@ sub main {
    }
 
    if ( $o->get('preserve-triggers') ) {
-      if ( !$o->get('swap-tables') && $o->get('drop-new-table') ) {
+       if ( !$o->get('swap-tables') && $o->get('drop-new-table') && !$o->get('alter-foreign-keys-method') eq "drop-swap" ) {
           print ts("Skipping triggers creation since --no-swap-tables was specified along with --drop-new-table\n");
       } else {
           print ts("Adding original triggers to new table.\n");
@@ -10090,10 +10147,10 @@ sub main {
                   eval {
                       # if --no-swap-tables is used and --no-drop-new-table is used, then we need to duplicate the trigger
                       my $duplicate_trigger = ( ! $o->get('swap-tables') && ! $o->get('drop-new-table') ) ? 1 : undef;
-                          
-                      $new_trigger_sqls = create_trigger_sql(trigger => $orig_trigger, 
-                                                             db => $new_tbl->{db}, 
-                                                             new_tbl => $new_tbl->{tbl}, 
+
+                      $new_trigger_sqls = create_trigger_sql(trigger => $orig_trigger,
+                                                             db => $new_tbl->{db},
+                                                             new_tbl => $new_tbl->{tbl},
                                                              orig_tbl => $orig_tbl->{tbl},
                                                              duplicate_trigger => $duplicate_trigger,
                                                             );
@@ -10120,7 +10177,6 @@ sub main {
 
    my $old_tbl;
    if ( $o->get('swap-tables') ) {
-
       eval {
          $old_tbl = swap_tables(
             orig_tbl      => $orig_tbl,
@@ -10144,6 +10200,7 @@ sub main {
               ERROR_SWAPPING_TABLES);
       }
    }
+
    $orig_tbl->{swapped} = 1;  # flag for cleanup tasks
    PTDEBUG && _d('Old table:', Dumper($old_tbl));
 
@@ -10208,8 +10265,9 @@ sub main {
          }
       };
       if ( $EVAL_ERROR ) {
-         # TODO: improve error message and handling.
-         _die("Error updating foreign key constraints: $EVAL_ERROR", ERROR_UPDATING_FKS);
+          #$oktorun = 0;
+          $process_error = "Error updating foreign key constraints: $EVAL_ERROR";
+         _die($process_error, ERROR_UPDATING_FKS);
       }
 
       # --plugin hook
@@ -10248,7 +10306,7 @@ sub main {
 
          my $sql = "DROP TABLE IF EXISTS $old_tbl->{name}";
          print $sql, "\n" if $o->get('print');
-         PTDEBUG && _d($sql); 
+         PTDEBUG && _d($sql);
          eval {
             $cxn->dbh()->do($sql);
          };
@@ -10273,6 +10331,7 @@ sub main {
    # ########################################################################
    # Done.
    # ########################################################################
+
    $orig_tbl->{success} = 1;  # flag for cleanup tasks
    $cleanup = undef;          # exec cleanup tasks
 
@@ -10296,7 +10355,7 @@ sub validate_tries {
       create_triggers
       drop_triggers
       copy_rows
-      swap_tables 
+      swap_tables
       update_foreign_keys
       analyze_table
    );
@@ -10351,8 +10410,8 @@ sub check_alter {
 
    my $ok = 1;
 
-   $alter =~ s/^(.*?)\s+COMMENT\s+'(.*?[^\\]')+(.*)/$1$3/; 
-   $alter =~ s/^(.*?)\s+COMMENT\s+"(.*?[^\\]")+(.*)/$1$3/; 
+   $alter =~ s/^(.*?)\s+COMMENT\s+'(.*?[^\\]')+(.*)/$1$3/;
+   $alter =~ s/^(.*?)\s+COMMENT\s+"(.*?[^\\]")+(.*)/$1$3/;
 
    my $unique_fields = get_unique_index_fields($alter);
 
@@ -10461,7 +10520,7 @@ sub check_alter {
    return;
 }
 
-sub _has_self_ref_fks { 
+sub _has_self_ref_fks {
     my ($orig_db, $orig_table, $child_tables) = @_;
 
     my $db_tbl = sprintf('`%s`.`%s`', $orig_db, $orig_table);
@@ -10477,18 +10536,18 @@ sub _has_self_ref_fks {
 
 # This function tries to detect if the --alter param is adding unique indexes.
 # It returns an array of arrays, having a list of fields for each unique index
-# found. 
+# found.
 # Example:
-# Input string: add i int comment "first comment ", ADD UNIQUE INDEX (C1) comment 
+# Input string: add i int comment "first comment ", ADD UNIQUE INDEX (C1) comment
 #               'second comment', CREATE UNIQUE INDEX C ON T1 (C2, c3) comment "third"
 #
-# Output: 
+# Output:
 # $VAR1 = [
 #           [ 'C1' ],
 #           [ 'C2', 'c3' ]
 #         ];
 #
-# Thse fields are used to build an example SELECT to detect if currently there are 
+# Thse fields are used to build an example SELECT to detect if currently there are
 # rows that will produce duplicates when the new UNIQUE INDEX is created.
 
 sub get_unique_index_fields {
@@ -10554,10 +10613,10 @@ sub find_renamed_cols {
    my $table_ident  = qr/$unquoted_ident|`$quoted_ident`|"$ansi_quotes_ident"/;
 
    # remove comments
-   $alter =~ s/^(.*?)\s+COMMENT\s+'(.*?[^\\]')+(.*)/$1$3/; 
-   $alter =~ s/^(.*?)\s+COMMENT\s+"(.*?[^\\]")+(.*)/$1$3/; 
+   $alter =~ s/^(.*?)\s+COMMENT\s+'(.*?[^\\]')+(.*)/$1$3/;
+   $alter =~ s/^(.*?)\s+COMMENT\s+"(.*?[^\\]")+(.*)/$1$3/;
 
-   my $alter_change_col_re = qr/\bCHANGE \s+ (?:COLUMN \s+)? 
+   my $alter_change_col_re = qr/\bCHANGE \s+ (?:COLUMN \s+)?
                                 ($table_ident) \s+ ($table_ident)/ix;
 
    my %renames;
@@ -10593,10 +10652,10 @@ sub nibble_is_safe {
       vals => [ @{$boundary->{lower}}, @{$boundary->{upper}} ],
    );
 
-   # Ensure that MySQL is using the chunk index if the table is being chunked. 
+   # Ensure that MySQL is using the chunk index if the table is being chunked.
    # Skip if --nocheck-plan   See: https://bugs.launchpad.net/percona-toolkit/+bug/1340728
       if ( !$nibble_iter->one_nibble()
-           && lc($expl->{key} || '') ne lc($nibble_iter->nibble_index() || '') 
+           && lc($expl->{key} || '') ne lc($nibble_iter->nibble_index() || '')
            && $o->get('check-plan') )
       {
          die ts("Error copying rows at chunk " . $nibble_iter->nibble_number()
@@ -10608,7 +10667,7 @@ sub nibble_is_safe {
    # Ensure that the chunk isn't too large if there's a --chunk-size-limit.
    # If single-chunking the table, this has already been checked, so it
    # shouldn't have changed.  If chunking the table with a non-unique key,
-   # oversize chunks are possible. 
+   # oversize chunks are possible.
    if ( my $limit = $o->get('chunk-size-limit') ) {
       my $oversize_chunk
          = $limit ? ($expl->{rows} || 0) >= $tbl->{chunk_size} * $limit
@@ -10628,12 +10687,12 @@ sub nibble_is_safe {
       }
    }
 
-   # Ensure that MySQL is still using the entire index. 
+   # Ensure that MySQL is still using the entire index.
    # https://bugs.launchpad.net/percona-toolkit/+bug/1010232
    # Skip if --nocheck-plan   See: https://bugs.launchpad.net/percona-toolkit/+bug/1340728
    if ( !$nibble_iter->one_nibble()
         && $tbl->{key_len}
-        && ($expl->{key_len} || 0) < $tbl->{key_len} 
+        && ($expl->{key_len} || 0) < $tbl->{key_len}
         && $o->get('check-plan') )
    {
       die ts("Error copying rows at chunk " . $nibble_iter->nibble_number()
@@ -10700,7 +10759,7 @@ sub create_new_table {
       # When the new temp table is created, we need to avoid collisions on constraint names
       # This is in contrast to previous behavior were we added underscores
       # indefinitely, sometimes exceeding the allowed name limit
-      # https://bugs.launchpad.net/percona-toolkit/+bug/1215587 
+      # https://bugs.launchpad.net/percona-toolkit/+bug/1215587
       # So we do replacements when constraint names:
       # Has 2 _, we remove them
       # Has 1 _, we add one to make 2
@@ -10730,7 +10789,7 @@ sub create_new_table {
           }
       }
       if ( $o->got('remove-data-dir') ) {
-         $sql =~ s/DATA DIRECTORY\s*=\s*'.*?'//; 
+         $sql =~ s/DATA DIRECTORY\s*=\s*'.*?'//;
          PTDEBUG && _d("removing data dir");
       }
       PTDEBUG && _d($sql);
@@ -10771,10 +10830,10 @@ sub create_new_table {
 
 sub insert_data_directory {
     my ($sql, $data_dir) = @_;
-    $sql =~ s/DATA DIRECTORY\s*=\s*'.*?'//; 
+    $sql =~ s/DATA DIRECTORY\s*=\s*'.*?'//;
 
     my $re_ps=qr/(\/\*!50100 )?(PARTITION|SUBPARTITION)/;
-    
+
     if ($sql=~ m/$re_ps/) {
         my $insert_pos=$-[0];
         $sql = substr($sql, 0, $insert_pos - 1). " DATA DIRECTORY = '$data_dir' " .substr($sql, $insert_pos);
@@ -10806,7 +10865,7 @@ sub swap_tables {
 
       # A return value really isn't needed, but this trick allows
       # rebuild_constraints() to parse and show the sql statements
-      # it would used.  Otherwise, this has no effect.      
+      # it would used.  Otherwise, this has no effect.
       return $orig_tbl;
    }
    elsif ( $o->get('execute') ) {
@@ -10829,14 +10888,14 @@ sub swap_tables {
 
       print ts("Swapping tables...\n");
       while ( $name_tries-- ) {
-       
+
          # https://bugs.launchpad.net/percona-toolkit/+bug/1526105
          if ( $name_tries <= 10 ) { # we've already added 10 underscores?
             # time to try a small random string
             my @chars = ("A".."Z", "0".."9");
             $prefix = '';
             $prefix .= $chars[rand @chars] for 1..6;
-            $prefix .= "_";  
+            $prefix .= "_";
          }
 
          $table_name = $prefix . $table_name;
@@ -10850,7 +10909,7 @@ sub swap_tables {
 
          my $sql = "RENAME TABLE $orig_tbl->{name} "
                  . "TO " . $q->quote($orig_tbl->{db}, $table_name)
-                 . ", $new_tbl->{name} TO $orig_tbl->{name}"; 
+                 . ", $new_tbl->{name} TO $orig_tbl->{name}" ;
 
          eval {
             osc_retry(
@@ -10891,7 +10950,7 @@ sub swap_tables {
             name => $q->quote($orig_tbl->{db}, $table_name),
          };
       }
-     
+
       # This shouldn't happen.
       die ts("Failed to find a unique old table name after "
          . "serveral attempts.\n");
@@ -10969,9 +11028,9 @@ sub find_child_tables {
       PTDEBUG && _d(q{MyISAM table, not looking for child tables});
       return;
    }
-   
+
    PTDEBUG && _d('Finding child tables');
-   
+
    my $sql = "SELECT table_schema, table_name "
            . "FROM information_schema.key_column_usage "
            . "WHERE referenced_table_schema='$tbl->{db}' "
@@ -11029,7 +11088,7 @@ sub determine_alter_fk_method {
    # The rebuild_constraints method is the default becuase it's safer
    # and doesn't cause the orig table to go missing for a moment.
    my $method = 'rebuild_constraints';
-   
+
    print ts("Max rows for the rebuild_constraints method: $max_rows\n"
       . "Determining the method to update foreign keys...\n");
    foreach my $child_tbl ( @$child_tables ) {
@@ -11127,7 +11186,7 @@ sub rebuild_constraints {
          # If it has a leading underscore, we remove one, otherwise we add one
          # This is in contrast to previous behavior were we added underscores
          # indefinitely, sometimes exceeding the allowed name limit
-         # https://bugs.launchpad.net/percona-toolkit/+bug/1215587 
+         # https://bugs.launchpad.net/percona-toolkit/+bug/1215587
          # Add one more salt to renaming FK constraint names
          # This will add 2 _ to a self referencing FK thus avoiding a duplicate key constraint
          # https://bugs.launchpad.net/percona-toolkit/+bug/1632522
@@ -11140,7 +11199,7 @@ sub rebuild_constraints {
              substr($new_fk, 64 - length $new_fk) = '';
            }
          }
-        
+
          PTDEBUG && _d("Old FK name: $fk New FK name: $new_fk");
 
          $constraint =~ s/CONSTRAINT `$fk`/CONSTRAINT `$new_fk`/;
@@ -11160,8 +11219,12 @@ sub rebuild_constraints {
             tries   => $tries->{update_foreign_keys},
             stats   => $stats,
             code    => sub {
-               PTDEBUG && _d($sql);
+               PTDEBUG && _d("SET foreign_key_checks=0");
+               $cxn->dbh()->do("SET foreign_key_checks=0");
+	       PTDEBUG && _d($sql);
                $cxn->dbh()->do($sql);
+	       PTDEBUG && _d("SET foreign_key_checks=1");
+               $cxn->dbh()->do("SET foreign_key_checks=1");
                $stats->{rebuilt_constraint}++;
             },
          );
@@ -11212,11 +11275,11 @@ sub drop_swap {
       "DROP TABLE IF EXISTS $orig_tbl->{name}",
       "RENAME TABLE $new_tbl->{name} TO $orig_tbl->{name}",
    );
-  
+
    # we don't want to be interrupted during the swap!
    # since it might leave original table dropped
    # https://bugs.launchpad.net/percona-toolkit/+bug/1368244
-   $dont_interrupt_now = 1; 
+   $dont_interrupt_now = 1;
 
    foreach my $sql ( @sqls ) {
       PTDEBUG && _d($sql);
@@ -11235,7 +11298,7 @@ sub drop_swap {
       }
    }
 
-   $dont_interrupt_now = 0; 
+   $dont_interrupt_now = 0;
 
    if ( $o->get('execute') ) {
       print ts("Dropped and swapped tables OK.\n");
@@ -11264,7 +11327,8 @@ sub create_triggers {
 
    # Create a unique trigger name prefix based on the orig table name
    # so multiple instances of the tool can run on different tables.
-   my $prefix = 'pt_osc_' . $orig_tbl->{db} . '_' . $orig_tbl->{tbl};
+   my $pp = $args{reverse_triggers} ? "rt_" : '';
+   my $prefix = $pp.'pt_osc_' . $orig_tbl->{db} . '_' . $orig_tbl->{tbl};
    $prefix   =~ s/\W/_/g;
 
    if ( length($prefix) > 60 ) {
@@ -11280,7 +11344,7 @@ sub create_triggers {
    # they may have been renamed
    my %old_col_for    = map { $_->{new} => $_->{old} } @$cols;
    my $tbl_struct     = $del_tbl->{tbl_struct};
-   
+
    # ---------------------------------------------------------------------------------------
    my $del_index      = $del_tbl->{del_index};
    my $del_index_cols = join(" AND ", map {
@@ -11294,8 +11358,11 @@ sub create_triggers {
    my $delete_trigger
       = "CREATE TRIGGER `${prefix}_del` AFTER DELETE ON $orig_tbl->{name} "
       . "FOR EACH ROW "
+      . "BEGIN "
+      . "DECLARE CONTINUE HANDLER FOR 1146 begin end; "
       . "DELETE IGNORE FROM $new_tbl->{name} "
-      . "WHERE $del_index_cols";
+      . "WHERE $del_index_cols; "
+      . "END ";
 
    # ---------------------------------------------------------------------------------------
    my $qcols    = join(', ', map { $q->quote($_->{new}) }        @$cols);
@@ -11304,7 +11371,10 @@ sub create_triggers {
    my $insert_trigger
       = "CREATE TRIGGER `${prefix}_ins` AFTER INSERT ON $orig_tbl->{name} "
       . "FOR EACH ROW "
-      . "REPLACE INTO $new_tbl->{name} ($qcols) VALUES ($new_vals)";
+      . "BEGIN "
+      . "DECLARE CONTINUE HANDLER FOR 1146 begin end; "
+      . "REPLACE INTO $new_tbl->{name} ($qcols) VALUES ($new_vals);"
+      . "END ";
 
    # ---------------------------------------------------------------------------------------
    my $upd_index_cols = join(" AND ", map {
@@ -11320,35 +11390,32 @@ sub create_triggers {
       = "CREATE TRIGGER `${prefix}_upd` AFTER UPDATE ON $orig_tbl->{name} "
       . "FOR EACH ROW "
       . "BEGIN "
-      . "DELETE IGNORE FROM $new_tbl->{name} WHERE !($upd_index_cols) AND $del_index_cols;"
-      . "REPLACE INTO $new_tbl->{name} ($qcols) VALUES ($new_vals);"
-      . "END ";      
+      . "DECLARE CONTINUE HANDLER FOR 1146 begin end; "
+      . "DELETE IGNORE FROM $new_tbl->{name} WHERE !($upd_index_cols) AND $del_index_cols; "
+      . "REPLACE INTO $new_tbl->{name} ($qcols) VALUES ($new_vals); "
+      . "END ";
 
-   $triggers_info = [                                                     
-      { 
-          suffix => 'del', event => 'DELETE', time => 'AFTER', orig_triggers => [], 
-          new_trigger_sql => $delete_trigger, new_trigger_name => "${prefix}_del", 
+   $triggers_info = [
+      {
+          suffix => 'del', event => 'DELETE', time => 'AFTER', orig_triggers => [],
+          new_trigger_sql => $delete_trigger, new_trigger_name => "${prefix}_del",
       },
-      { 
-          suffix => 'upd', event => 'UPDATE', time => 'AFTER', orig_triggers => [], 
+      {
+          suffix => 'upd', event => 'UPDATE', time => 'AFTER', orig_triggers => [],
           new_trigger_sql => $update_trigger, new_trigger_name => "${prefix}_upd",
       },
-      { 
-          suffix => 'ins', event => 'INSERT', time => 'AFTER', orig_triggers => [], 
-          new_trigger_sql => $insert_trigger, new_trigger_name => "${prefix}_ins", 
+      {
+          suffix => 'ins', event => 'INSERT', time => 'AFTER', orig_triggers => [],
+          new_trigger_sql => $insert_trigger, new_trigger_name => "${prefix}_ins",
       },
-
-      { 
-          suffix => 'delb', event => 'DELETE', time => 'BEFORE', orig_triggers => [], 
-          new_trigger_sql => '', new_trigger_name => '' 
+      {
+          event => 'DELETE', time => 'BEFORE', orig_triggers => [], 
       },
-      { 
-          suffix => 'updb', event => 'UPDATE', time => 'BEFORE', orig_triggers => [], 
-          new_trigger_sql => '', new_trigger_name => '' 
+      {
+          event => 'UPDATE', time => 'BEFORE', orig_triggers => [], 
       },
-      { 
-          suffix => 'insb', event => 'INSERT', time => 'BEFORE', orig_triggers => [], 
-          new_trigger_sql => '', new_trigger_name => '' 
+      {
+          event => 'INSERT', time => 'BEFORE', orig_triggers => [], 
       },
    ];
 
@@ -11363,11 +11430,11 @@ sub create_triggers {
                    . "   AND TRIGGER_SCHEMA = ? "
                    . "   AND EVENT_OBJECT_TABLE = ?";
    foreach my $trigger_info (@$triggers_info) {
-       $trigger_info->{orig_triggers} = $dbh->selectall_arrayref( $trigger_sql, 
-                                                                  { Slice => {} }, 
+       $trigger_info->{orig_triggers} = $dbh->selectall_arrayref( $trigger_sql,
+                                                                  { Slice => {} },
                                                                   $trigger_info->{event},
                                                                   $trigger_info->{time},
-                                                                  $orig_tbl->{db}, 
+                                                                  $orig_tbl->{db},
                                                                   $orig_tbl->{tbl}
                                                                 ) || [];
    }
@@ -11381,12 +11448,12 @@ sub create_triggers {
                my $definer = $orig_trigger->{definer} || '';
                $definer =~ s/@/`@`/;
                $definer = "`$definer`" ;
-               
+
                my @chars = ("a".."z");
                my $tmp_trigger_name;
                $tmp_trigger_name .= $chars[rand @chars] for 1..15;
 
-               my $sql = "CREATE DEFINER=$definer " 
+               my $sql = "CREATE DEFINER=$definer "
                        . "TRIGGER `$new_tbl->{db}`.`$tmp_trigger_name` "
                        . "$orig_trigger->{action_timing} $orig_trigger->{event_manipulation} ON $new_tbl->{tbl}\n"
                        . "FOR EACH ROW\n"
@@ -11406,28 +11473,40 @@ sub create_triggers {
    }
 
    my @trigger_names;
-   @drop_trigger_sqls = ();
 
    foreach my $trigger_info ( @$triggers_info ) {
-       next if !$trigger_info->{new_trigger_sql};
-       if ( $o->get('execute') ) {
-          osc_retry(
-             Cxn     => $cxn,
-             Retry   => $retry,
-             tries   => $tries->{create_triggers},
-             stats   => $stats,
-             code    => sub {
-                PTDEBUG && _d($trigger_info->{new_trigger_sql});
-                $cxn->dbh()->do($trigger_info->{new_trigger_sql});
-             },
-          );
+       next if ! ($trigger_info->{new_trigger_sql});  ###FIXED PT-1919
+       if ($o->get('execute') && !$args{dont}) {
+           osc_retry(
+               Cxn     => $cxn,
+               Retry   => $retry,
+               tries   => $tries->{create_triggers},
+               stats   => $stats,
+               code    => sub {
+                   PTDEBUG && _d($trigger_info->{new_trigger_sql});
+                   $cxn->dbh()->do($trigger_info->{new_trigger_sql});
+               },
+           );
        }
        # Only save the trigger once it has been created
        # (or faked to be created) so if the 2nd trigger
        # fails to create, we know to only drop the 1st.
        push @trigger_names, $trigger_info->{new_trigger_name};
-       push @drop_trigger_sqls,
-          "DROP TRIGGER IF EXISTS " . $q->quote($orig_tbl->{db}, $trigger_info->{new_trigger_name});
+
+       if (!$args{'reverse_triggers'}) {
+           push @drop_trigger_sqls,
+           "DROP TRIGGER IF EXISTS " . $q->quote($orig_tbl->{db}, $trigger_info->{new_trigger_name});
+       }
+       if ($o->get('print')) {
+           print "-----------------------------------------------------------\n";
+           print "Skipped trigger creation: \n" if $o->get('dry-run');
+           print "Event : $trigger_info->{event} \n";
+           print "Name  : $trigger_info->{new_trigger_name} \n";
+           print "SQL   : $trigger_info->{new_trigger_sql} \n";
+           print "Suffix: $trigger_info->{suffix} \n";
+           print "Time  : $trigger_info->{time} \n";
+           print "-----------------------------------------------------------\n";
+       }
    }
 
    if ( $o->get('execute') ) {
@@ -11452,20 +11531,20 @@ sub random_suffix {
 #
 # Optional args:
 # orig_table.......: Original table name. Used to LOCK the table.
-#                    In case we are creating a new temporary trigger for testing 
+#                    In case we are creating a new temporary trigger for testing
 #                    purposes or if --no-swap-tables is enabled, this param should
 #                    be omitted since we are creating a completelly new trigger so,
-#                    since in this case we are not going to DROP the old trigger, 
+#                    since in this case we are not going to DROP the old trigger,
 #                    there is no need for a LOCK
 #
 # duplicate_trigger: If set, it will create the trigger on the new table
 #                    with a random string as a trigger name suffix.
 #                    It will also not drop the original trigger.
-#                    This is usefull when creating a temporary trigger for testing 
-#                    purposes or if --no-swap-tables AND --no-drop-new-table was 
-#                    specified along with --preserve-triggers. In this case, 
-#                    since the original table and triggers are not going to be 
-#                    deleted we need a new random name because trigger names 
+#                    This is usefull when creating a temporary trigger for testing
+#                    purposes or if --no-swap-tables AND --no-drop-new-table was
+#                    specified along with --preserve-triggers. In this case,
+#                    since the original table and triggers are not going to be
+#                    deleted we need a new random name because trigger names
 #                    cannot be duplicated
 sub create_trigger_sql {
    my (%args) = @_;
@@ -11494,10 +11573,10 @@ sub create_trigger_sql {
     push @$sqls, "/*!50003 SET character_set_client  = $trigger->{character_set_client} */ ;";
     push @$sqls, "/*!50003 SET collation_connection  = $trigger->{collation_connection} */ ;";
     push @$sqls, "SET SESSION sql_mode = '$trigger->{sql_mode}'";
-    
+
     push @$sqls, "DROP TRIGGER IF EXISTS `$args{db}`.`$trigger->{trigger_name}` " if ! $args{duplicate_trigger};
 
-    push @$sqls, "CREATE DEFINER=$definer " 
+    push @$sqls, "CREATE DEFINER=$definer "
                . "TRIGGER `$args{db}`.`$trigger->{trigger_name}$suffix` "
                . "$trigger->{action_timing} $trigger->{event_manipulation} ON $args{new_tbl}\n"
                . "FOR EACH ROW\n"
@@ -11510,7 +11589,7 @@ sub create_trigger_sql {
     push @$sqls, 'UNLOCK TABLES';
 
    return $sqls;
-    
+
 }
 
 sub drop_triggers {
@@ -11530,7 +11609,7 @@ sub drop_triggers {
    else {
       print ts("Dropping triggers...\n");
    }
- 
+
    foreach my $sql ( @drop_trigger_sqls ) {
       print $sql, "\n" if $o->get('print');
       if ( $o->get('execute') ) {
@@ -11665,8 +11744,8 @@ sub exec_nibble {
    my $ub_quoted   = $q->serialize_list(@{$boundary->{upper}});
    my $chunk       = $nibble_iter->nibble_number();
    my $chunk_index = $nibble_iter->nibble_index();
-         
-         
+
+
    # Warn once per-table for these error codes if the error message
    # matches the pattern.
    my %warn_code = (
@@ -11687,7 +11766,7 @@ sub exec_nibble {
          # ###################################################################
          # Start timing the query.
          # ###################################################################
-         my $t_start = time;        
+         my $t_start = time;
 
          # Execute the INSERT..SELECT query.
          PTDEBUG && _d($sth->{nibble}->{Statement},
@@ -11831,14 +11910,14 @@ sub trim {
 sub sig_int {
    my ( $signal ) = @_;
    if ( $dont_interrupt_now ) {
-      # we're in the middle of something that shouldn't be interrupted 
+      # we're in the middle of something that shouldn't be interrupted
       PTDEBUG && _d("Received Signal: \"$signal\" in middle of critical operation. Continuing anyway.");
       return;
    }
    $oktorun = 0;  # flag for cleanup tasks
    print STDERR "# Exiting on SIG$signal.\n";
    # This is to restore terminal to "normal". lp #1396870
-   if ($term_readkey) { 
+   if ($term_readkey) {
       ReadMode(0);
    }
    exit 1;
@@ -11951,7 +12030,7 @@ safety checks:
 
 =item *
 
-In most cases the tool will refuse to operate unless a PRIMARY KEY or UNIQUE INDEX is 
+In most cases the tool will refuse to operate unless a PRIMARY KEY or UNIQUE INDEX is
 present in the table. See L<"--alter"> for details.
 
 
@@ -12040,12 +12119,12 @@ to fail in unpredictable ways:
 
 =item *
 
-In almost all cases a PRIMARY KEY or UNIQUE INDEX needs to be present in the table. 
-This is necessary because the tool creates a DELETE trigger to keep the new table 
+In almost all cases a PRIMARY KEY or UNIQUE INDEX needs to be present in the table.
+This is necessary because the tool creates a DELETE trigger to keep the new table
 updated while the process is running.
 
-A notable exception is when a PRIMARY KEY or UNIQUE INDEX is being created from 
-B<existing columns> as part of the ALTER clause; in that case it will use these 
+A notable exception is when a PRIMARY KEY or UNIQUE INDEX is being created from
+B<existing columns> as part of the ALTER clause; in that case it will use these
 column(s) for the DELETE trigger.
 
 =item *
@@ -12118,7 +12197,7 @@ tables" that reference the table to be altered.
 
 Automatically determine which method is best.  The tool uses
 C<rebuild_constraints> if possible (see the description of that method for
-details), and if not, then it uses C<drop_swap>. 
+details), and if not, then it uses C<drop_swap>.
 
 =item rebuild_constraints
 
@@ -12457,7 +12536,7 @@ than remove-data-dir.
 
 default: no
 
-If the original table was created using the DATA DIRECTORY feature, remove it and create 
+If the original table was created using the DATA DIRECTORY feature, remove it and create
 the new table in MySQL default directory without creating a new isl file.
 
 =item --defaults-file
@@ -12515,8 +12594,8 @@ documentation, then do not specify this option.
 
 default: yes
 
-Avoid C<pt-online-schema-change> to run if the specified statement for L<"--alter"> is 
-trying to add an unique index. 
+Avoid C<pt-online-schema-change> to run if the specified statement for L<"--alter"> is
+trying to add an unique index.
 Since C<pt-online-schema-change> uses C<INSERT IGNORE> to copy rows to the new table, if
 the row being written produces a duplicate key, it will fail silently and data will
 be lost.
@@ -12530,7 +12609,7 @@ Example:
       `unique_id` varchar(32) DEFAULT NULL,
       PRIMARY KEY (`id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-    
+
     insert into a values (1, "a");
     insert into a values (2, "b");
     insert into a values (3, "");
@@ -12541,7 +12620,7 @@ Example:
 Using C<pt-online-schema-change> to add an unique index on the C<unique_id> field, will cause some rows to
 be lost due to the use of C<INSERT IGNORE> to copy rows from the source table.
 For this reason, C<pt-online-schema-change> will fail if it detects that the L<"--alter"> parameter is trying
-to add an unique key and it will show an example query to run to detect if there are 
+to add an unique key and it will show an example query to run to detect if there are
 rows that will produce duplicated indexes.
 
 Even if you run the query and there are no rows that will produce duplicated indexes,
@@ -12567,9 +12646,9 @@ Connect to host.
 type: float
 
 Somewhat similar to --max-lag but for PXC clusters.
-Check average time cluster spent pausing for Flow Control and make tool pause if 
+Check average time cluster spent pausing for Flow Control and make tool pause if
 it goes over the percentage indicated in the option.
-A value of 0 would make the tool pause when *any* Flow Control activity is 
+A value of 0 would make the tool pause when *any* Flow Control activity is
 detected.
 Default is no Flow Control checking.
 This option is available for PXC versions 5.6 or higher.
@@ -12624,8 +12703,8 @@ you notice queueing, it is best to decrease the chunk time.
 
 =item --preserve-triggers
 
-Preserves old triggers when specified. 
-As of MySQL 5.7.2, it is possible to define multiple triggers for a given 
+Preserves old triggers when specified.
+As of MySQL 5.7.2, it is possible to define multiple triggers for a given
 table that have the same trigger event and action time. This allows us to
 add the triggers needed for C<pt-online-schema-change> even if the table
 already has its own triggers.
@@ -12641,30 +12720,30 @@ Example.
        f2 VARCHAR(32),
        PRIMARY KEY (id)
   );
-              
+
   CREATE TABLE test.log (
      ts  TIMESTAMP,
      msg VARCHAR(255)
   );
-  
+
   CREATE TRIGGER test.after_update
    AFTER
      UPDATE ON test.t1
-     FOR EACH ROW 
+     FOR EACH ROW
        INSERT INTO test.log VALUES (NOW(), CONCAT("updated row row with id ", OLD.id, " old f1:", OLD.f1, " new f1: ", NEW.f1 ));
 
-For this table and triggers combination, it is not possible to use L<--preserve-triggers> 
-with an L<--alter> like this: C<"DROP COLUMN f1"> since the trigger references the column 
+For this table and triggers combination, it is not possible to use L<--preserve-triggers>
+with an L<--alter> like this: C<"DROP COLUMN f1"> since the trigger references the column
 being dropped and at would make the trigger to fail.
 
-After testing the triggers will work on the new table, the triggers are 
+After testing the triggers will work on the new table, the triggers are
 dropped from the new table until all rows have been copied and then they are
-re-applied. 
+re-applied.
 
-L<--preserve-triggers> cannot be used with these other parameters, L<--no-drop-triggers>, 
-L<--no-drop-old-table> and L<--no-swap-tables> since L<--preserve-triggers> implies that 
-the old triggers should be deleted and recreated in the new table. 
-Since it is not possible to have more than one trigger with the same name, old triggers 
+L<--preserve-triggers> cannot be used with these other parameters, L<--no-drop-triggers>,
+L<--no-drop-old-table> and L<--no-swap-tables> since L<--preserve-triggers> implies that
+the old triggers should be deleted and recreated in the new table.
+Since it is not possible to have more than one trigger with the same name, old triggers
 must be deleted in order to be able to recreate them into the new table.
 
 Using C<--preserve-triggers> with C<--no-swap-tables> will cause triggers to remain
@@ -12672,7 +12751,7 @@ defined for the original table.
 Please read the documentation for L<--swap-tables>
 
 If both C<--no-swap-tables> and C<--no-drop-new-table> is set, the trigger will remain
-on the original table and will be duplicated on the new table 
+on the original table and will be duplicated on the new table
 (the trigger will have a random suffix as no trigger names are unique).
 
 =item --new-table-name
@@ -12708,7 +12787,7 @@ If password contains commas they must be escaped with a backslash: "exam\,ple"
 
 =item --pause-file
 
-type: string 
+type: string
 
 Execution will be paused while the file specified by this param exists.
 
@@ -12805,11 +12884,22 @@ t.  The DSN table should have the following structure:
 To make the tool monitor only the hosts 10.10.1.16 and 10.10.1.17 for
 replication lag, insert the values C<h=10.10.1.16> and C<h=10.10.1.17> into the
 table. Currently, the DSNs are ordered by id, but id and parent_id are otherwise
-ignored.  
+ignored.
 
 You can change the list of hosts while OSC is executing:
 if you change the contents of the DSN table, OSC will pick it up very soon.
 
+=item --reverse-triggers
+Copy the triggers added during the copy in reverse order. Commands in the new table will be
+reflected in the old table. You can use this as a safety feature, so that the old
+table continues to receive updates. This option requires C<--no-drop-old-table>.
+
+Warning! This option creates reverse triggers on the new table before it starts copying.
+After new table is renamed to its original name triggers will continue working. But because the
+name change metadata version in the table cache will also change you may start receiving
+"Prepared statement needs to be re-prepared" errors. The workaround for this is to re-prepare statements.
+If you do not use server-side prepared statements your application should not be affected.
+
 =item --skip-check-slave-lag
 
 type: DSN; repeatable: yes
@@ -12824,7 +12914,7 @@ for this parameter you need to specify the full IP address.
 type: string
 
 Sets the user to be used to connect to the slaves.
-This parameter allows you to have a different user with less privileges on the 
+This parameter allows you to have a different user with less privileges on the
 slaves but that user must exist on all slaves.
 
 =item --slave-password
@@ -12859,7 +12949,7 @@ The tool prints a warning and continues if a variable cannot be set.
 Note that setting the C<sql_mode> variable requires some tricky escapes
 to be able to parse the quotes and commas.
 
-Example: 
+Example:
 
    --set-vars sql_mode=\'STRICT_ALL_TABLES\\,ALLOW_INVALID_DATES\'
 
@@ -12869,9 +12959,9 @@ Note the single backslash for the quotes and double backslash for the comma.
 
 type: float; default: 0
 
-How long to sleep (in seconds) after copying each chunk. This option is useful 
-when throttling by L<"--max-lag"> and L<"--max-load"> are not possible. 
-A small, sub-second value should be used, like 0.1, else the tool could take 
+How long to sleep (in seconds) after copying each chunk. This option is useful
+when throttling by L<"--max-lag"> and L<"--max-load"> are not possible.
+A small, sub-second value should be used, like 0.1, else the tool could take
 a very long time to copy large tables.
 
 =item --socket
@@ -12895,7 +12985,7 @@ place of the original table.  The original table becomes the "old table," and
 the tool drops it unless you disable L<"--[no]drop-old-table">.
 
 Using C<--no-swap-tables> will run the whole process, it will create the new
-table, it will copy all rows but at the end it will drop the new table. It is 
+table, it will copy all rows but at the end it will drop the new table. It is
 intended to run a more realistic L<--dry-run>.
 
 =item --tries
@@ -12990,7 +13080,7 @@ done for the first time.
 
 Any updates or known problems are printed to STDOUT before the tool's normal
 output.  This feature should never interfere with the normal operation of the
-tool.  
+tool.
 
 For more information, visit L<https://www.percona.com/doc/percona-toolkit/LATEST/version-check.html>.
 
@@ -13081,7 +13171,7 @@ Here's a plugin file template for all hooks:
    sub before_create_triggers {
       my ($self, %args) = @_;
       print "PLUGIN before_create_triggers\n";
-   } 
+   }
 
   sub after_create_triggers {
       my ($self, %args) = @_;
@@ -13147,7 +13237,7 @@ Here's a plugin file template for all hooks:
 
    1;
 
-Notice that C<get_slave_lag> must return a function reference; 
+Notice that C<get_slave_lag> must return a function reference;
 ideally one that returns actual slave lag, not simply zero like in the example.
 
 Here's an example that actually does something:
@@ -13263,25 +13353,26 @@ of output.
 
 =head1 EXIT STATUS
 
-   INVALID_PARAMETERS        = 1
-   UNSUPORTED_MYSQL_VERSION  = 2
-   NO_MINIMUM_REQUIREMENTS   = 3
-   NO_PRIMARY_OR_UNIQUE_KEY  = 4
-   INVALID_PLUGIN_FILE       = 5
-   INVALID_ALTER_FK_METHOD   = 6
-   INVALID_KEY_SIZE          = 7
-   CANNOT_DETERMINE_KEY_SIZE = 9
-   NOT_SAFE_TO_ASCEND        = 9
-   ERROR_CREATING_NEW_TABLE  = 10
-   ERROR_ALTERING_TABLE      = 11
-   ERROR_CREATING_TRIGGERS   = 12
-   ERROR_RESTORING_TRIGGERS  = 13
-   ERROR_SWAPPING_TABLES     = 14
-   ERROR_UPDATING_FKS        = 15
-   ERROR_DROPPING_OLD_TABLE  = 16
-   UNSUPORTED_OPERATION      = 17
-   MYSQL_CONNECTION_ERROR    = 18
-   LOST_MYSQL_CONNECTION     = 19
+   INVALID_PARAMETERS              = 1
+   UNSUPORTED_MYSQL_VERSION        = 2
+   NO_MINIMUM_REQUIREMENTS         = 3
+   NO_PRIMARY_OR_UNIQUE_KEY        = 4
+   INVALID_PLUGIN_FILE             = 5
+   INVALID_ALTER_FK_METHOD         = 6
+   INVALID_KEY_SIZE                = 7
+   CANNOT_DETERMINE_KEY_SIZE       = 9
+   NOT_SAFE_TO_ASCEND              = 9
+   ERROR_CREATING_NEW_TABLE        = 10
+   ERROR_ALTERING_TABLE            = 11
+   ERROR_CREATING_TRIGGERS         = 12
+   ERROR_RESTORING_TRIGGERS        = 13
+   ERROR_SWAPPING_TABLES           = 14
+   ERROR_UPDATING_FKS              = 15
+   ERROR_DROPPING_OLD_TABLE        = 16
+   UNSUPORTED_OPERATION            = 17
+   MYSQL_CONNECTION_ERROR          = 18
+   LOST_MYSQL_CONNECTION           = 19
+   ERROR_CREATING_REVERSE_TRIGGERS = 20
 
 =head1 SYSTEM REQUIREMENTS
 
@@ -13289,7 +13380,7 @@ You need Perl, DBI, DBD::mysql, and some core packages that ought to be
 installed in any reasonably new version of Perl.
 
 This tool works only on MySQL 5.0.2 and newer versions, because earlier versions
-do not support triggers. Also a number of permissions should be set on MySQL 
+do not support triggers. Also a number of permissions should be set on MySQL
 to make pt-online-schema-change operate as expected. PROCESS, SUPER, REPLICATION SLAVE
 global privileges, as well as SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER,
 and TRIGGER table privileges should be granted on server. Slave needs only
@@ -13379,6 +13470,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-online-schema-change 3.2.1
+pt-online-schema-change 3.3.1
 
 =cut
diff --git a/bin/pt-pmp b/bin/pt-pmp
index d32a497..4cfb04a 100755
--- a/bin/pt-pmp
+++ b/bin/pt-pmp
@@ -896,7 +896,7 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-pmp 3.2.1
+pt-pmp 3.3.1
 
 =cut
 
diff --git a/bin/pt-query-digest b/bin/pt-query-digest
index 8716e94..3503816 100755
--- a/bin/pt-query-digest
+++ b/bin/pt-query-digest
@@ -64,7 +64,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -7391,7 +7391,7 @@ sub profile {
    $report->title('Profile');
    my @cols = (
       { name => 'Rank',          right_justify => 1,             },
-      { name => 'Query ID',                                      },
+      { name => 'Query ID', width => 35                          },
       { name => 'Response time', right_justify => 1,             },
       { name => 'Calls',         right_justify => 1,             },
       { name => 'R/Call',        right_justify => 1,             },
@@ -8963,9 +8963,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -16957,6 +16958,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-query-digest 3.2.1
+pt-query-digest 3.3.1
 
 =cut
diff --git a/bin/pt-show-grants b/bin/pt-show-grants
index a8c0b54..5ff1a32 100755
--- a/bin/pt-show-grants
+++ b/bin/pt-show-grants
@@ -2613,6 +2613,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-show-grants 3.2.1
+pt-show-grants 3.3.1
 
 =cut
diff --git a/bin/pt-sift b/bin/pt-sift
index be2c3ae..4b97f3c 100755
--- a/bin/pt-sift
+++ b/bin/pt-sift
@@ -1245,7 +1245,7 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-sift 3.2.1
+pt-sift 3.3.1
 
 =cut
 
diff --git a/bin/pt-slave-delay b/bin/pt-slave-delay
index 51b14e2..3c5aaeb 100755
--- a/bin/pt-slave-delay
+++ b/bin/pt-slave-delay
@@ -40,7 +40,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -4988,6 +4988,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-slave-delay 3.2.1
+pt-slave-delay 3.3.1
 
 =cut
diff --git a/bin/pt-slave-find b/bin/pt-slave-find
index 572dc00..2c5adb5 100755
--- a/bin/pt-slave-find
+++ b/bin/pt-slave-find
@@ -4523,6 +4523,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-slave-find 3.2.1
+pt-slave-find 3.3.1
 
 =cut
diff --git a/bin/pt-slave-restart b/bin/pt-slave-restart
index fc79a9a..044a837 100755
--- a/bin/pt-slave-restart
+++ b/bin/pt-slave-restart
@@ -41,7 +41,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -6159,6 +6159,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-slave-restart 3.2.1
+pt-slave-restart 3.3.1
 
 =cut
diff --git a/bin/pt-stalk b/bin/pt-stalk
index 65c2750..a282233 100755
--- a/bin/pt-stalk
+++ b/bin/pt-stalk
@@ -2419,7 +2419,7 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-stalk 3.2.1
+pt-stalk 3.3.1
 
 =cut
 
diff --git a/bin/pt-summary b/bin/pt-summary
index 25b69e1..c1f5177 100755
--- a/bin/pt-summary
+++ b/bin/pt-summary
@@ -1174,7 +1174,7 @@ find_memory_stats () { local PTFUNCNAME=find_memory_stats;
    local platform="$1"
 
    if [ "${platform}" = "Linux" ]; then
-      free -b
+      free -bw
       cat /proc/meminfo
    elif [ "${platform}" = "SunOS" ]; then
       $CMD_PRTCONF | awk -F: '/Memory/{print $2}'
@@ -1278,7 +1278,7 @@ top_processes () { local PTFUNCNAME=top_processes;
 
 notable_processes_info () { local PTFUNCNAME=notable_processes_info;
    local format="%5s    %+2d    %s\n"
-   local sshd_pid=$(ps -eo pid,args | awk '$2 ~ /\/usr\/sbin\/sshd/ { print $1; exit }')
+   local sshd_pid=$(ps -eo pid,args | awk '$0 ~ /\/usr\/sbin\/sshd/ { print $1; exit }')
 
    echo "  PID    OOM    COMMAND"
 
@@ -2723,7 +2723,7 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-summary 3.2.1
+pt-summary 3.3.1
 
 =cut
 
diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum
index df44753..84a16f5 100755
--- a/bin/pt-table-checksum
+++ b/bin/pt-table-checksum
@@ -58,7 +58,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -4563,9 +4563,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g;
-   $string =~ s/[^\\]"[^"]*[^\\]"//g;
-   $string =~ s/[^\\]'[^']*[^\\]'//g;
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -14182,6 +14183,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-table-checksum 3.2.1
+pt-table-checksum 3.3.1
 
 =cut
diff --git a/bin/pt-table-sync b/bin/pt-table-sync
index ee606b2..3e25005 100755
--- a/bin/pt-table-sync
+++ b/bin/pt-table-sync
@@ -55,7 +55,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -2939,9 +2939,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -13083,6 +13084,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-table-sync 3.2.1
+pt-table-sync 3.3.1
 
 =cut
diff --git a/bin/pt-table-usage b/bin/pt-table-usage
index c25227f..98788cc 100755
--- a/bin/pt-table-usage
+++ b/bin/pt-table-usage
@@ -6870,9 +6870,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
@@ -8509,6 +8510,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-table-usage 3.2.1
+pt-table-usage 3.3.1
 
 =cut
diff --git a/bin/pt-upgrade b/bin/pt-upgrade
index 6315e2d..da8d795 100755
--- a/bin/pt-upgrade
+++ b/bin/pt-upgrade
@@ -61,7 +61,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -6159,7 +6159,7 @@ sub _print_failures {
    foreach my $failure ( @$failures ) {
       print "\n-- $failno.\n";
       if ( ($failure->[1] || '') eq ($failure->[2] || '') ) {
-         printf "\nOn both hosts:\n\n" . ($failure->[1] || '') . "\n";
+         print "\nOn both hosts:\n\n" . ($failure->[1] || '') . "\n";
       }
       else {
          printf "\n%s\n\nvs.\n\n%s\n",
@@ -11444,6 +11444,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-upgrade 3.2.1
+pt-upgrade 3.3.1
 
 =cut
diff --git a/bin/pt-variable-advisor b/bin/pt-variable-advisor
index 265b602..6d10a71 100755
--- a/bin/pt-variable-advisor
+++ b/bin/pt-variable-advisor
@@ -44,7 +44,7 @@ BEGIN {
 {
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
@@ -6257,6 +6257,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-variable-advisor 3.2.1
+pt-variable-advisor 3.3.1
 
 =cut
diff --git a/bin/pt-visual-explain b/bin/pt-visual-explain
index 709e165..e2406af 100755
--- a/bin/pt-visual-explain
+++ b/bin/pt-visual-explain
@@ -3303,6 +3303,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-pt-visual-explain 3.2.1
+pt-visual-explain 3.3.1
 
 =cut
diff --git a/config/sphinx-build/conf.py b/config/sphinx-build/conf.py
index a371efd..ed2ccf6 100644
--- a/config/sphinx-build/conf.py
+++ b/config/sphinx-build/conf.py
@@ -41,16 +41,16 @@ master_doc = 'index'
 
 # General information about the project.
 project = u'Percona Toolkit'
-copyright = u'2020, Percona LLC and/or its affiliates'
+copyright = u'2021, Percona LLC and/or its affiliates'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
 # The short X.Y version.
-version = '3.2'
+version = '3.3'
 # The full version, including alpha/beta/rc tags.
-release = '3.2.1'
+release = '3.3.1'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -116,7 +116,7 @@ html_short_title = 'Percona Toolkit'
 # The name of an image file (within the static path) to use as favicon of the
 # docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
 # pixels large.
-html_favicon = 'percona_favicon.ico'
+html_favicon = '_static/percona_favicon.ico'
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
@@ -180,7 +180,7 @@ htmlhelp_basename = 'PerconaToolkitdoc'
 # (source start file, target name, title, author, documentclass [howto/manual]).
 latex_documents = [
   ('index', 'PerconaToolkit.tex', u'Percona Toolkit Documentation',
-   u'2020, Percona LLC and/or its affiliates', 'manual'),
+   u'2021, Percona LLC and/or its affiliates', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
@@ -214,5 +214,5 @@ latex_toplevel_sectioning = 'part'
 # (source start file, name, description, authors, manual section).
 man_pages = [
     ('index', 'perconatoolkit', u'Percona Toolkit Documentation',
-     [u'2020, Percona LLC and/or its affiliates'], 1)
+     [u'2021, Percona LLC and/or its affiliates'], 1)
 ]
diff --git a/config/sphinx-build/percona-theme/layout.html b/config/sphinx-build/percona-theme/layout.html
deleted file mode 100644
index 2dab5fe..0000000
--- a/config/sphinx-build/percona-theme/layout.html
+++ /dev/null
@@ -1,525 +0,0 @@
-{#
-    basic/layout.html
-    ~~~~~~~~~~~~~~~~~
-
-    Master layout template for Sphinx themes.
-
-    :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
-    :license: BSD, see LICENSE for details.
-#}
-{%- block doctype -%}
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-{%- endblock %}
-{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
-{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
-{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
-                         (sidebars != []) %}
-{%- set url_root = pathto('', 1) %}
-{# XXX necessary? #}
-{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
-{%- if not embedded and docstitle %}
-  {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
-{%- else %}
-  {%- set titlesuffix = "" %}
-{%- endif %}
-
-{%- macro relbar() %}
-    <div class="related">
-      <h3>{{ _('Navigation') }}</h3>
-      <ul>
-        {%- for rellink in rellinks %}
-        <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
-          <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
-             {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
-          {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
-        {%- endfor %}
-        {%- block rootrellink %}
-        <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
-        {%- endblock %}
-        {%- for parent in parents %}
-          <li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
-        {%- endfor %}
-        {%- block relbaritems %} {% endblock %}
-      </ul>
-    </div>
-{%- endmacro %}
-
-{%- macro sidebar() %}
-      {%- if render_sidebar %}
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-
-				<div class="side-column-block"><a href="http://www.percona.com/software/percona-toolkit/"><img alt="Percona Toolkit" src="http://s2.percona.com/logo_percona_toolkit_new.png" /></a></div>
-
-			
-			<!-- div class="percona_com_ad" style="width:220px;"><script type="text/javascript" src="http://www.percona.com/ads.php?size=220x120"></script></div -->
-							
-          {%- if sidebars != None %}
-            {#- new style sidebar: explicitly include/exclude templates #}
-            {%- for sidebartemplate in sidebars %}
-            {%- include sidebartemplate %}
-            {%- endfor %}
-          {%- else %}
-            {#- old style sidebars: using blocks -- should be deprecated #}
-			            {%- block serverseries %}
-		<div class="side-column-block">
-			<h3>Percona Toolkit Series</h3>
-			     <ul><li><a href="http://www.percona.com/doc/percona-toolkit/1.0/">Percona Toolkit 1.0</a></li><li><a href="http://www.percona.com/doc/percona-toolkit/2.0/">Percona Toolkit 2.0</a></li><li><a href="http://www.percona.com/doc/percona-toolkit/2.1/">Percona Toolkit 2.1</a></li><li><a href="http://www.percona.com/doc/percona-toolkit/2.2/">Percona Toolkit 2.2</a></li></ul>
-			</div>
-			            {%- endblock %}
-            {%- block sidebartoc %}
-            {%- include "localtoc.html" %}
-            {%- endblock %}
-            {%- block sidebarrel %}
-            {%- include "relations.html" %}
-            {%- endblock %}
-            {%- block sidebarsourcelink %}
-            {%- include "sourcelink.html" %}
-            {%- endblock %}
-            {%- if customsidebar %}
-            {%- include customsidebar %}
-            {%- endif %}
-            {%- block sidebarsearch %}
-            {%- include "searchbox.html" %}
-            {%- endblock %}
-          {%- endif %}
-
-			
-        </div>
-      </div>
-      {%- endif %}
-{%- endmacro %}
-
-{%- macro script() %}
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '{{ url_root }}',
-        VERSION:     '{{ release|e }}',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
-        HAS_SOURCE:  {{ has_source|lower }}
-      };
-    </script>
-    {%- for scriptfile in script_files %}
-    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
-    {%- endfor %}
-{%- endmacro %}
-
-{%- macro css() %}
-    <link rel="stylesheet" href="{{ pathto('_static/percona.com.css', 1) }}" type="text/css" />
-    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
-    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
-    {%- for cssfile in css_files %}
-    <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
-    {%- endfor %}
-<link rel="stylesheet" href="//www.percona.com/sites/all/themes/percona/css/onlinedoc-responsive.css" type="text/css" />
-
-{%- endmacro %}
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
-    <link rel="shortcut icon" href="_static/percona_favicon.ico"/>
-    {{ metatags }}
-    {%- block htmltitle %}
-    <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
-    {%- endblock %}
-
-    {{ css() }}
-    {%- if not embedded %}
-    {{ script() }}
-    {%- if use_opensearch %}
-    <link rel="search" type="application/opensearchdescription+xml"
-          title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
-          href="{{ pathto('_static/opensearch.xml', 1) }}"/>
-    {%- endif %}
-
-<script src="{{ pathto('_static/percona.com.js', 1)}}" type="text/javascript"></script> 
-
-    {%- endif %}
-{%- block linktags %}
-    {%- if hasdoc('about') %}
-    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
-    {%- endif %}
-    {%- if hasdoc('genindex') %}
-    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
-    {%- endif %}
-    {%- if hasdoc('search') %}
-    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
-    {%- endif %}
-    {%- if hasdoc('copyright') %}
-    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
-    {%- endif %}
-    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
-    {%- if parents %}
-    <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
-    {%- endif %}
-    {%- if next %}
-    <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
-    {%- endif %}
-    {%- if prev %}
-    <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
-    {%- endif %}
-{%- endblock %}
-{%- block extrahead %} {% endblock %}
-  <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
-  </head>
-  <body>
-
-<div id="wrapper">
-      <div id="stickycontent">
-
-{%- block header %}
-  
-
-    
-        <header id="header">
-          <div id="headerContent">
-            <div class="topNavContainer">
-              <div class="logo" itemscope="" itemtype="http://schema.org/ImageObject" style="float:left;width:230px;">
-                <a href="/"><img src="/sites/all/themes/percona/logo.png" alt="Percona" itemprop="url" height="66" width="220"></a>
-              </div>
-              <div id="topnav">
-                <a href="http://www.percona.com/blog/">BLOG</a> / <a href="http://www.percona.com/forums">FORUM</a> / <a href="/">ONLINE TOOLS</a>  /  <a href="http://www.percona.com/live/">PERCONA LIVE</a>  /  <a href="http://customer.percona.com">SUPPORT PORTAL</a>  /  <a href="https://www.percona.com/contact/sales">CONTACT</a>
-                <div class="search-field">
-                  <form id="search-form" action="http://www.percona.com/search" method="get">
-                    <div class="form">
-                      <input id="search-input" maxlength="100" name="s" type="text">
-                      <input value="search" class="search-button" type="submit">
-                    </div>
-                  </form>
-                </div>
-              </div>
-                <a href="/support"><div class="getHelpBox">GET 24/7 LIVE HELP NOW <img src="/sites/all/themes/percona/images/right-white-arrow.png" class="getHelpArrow"></div></a>
-              </div>
-            <div style="clear:both;"></div>
-          </div>
-          <nav>
-            <div class="tb-megamenu tb-megamenu-main-menu">
-              <div class="nav-collapse collapse always-show">
-                  <ul class="tb-megamenu-nav nav level-0 items-11">
-                    <li class="tb-megamenu-item level-1 mega mega-align-left dropdown">
-                      <a href="http://www.percona.com/services" class="dropdown-toggle">Services</a>
-                    </li>
-
-                  <li class="tb-megamenu-item level-1 mega dropdown">
-                      <a href="http://www.percona.com/software" class="dropdown-toggle">Software</a>
-                  </li>
-
-                  <li class="tb-megamenu-item level-1 mega dropdown">
-                      <a href="http://www.percona.com/resources" class="dropdown-toggle">Resources</a>
-                  </li>
-
-                  <li class="tb-megamenu-item level-1 mega dropdown">
-                      <a href="http://www.percona.com/news-and-events" class="dropdown-toggle">News &amp; Events</a>
-                  </li>
-
-                  <li class="tb-megamenu-item level-1 mega mega-align-left dropdown">
-                      <a href="http://www.percona.com/percona-community" class="dropdown-toggle">Community</a>
-                  </li>
-
-                  <li class="tb-megamenu-item level-1 mega mega-align-right dropdown">
-                      <a href="http://www.percona.com/about-percona" class="dropdown-toggle">About</a>
-                  </li>
-                </ul>
-                </div>
-            </div>
-          </nav> 
-        </header>
-        
-
-
-{% endblock %}
-
-      <!-- <div id="stripe"></div> -->
-
-{%- block content %}
-
-<div class="fixedwidth-wrapper">
-
-  {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
-
-    <div class="document">
-      
-
-
-  {%- block document %}
-      <div class="documentwrapper">
-      {%- if render_sidebar %}
-        <div class="bodywrapper">
-      {%- endif %}
-
-        {%- block relbar1 %}{{ relbar() }}{% endblock %}
-
-          <div class="body">
-
-            <div class="cta-sidebar-second">
-
-                <div class="side-column-block">
-				<div class="a-btn-container">
-					<a title="Download PDF Manual for Percona Toolkit 2.2" onclick="_gaq.push(['b._trackEvent', 'Percona Toolkit', 'Download', 'Download Manual Percona Toolkit 2.2 ']);" href="http://form.percona.com/Percona-Toolkit-22-Series.html" class="a-btn-green">
-						<span class="a-btn-text-green">Download Manual</span>
-						<span class="a-btn-fixed-slide-text-green">PDF for version 2.2</span>
-						<span class="a-btn-icon-right-green"><span></span></span>
-					</a>
-				</div></div>
-
-                  <div class="side-column-block" id="block-cta-buttons">
-                      <div class="content">
-                      <a href="http://form.percona.com/ContactMe.html" title="Contact Me">
-                          <div class="CTA-buttons">
-                            <span class="a-btn-text-orange"><i class="fa fa-user fa-2" style="padding-right:5px;"></i>CONTACT ME</span><span></span>  
-                          </div>
-                        </a>
-
-                      <a href="/webinars" title="Attend a Webinar"><div class="CTA-buttons">
-                      <span class="a-btn-text-orange"><i class="fa fa-desktop fa-3" style="padding-right:5px;"></i>ATTEND A WEBINAR</span>  
-                      </div></a>
-
-                      <a href="/downloads" title="Download Software"><div class="CTA-buttons">
-                      <span class="a-btn-text-orange"><i class="fa fa-download fa-2" style="padding-right:5px;"></i>DOWNLOAD SOFTWARE</span>  
-                      </div></a>
-
-                      <a href="/subscribe" title="Register For Newsletters"><div class="CTA-buttons">
-                      <span class="a-btn-text-orange"><i class="fa fa-pencil-square-o  fa-2" style="padding-right:5px;"></i>NEWSLETTER REGISTRATION</span>  
-                      </div></a>
-
-                    </div>
-                </div>
-          </div>
-
-            {% block body %} {% endblock %}
-          </div>
-
-          {%- block relbar2 %}{{ relbar() }}
-
-      {%- if render_sidebar %}
-      <div class="percona_com_ad" style="margin:auto;width:630px;"><script type="text/javascript" src="http://www.percona.com/ads.php?size=630x80"></script></div>
-        </div>
-      {%- endif %}
-
-
-
-      </div>
-
-  {%- endblock %}
-
-  {%- block sidebar2 %}{{ sidebar() }}{% endblock %}
-
-      <div class="clearer"></div>
-
-      {%- if last_updated %}
-      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
-      {%- endif %}
-     
-     
-    
-    
-    <div class="license">
-
-      {%- if show_copyright %}
-      {%- if hasdoc('copyright') %}
-      {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
-      {%- else %}
-      {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
-      {%- endif %}
-      {%- endif %}
-
-      <br />
-        Except where otherwise noted, this documentation is licensed under the following license:
-      <br />
-      <a class="urlextern" rel="license" href="http://creativecommons.org/licenses/by-sa/2.0/">
-        CC Attribution-ShareAlike 2.0 Generic</a><br />
-
- {%- if show_sphinx %}
-      {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
-    {%- endif %}    
-
-     </div>
-
-    </div>
-    {%- endblock %}
-</div>
-
-{%- block footer %}
-
-
-    <div class="file-bugs">
-        This documentation is developed in Launchpad as part of the <a  rel="nofollow" href="https://code.launchpad.net/percona-toolkit">Percona Toolkit source code</a>.<br/>
-    If you spotted innacuracies, errors, don't understood it or you think something is missing or should be improved, please <a rel="nofollow" href="https://bugs.launchpad.net/percona-toolkit/+filebug?field.tags=doc&amp;field.comment=[In:Percona Toolkit Documentation]&amp;?field.tags=doc&amp;field.title=[DOC] ">file a bug</a>.
-  
-    </div>
-    
-
-
-    {% endblock %}
-
-
-
-    
-
-
-{%- endblock %}
-</div>
-<div id="stickyfooter"> 
-      <footer id="footer">
-        <div class="footer">
-          <div class="region region-footer">
-            <div id="block-block-33" class="block block-block contextual-links-region">
-              <div class="content">
-              <div class="footerContainer">
-                <div class="footerNewsletterContainer"><img src="/sites/all/themes/percona/images/footer-logo.png" /><br />
-                  <div class="footerNewsletterTitle">Sign-up for Percona Newsletters</div>
-                  <a href="/subscribe"><div class="footerNewsletter">Register Now</div></a>
-                  <div class="footerSocialIcon"><a rel="nofollow" href="https://www.facebook.com/Percona" target="_blank"><img src="/sites/all/themes/percona/images/footer-facebook2.jpg"></a></div>
-                  <div class="footerSocialIcon"><a rel="nofollow" href="http://twitter.com/percona" target="_blank"><img src="/sites/all/themes/percona/images/footer-twitter2.jpg"></a></div>
-                  <div class="footerSocialIcon"><a rel="nofollow" href="http://www.linkedin.com/groups?gid=2299033&amp;trk=hb_side_g" target="_blank"><img src="/sites/all/themes/percona/images/footer-linkedin2.jpg"></a></div>
-                  <div class="footerSocialIcon"><a rel="nofollow" href="https://launchpad.net/percona-project" target="_blank"><img src="/sites/all/themes/percona/images/footer-launchpad.jpg"></a></div>
-                  <div class="footerSocialIcon"><a href=""><img src="/sites/all/themes/percona/images/footer-email.jpg"></a></div>
-                </div>
-                <!-- Eof LOGO / SUBSCRIBE / SOCIAL LINKS -->
-                <div class="footerLinksContainer">
-                  <div class="footerLinksRow1Col1">
-                    <div class="footerLinksTitle"><a href="/services">SERVICES</a></div>
-                    <div>
-                      <ul class="footerLinks">
-                      <li><a href="/services/mysql-support">Support</a></li>
-                      <li><a href="/services/percona-managed-services">Managed Services</a></li>
-                      <li><a href="/services/mysql-consulting">Consulting</a></li>
-                      <li><a href="/services/mysql-training">MySQL Training</a></li>
-                      </ul>
-                    </div>
-                  </div>
-
-
-                  <div class="footerLinksRow1Col2">
-                    <div class="footerLinksTitle"><a href="/software">SOFTWARE</a></div>
-                    <div>
-                      <ul class="footerLinks">
-                      <li><a href="/software/percona-server">Percona Server</a></li>
-                      <li><a href="/software/percona-xtradb-cluster">Percona XtraDB Cluster</a></li>
-                      <li><a href="/software/percona-xtradb-cluster">Percona XtraBackup</a></li>
-                      <li><a href="/software/percona-toolkit">Percona Toolkit</a></li>
-                      <li><a href="/software/documentation">Documentation</a></li>
-                      </ul>
-                    </div>
-                  </div>
-
-                  <div class="footerLinksRow1Col3">
-                    <div class="footerLinksTitle"><a href="/resources">RESOURCES</a></div>
-                    <div>
-                    <ul class="footerLinks">
-                    <li><a href="/resources/mysql-webinars">Webinars</a></li>
-                    <li><a href="https://tools.percona.com/wizard">MySQL Configuration Wizard</a></li>
-                    <li><a href="/resources/technical-presentations">Technical Presentations</a></li>
-                    <li><a href="/resources/mysql-videos">Videos</a></li>
-                    <li><a href="/resources/mysql-ebooks">eBooks</a></li>
-                    </ul>
-                    </div>
-                  </div>
-
-
-        <!-- ROW 2-->
-                  <div class="footerLinksRow2Col4">
-                  <div class="footerLinksTitle"><a href="/percona-community">COMMUNITY</a></div>
-                  <div>
-                  <ul class="footerLinks">
-                  <li><a href="/forums">Forums</a></li>
-                  <li><a href="/blog">Performance Blog</a></li>
-                  <li><a rel="nofollow" href="http://groups.google.com/group/percona-discussion" target="_blank">Google Groups</a></li>
-                  <li><a rel="nofollow" href="https://launchpad.net/percona-project" target="_blank">Launchpad</a></li>
-                  </ul>
-                  </div>
-                  </div>
-
-                  <div class="footerLinksRow2Col5">
-                  <div class="footerLinksTitle"><a href="/live/conferences">CONFERENCES</a></div>
-                  <div>
-                  <ul class="footerLinks">
-                  <li><a href="http://www.percona.com/live/london-2014/" target="_blank">Percona Live London 2014</a></li>
-                  <li><a href="http://www.percona.com/live/mysql-conference-2015/" target="_blank">Percona Live Silicon Valley 2015</a></li>
-                  <li><a href="http://www.percona.com/live/openstack-live-2015/" target="_blank">OpenStack Live 2015</a></li>
-                  <li><a href="/news-and-events/mysql-events/" target="_blank">Other MySQL Events</a></li>
-                  </ul>
-                  </div>
-                  </div>
-
-                  <div class="footerLinksRow2Col6">
-                  <div class="footerLinksTitle"><a href="/about-percona">ABOUT</a></div>
-                  <div>
-                  <ul class="footerLinks">
-                  <li><a href="/about-us/our-mission">Mission</a></li>
-                  <li><a href="/about-us/our-team">Team</a></li>
-                  <li><a href="/about-us/careers">Careers</a></li>
-                  <li><a href="/support">Contact</a></li>
-                  </ul>
-                  </div>
-                  </div>
-
-                </div>
-
-        <!-- GET HELP BOX-->
-                <div class="footerGetHelpContainer">
-                  <div class="footerGetHelpEmergency">EMERGENCY?<div class="footerGetHelpNow">Get 24/7 Live Help Now!</div></div>
-                  
-                  <div class="footerPhoneNoContainer">
-                  <div class="footerSalesRegionTitle">Sales North America</div> 
-                  <div class="footerPhoneNo">(888) 316-9775 or (208) 473-2904</div>
-
-                  <div class="footerSalesRegionTitle">Sales Europe</div>  
-                  <div class="footerPhoneNo">
-                  +44-208-133-0309 (UK)<br>
-                  0-800-051-8984 (UK)<br>
-                  0-800-181-0665 (GER)</div>
-
-                  <div class="footerSalesRegionTitle">Training</div>  
-                  <div class="footerPhoneNo">
-                  (855) 55TRAIN or (925) 271-5054</div>
-                  </div>
-                  <!-- Eof GET HELP BOX-->
-
-                </div>
-              </div>
-            </div>      
-          </div>
-        </div>
-        </div><!-- End of: div class="footer" -->
-      </footer>
-    </div>
-    <div class="copyright-container">
-      <div class="copyright">MySQL and InnoDB are trademarks of Oracle Corp. Proudly running Percona Server Copyright © 2006-2014 Percona LLC</div>
-    </div>  
-</div>
-
-<!-- GA //-->
-  <script type="text/javascript">
-  var _gaq = _gaq || [];
-  _gaq.push(['b._setAccount', 'UA-343802-3']);
-  _gaq.push(['b._setDomainName', 'percona.com']);
-  _gaq.push(['b._trackPageview']);
-  (function() {
-  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-  })();
-</script>
-
-<!-- /GA //-->
-<!-- NAVI //-->
-<script type="text/javascript">//<![CDATA[
-
-window.jQuery('#search-form').bind('submit', function() { window.location.href = jQuery('#search-form').attr('action') + '?s=' + jQuery('#search-input').val(); return false; });
-
-
-//]]></script>
-
-
-  </body>
-</html>
-
-
-
-{% if theme_collapsiblesidebar|tobool %}
-{% set script_files = script_files + ['_static/sidebar.js'] %}
-{% endif %}
diff --git a/config/sphinx-build/percona-theme/searchbox.html b/config/sphinx-build/percona-theme/searchbox.html
deleted file mode 100644
index 243e310..0000000
--- a/config/sphinx-build/percona-theme/searchbox.html
+++ /dev/null
@@ -1,22 +0,0 @@
-{#
-    basic/searchbox.html
-    ~~~~~~~~~~~~~~~~~~~~
-
-    Sphinx sidebar template: quick search box.
-
-    :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
-    :license: BSD, see LICENSE for details.
-#}
-{%- if pagename != "search" %}
-<div id="searchbox" style="display: none; padding: 3px;">
-  <h3>{{ _('Quick search') }}</h3>
-    <form class="search" action="{{ pathto('search') }}" method="get">
-      <input type="text" name="q" size="18" />
-      <input type="submit" value="{{ _('Go') }}" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-{%- endif %}
diff --git a/config/sphinx-build/percona-theme/static/boxes_header_bulletpoint.png b/config/sphinx-build/percona-theme/static/boxes_header_bulletpoint.png
deleted file mode 100644
index 415cf94..0000000
Binary files a/config/sphinx-build/percona-theme/static/boxes_header_bulletpoint.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/button-download-icon.png b/config/sphinx-build/percona-theme/static/button-download-icon.png
deleted file mode 100644
index e629c34..0000000
Binary files a/config/sphinx-build/percona-theme/static/button-download-icon.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/content_list_bulletpoint.png b/config/sphinx-build/percona-theme/static/content_list_bulletpoint.png
deleted file mode 100644
index cce9a24..0000000
Binary files a/config/sphinx-build/percona-theme/static/content_list_bulletpoint.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/default.css_t b/config/sphinx-build/percona-theme/static/default.css_t
deleted file mode 100644
index d222ec8..0000000
--- a/config/sphinx-build/percona-theme/static/default.css_t
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- * default.css_t
- * ~~~~~~~~~~~~~
- *
- * Sphinx stylesheet -- default theme.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-@import url("basic.css");
-
-/* -- page layout ----------------------------------------------------------- */
-
-body {
-	font-size: 12px;
-	line-height: 16px;
-	font-family: Arial;
-
-    background-color: #fff;
-    color: #333333;
-    line-height: 20px;
-    margin: 0;
-    padding: 0;
-
-}
-
-div.document {
-    background-color: #fff;
-    margin: 0 auto;
-    overflow: hidden;
-    padding: 30px 0;
-    width: 1000px;
-}
-
-div.documentwrapper {
-     /* float: left; */
-     /* width: 100%; */
-
-}
-
-div.bodywrapper {
-   margin: 10 0 0 0px;
-   padding-right: 12px;
-   width: 700px;
-   float:right;
-}
-
-div.body {
-    background-color: #fff;
-    color: #333333;
-    padding: 0 0 20px;
-    width: 712px;
-}
-
-{%- if theme_rightsidebar|tobool %}
-div.bodywrapper {
-    margin: 0 {{ theme_sidebarwidth }}px 0 0;
-}
-{%- endif %}
-
-div.footer {
-    /* color: {{ theme_footertextcolor }}; */
-    /* width: 100%; */
-    /* padding: 9px 0 9px 0; */
-    /* text-align: center; */
-    /* font-size: 75%; */
-    /*font: 80% "Lucida Grande",Verdana,Lucida,Helvetica,Arial,sans-serif;   */
-    /*background: none repeat scroll 0 0 #333333;*/
-    /*border-top: 2px solid #D95200;*/
-    overflow: hidden;
-}
-
-div.footer a {
-    color: {{ theme_footertextcolor }};
-    text-decoration: underline;
-}
-
-div.related {
-   background-color: #ccc;
-   line-height: 30px;
-   color: #333;
-   background: none repeat scroll 0 0 #F8F8F8;
-   border: 1px solid #E0E0E0;
-   clear: both;
-   padding: 10px;
-   width: 690px;
-   margin-bottom: 5px;
-}
-
-div.related a {
-    color: #999;
-}
-
-div.sphinxsidebar {
-    margin-left: 0px;
-    margin-right: 20px;
-    color: #333333;
-    font-family: Arial,Helvetica,sans-serif;
-    width: 250px;
-    {%- if theme_stickysidebar|tobool %}
-    top: 30px;
-    bottom: 0;
-    margin: 0;
-    position: fixed;
-    overflow: auto;
-    height: auto;
-    {%- endif %}
-    {%- if theme_rightsidebar|tobool %}
-    float: right;
-    {%- if theme_stickysidebar|tobool %}
-    right: 0;
-    {%- endif %}
-    {%- endif %}
-}
-
-{%- if theme_stickysidebar|tobool %}
-/* this is nice, but it it leads to hidden headings when jumping
-   to an anchor */
-/*
-div.related {
-    position: fixed;
-}
-
-div.documentwrapper {
-    margin-top: 30px;
-}
-*/
-{%- endif %}
-
-div.sphinxsidebar h3 {
-    /* font-family: {{ theme_headfont }}; */
-    color: #999;
-    font-size: 18px;
-    line-height: 15px;
-    font-weight: 400;
-    margin-left: 5px;
-    padding: 0;
-}
-
-div.sphinxsidebar h3 a {
-    color: #333;
-}
-
-div.sphinxsidebar a:hover {
-    /* color: #333; */
-}
-
-div.sphinxsidebar h4 {
-    /* font-family: {{ theme_headfont }}; */
-    color: #666;
-    font-size: 18px;
-    font-weight: normal;
-    margin: 5px 0 0 5px;
-    padding: 0;
-}
-
-div.sphinxsidebar p {
-   color: #333;
-   margin-bottom: 5px;
-   margin-left: 5px;
-}
-
-div.sphinxsidebar p.topless {
-    margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
-    margin: 10px;
-    padding-left: 5px;
-    color: #333;
-}
-
-div.sphinxsidebar a {
-    color: #D12907;
-}
-
-div.sphinxsidebar input {
-    border: 1px solid #999;
-    font-family: sans-serif;
-    font-size: 1em;
-}
-
-{% if theme_collapsiblesidebar|tobool %}
-/* for collapsible sidebar */
-div#sidebarbutton {
-    background-color: {{ theme_sidebarbtncolor }};
-}
-{% endif %}
-
-/* -- hyperlink styles ------------------------------------------------------ */
-
-a {
-   color: #D12907;
-   text-decoration: underline;
-   border: medium none;
-   cursor: pointer;
-}
-
-a:visited {
-    color: #D12907;
-    text-decoration: underline;
-}
-
-a:hover {
-   color: #D12907;
-   text-decoration: underline;
-}
-
-{% if theme_externalrefs|tobool %}
-a.external {
-   text-decoration: none;
-   border-bottom: 1px dashed {{ theme_linkcolor }};
-}
-
-a.external:hover {
-   text-decoration: none;
-   border-bottom: none;
-}
-
-a.external:visited {
-    text-decoration: none;
-    border-bottom: 1px dashed {{ theme_visitedlinkcolor }};
-}
-{% endif %}
-
-/* -- body styles ----------------------------------------------------------- */
-
-
-
-a.headerlink {
-    color: {{ theme_headlinkcolor }};
-    font-size: 0.8em;
-    padding: 0 4px 0 4px;
-    text-decoration: none;
-}
-
-a.headerlink:hover {
-    background-color: {{ theme_headlinkcolor }};
-    color: white;
-}
-
-div.body dd, div.body li {
-   text-align: justify;
-}
-
-div.body dt {
-    list-style-type: square;
-    /* margin: 8px 0 8px 30px; */
-    padding: 0 4px 0 5px;
-
-}
-
-div.body p {
-   text-align: justify;
-/*    line-height: 130%;*/
-   margin: 10px 0;
-}
-
-/* div.body ul, */
-div.body li {
-    list-style-type: square;
-    margin: 8px 0 8px 30px;
-    padding: 0 4px 0 5px;
-}
-
-.reference em {
-   font-style: normal;
-}
-
-.std-term {
-   font-style: normal;
-   font-weight: 400;
-   color: #FF7400
-}
-
-div.admonition p.admonition-title + p {
-    display: inline;
-}
-
-div.admonition p {
-    margin-bottom: 5px;
-}
-
-div.admonition pre {
-    margin-bottom: 5px;
-}
-
-div.admonition ul, div.admonition ol {
-    margin-bottom: 5px;
-}
-
-div.note {
-    background-color: #eee;
-    border: 1px solid #ccc;
-}
-
-div.seealso {
-    background-color: #ffc;
-    border: 1px solid #ff6;
-}
-
-div.topic {
-    background-color: #eee;
-}
-
-div.warning {
-    background-color: #ffe4e4;
-    border: 1px solid #f66;
-}
-
-p.admonition-title {
-    display: inline;
-}
-
-p.admonition-title:after {
-    content: ":";
-}
-
-pre {
-    padding: 10px;
-    background-color: #F0E6D9/* {{ theme_codebgcolor }} */;
-    color: {{ theme_codetextcolor }};
-    line-height: 120%;
-    border: 1px dashed #ED9821;
-    font-size: 80%;
-    overflow: auto;
-    /* border-left: none; */
-    /* border-right: none; */
-}
-
-tt {
-/*    background-color: #ecf0f3;
-    padding: 0 1px 0 1px;
-    font-size: 0.95em;*/
-   font-weight: 400;
-}
-
-div.body td {
-   text-align: none;
-}
-
-table.docutils th {
-   background-color: #DEE7EC;
-   border: 1px solid #8CACBB;
-   padding: 3px;
-   text-align: center;
-   font-style: normal;
-   font-weight: 400;
-}
-
-table.docutils td {
-   border: 1px solid #8CACBB;
-   padding: 3px;
-   line-height: 16px;
-   vertical-align: middle;
-}
-
-.warning tt {
-    background: #efc2c2;
-}
-
-.note tt {
-    background: #d6d6d6;
-}
-
-.viewcode-back {
-    font-family: {{ theme_bodyfont }};
-}
-
-div.viewcode-block:target {
-    background-color: #f4debf;
-    border-top: 1px solid #ac9;
-    border-bottom: 1px solid #ac9;
-}
-
-.file-bugs {
-    background: none repeat scroll 0 0 #E8E8E8;
-    border: 1px solid #E0E0E0;
-    clear: both;
-    color: #333333;
-    padding: 10px;
-    text-align: center;
-    font-size: 90%;
-}
-
-div.footer .footer {
-   margin: 0 auto;
-   overflow: hidden;
-   padding: 10px 0;
-   width: 960px;
-   border-top: none;
-}
-
-div.footer .footer .logo {
-    float: left;
-    overflow: hidden;
-    padding: 17px 0 0;
-}
-
-div.footer .footer .text {
-    color: #E0E0E0;
-    float: right;
-    font-family: Arial,Helvetica,sans-serif;
-    font-size: 11px;
-    line-height: 15px;
-    overflow: hidden;
-    text-align: right;
-}
-
-div.license {
-    font-size: 80%;
-    /* padding: 0.5em; */
-    text-align: center;
-    margin: 13px 0 -15px;
-}
-
-#sidenavi.noborder {
-    border-right: medium none;
-    border-top: medium none;
-    margin: 0;
-}
-
-#sidenavi {
-    color: #333333;
-    /* float: left; */
-    font-family: Arial,Helvetica,sans-serif;
-    font-size: 18px;
-    line-height: 25px;
-    overflow: hidden;
-    padding: 10px 0 8px 0px;
-    width: 255px;
-}
-
diff --git a/config/sphinx-build/percona-theme/static/email-small.png b/config/sphinx-build/percona-theme/static/email-small.png
deleted file mode 100644
index 30d7f75..0000000
Binary files a/config/sphinx-build/percona-theme/static/email-small.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/jquery.min.js b/config/sphinx-build/percona-theme/static/jquery.min.js
deleted file mode 100644
index 7c24308..0000000
--- a/config/sphinx-build/percona-theme/static/jquery.min.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.4.2
- * http://jquery.com/
- *
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2010, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Sat Feb 13 22:33:48 2010 -0500
- */
-(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
-e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
-j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
-"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
-true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
-Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
-(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
-a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
-"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
-function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
-c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
-L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
-"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
-a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
-d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
-a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
-!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
-true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
-parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
-false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
-s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
-applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
-else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
-a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
-w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
-cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
-i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
-" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
-this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
-e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
-c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
-a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
-function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
-k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
-C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
-null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
-e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
-f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
-if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
-d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
-"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
-a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
-isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
-{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
-if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
-e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
-"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
-d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
-!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
-toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
-u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
-function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
-if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
-t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
-g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
-for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
-1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
-CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
-relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
-l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
-h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
-CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
-g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
-text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
-setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
-h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
-m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
-"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
-h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
-!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
-h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
-q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
-if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
-(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
-function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
-gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
-c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
-{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
-"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
-d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
-a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
-1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
-a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
-c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
-wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
-prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
-this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
-return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
-""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
-this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
-u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
-1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
-return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
-""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
-c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
-c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
-function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
-Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
-"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
-a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
-a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
-"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
-serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
-function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
-global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
-e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
-"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
-false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
-false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
-c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
-d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
-g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
-1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
-"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
-if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
-this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
-"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
-animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
-j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
-this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
-"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
-c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
-this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
-this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
-e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
-c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
-function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
-this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
-k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
-f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
-a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
-c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
-d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
-"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
-e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff --git a/config/sphinx-build/percona-theme/static/percona.com.css b/config/sphinx-build/percona-theme/static/percona.com.css
deleted file mode 100644
index cb841e1..0000000
--- a/config/sphinx-build/percona-theme/static/percona.com.css
+++ /dev/null
@@ -1,3949 +0,0 @@
-@font-face {
-
-      font-family: 'Vegur-Regular_font';
-    src: url('Vegur-Regular.otf') format('opentype');
-    
-      
-    font-family: 'GeosansLight';
-    src: url('GeosansLight.ttf') format('truetype');
-}
-    
-    body, html{
-    height:100%;
-    margin:0;
-    padding:0;
-    font-size: 12px;
-    line-height: 16px;
-    font-family: Arial;
-    color: #333333;
-}
-
-form{
-    display:inline
-}
-
-a
-{
-        text-decoration:none;
-}
-
-a, a:visited{
-    border:none;
-    cursor:pointer;
-    color: #d5390b;
-}
-a:hover
-{
-        color: #712000;
-}
-
-img{
-    border:none
-}
-
-div,img{
-    behavior:url(/static/css/iepngfix.htc)
-}
-
-em
-{
-    font-style: italic;
-}
-
-del
-{
-    text-decoration: line-through;
-}
-
-.hidden{
-    display:none
-}
-
-strong {
-    font-weight: bold;
-}
-
-html, body {
-    height: 100%;
-}
-
-#stickywrapper {
-    position: relative;
-    min-height: 100%;
-}
-
-* html #stickywrapper {
-    height: 100%;
-}
-
-#wrapper {
-    min-height: 100%;
-    position: relative;
-}
-#stickycontent {
-    padding-bottom: 102px;
-    margin: 0px auto;
-    overflow: hidden;
-    width: 1000px;
-    border: 0px solid #CCC;
-}
-
-#stickyfooter {
-    position: relative;
-    margin: -97px auto 0 auto;
-}
-a.links
-{
-    font-style: oblique;
-}
-span.subpart
-{
-    font-weight: bold;
-}
-
-/**
- *  LAYOUT
- */
-
-#header{
-    background:#333;
-    overflow:hidden;
-    zoom:1
-}
-
-#header .header{
-    height:95px;
-    margin:0 auto;
-    overflow:hidden;
-    zoom:1;
-}
-#header .header .logo{
-    float:left;
-    overflow:hidden;
-    padding:20px 0;
-    width:230px;
-    zoom:1;
-}
- #topnav a {
-    text-decoration: none !important;
- }
-
-#header .header .right
-{
-        overflow: hidden;
-        zoom: 1;
-        float: left;
-        width: 730px;
-        height: 35px;
-        padding: 30px 0px;
-}
-
-
-#header .header .right .searchlink
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 35px;
-        height: 35px;
-        float: right;
-        padding: 0px 0px 0px 10px;
-}
-
-
-#header .header .right .navicontainer
-{
-        overflow: hidden;
-        zoom: 1;
-        float: right;
-        height: 35px;
-        background: #ffffff url(/static/images/ui-navi-l.png) top left no-repeat;
-}
-
-#header .header .right .navi
-{
-        overflow: hidden;
-        zoom: 1;
-        height: 27px;
-        padding: 4px 10px;
-        background: url(/static/images/ui-navi-r.png) top right no-repeat;
-}
-
-#header .header .right .navicontainer .navi span
-{
-        overflow: hidden;
-        zoom: 1;
-        height: 27px;
-        float: left;
-        margin: 0px;
-}
-#header .header .right .navicontainer .navi span:hover
-{
-        background: #f0f0f0 url(/static/images/ui-navi-hover-l.png) top left no-repeat;
-}
-#header .header .right .navicontainer .navi span.selected, #header .header .right .navicontainer .navi span.selected:hover
-{
-        background: #d5390b url(/static/images/ui-navi-sel-l.png) top left no-repeat;
-}
-
-#header .header .right .navicontainer .navi span a, #header .header .right .navicontainer .navi span a:visited
-{
-        display: block;
-        padding: 6px 10px 4px 10px;
-        height: 17px;
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 14px;
-        line-height: 14px;
-        color: #000000;
-        text-decoration: none;
-}
-#header .header .right .navicontainer .navi span a:hover
-{
-        background: url(/static/images/ui-navi-hover-r.png) top right no-repeat;
-}
-#header .header .right .navicontainer .navi span.selected a.selected, #header .header .right .navicontainer .navi span.selected a.selected:visited, #header .header .right .navicontainer .navi span.selected a.selected:hover
-{
-        background: url(/static/images/ui-navi-sel-r.png) top right no-repeat;
-        color: #ffffff;
-}
-
-
-
-/*
- *   Banners
- */
-
-#slogan
-{
-        overflow: hidden;
-        zoom: 1;
-        height: 125px;
-        background: #d24300 url(/static/images/ui-orange-front.png) bottom center no-repeat;
-        text-align: center;
-}
-
-#stripe
-{
-        overflow: hidden;
-        zoom: 1;
-        height: 20px;
-        background: #d24300 url(/static/images/ui-orange-content.png) top center no-repeat;
-}
-
-
-
-/*
- *   Footer
- */
-
-#footer
-{
-        overflow: hidden;
-        zoom: 1;
-        background: #333333;
-        border-top: 2px #d95200 solid;
-}
-
-#footer .footer
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 960px;
-        margin: 0px auto;
-        padding: 10px 0px;
-}
-
-#footer .footer .logo
-{
-        overflow: hidden;
-        zoom: 1;
-        float: left;
-        padding: 17px 0px 0px 0px;
-}
-
-#footer .footer .text
-{
-        overflow: hidden;
-        zoom: 1;
-        float: right;
-        text-align: right;
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 11px;
-        line-height: 15px;
-        color: #e0e0e0;
-}
-
-#footer .footer .text a, #footer .footer .text a:visited
-{
-        color: #e0e0e0;
-        text-decoration: none;
-}
-#footer .footer .text a:hover
-{
-        color: #ffffff;
-        text-decoration: underline;
-}
-
-
-/*
- *  Menu Dropdowns
- */
-
-div.navi-dropdown
-{
-        display: none;
-        position: absolute;
-        overflow: hidden;
-        zoom: 1;
-        width: 255px;
-                z-index: 900;
-}
-
-div.navi-dropdown .navi-dropdown-header-l
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 255px;
-        height: 20px;
-        background: url(/static/images/ui-dropdown-header-l.png) top left no-repeat;
-}
-
-div.navi-dropdown .navi-dropdown-header-r
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 255px;
-        height: 20px;
-        background: url(/static/images/ui-dropdown-header-r.png) top left no-repeat;
-}
-
-div.navi-dropdown .navi-dropdown-content
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 225px;
-        padding: 0px 15px 5px 15px;
-        background: #ffffff url(/static/images/ui-dropdown-bg.png) repeat-y;
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 14px;
-        line-height: 20px;
-        color: #333333;
-}
-
-div.navi-dropdown .navi-dropdown-content .item
-{
-        padding: 3px 0px 1px 0px;
-}
-
-div.navi-dropdown .navi-dropdown-content a, div.navi-dropdown .navi-dropdown-content a:visited
-{
-        display: block;
-        color: #333333;
-        text-decoration: none;
-}
-div.navi-dropdown .navi-dropdown-content a:hover
-{
-        color: #d12907;
-        text-decoration: underline;
-}
-
-div.navi-dropdown .navi-dropdown-footer
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 255px;
-        height: 10px;
-        background: url(/static/images/ui-dropdown-footer.png) top left no-repeat;
-}
-
-
-div.search-dropdown
-{
-        display: none;
-        position: absolute;
-        overflow: hidden;
-        zoom: 1;
-        width: 255px;
-}
-
-div.search-dropdown .search-dropdown-header
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 255px;
-        height: 20px;
-        background: url(/static/images/ui-dropdown-header-search.png) top left no-repeat;
-}
-
-div.search-dropdown .search-dropdown-content
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 225px;
-        padding: 0px 15px 5px 15px;
-        background: #ffffff url(/static/images/ui-dropdown-bg.png) repeat-y;
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 14px;
-        line-height: 20px;
-        color: #333333;
-}
-
-div.search-dropdown .search-dropdown-content .form
-{
-        padding-top: 2px;
-}
-
-div.search-dropdown .search-dropdown-content .form input
-{
-        border: 1px #c0c0c0 solid;
-        padding: 4px;
-        width: 210px;
-        outline: none;
-}
-div.search-dropdown .search-dropdown-content .form input:focus
-{
-        border: 1px #707070 solid;
-        outline: none;
-}
-
-div.search-dropdown .search-dropdown-footer
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 255px;
-        height: 10px;
-        background: url(/static/images/ui-dropdown-footer.png) top left no-repeat;
-}
-
-
-/*
- *   Layout columns
- */
-#left-column {
-    width: 165px;
-    float: left;
-    margin-right: 25px;
-}
-
-#right-column {
-    width: 230px;
-    float:left;
-    margin-left: 25px;
-}
-
-
-#left-column .navi-title {
-    font-size: 15px;
-    color: #d5390b;
-    margin-bottom: 20px;
-}
-
-#left-column .navi-title span {
-    background: url("/static/images/left_menu_title_bullet.png") right top no-repeat;
-    padding-right: 20px;
-    padding-left: 10px;
-}
-
-#left-column .item, #left-column .subitem {
-    
-    border-top: 1px solid #f3f1ee;
-}
-
-#left-column .subitem {
-    padding-left: 25px;
-}
-
-#left-column .item a, #left-column .subitem a {
-    min-height: 18px;
-    /* line-height: 23px; */
-    
-    color: #a3a3a3;
-    font-size: 11px;
-    text-decoration: none;
-    display: block;
-    padding:  5px 0 2px 10px;
-    background: url('/static/images/left_column_item_bulletpoint.png') left no-repeat;
-}
-#left-column .item a:hover { 
-    text-decoration: underline;
-}
-
-#left-column .selected > a {
-    color: #b82c02;
-    background: url('/static/images/left_menu_item_selected_bulletpoint.png') left no-repeat;
-}
-
-/*
- *   Front page
- */
-.frontpage-text {
-    font-size: 13px;
-}
-.frontpage-text p {
-    text-align: justify;
-}
-div.frontpage-banners
-{
-  overflow: hidden;
-  zoom: 1;
-  width: 960px;
-  margin: 0px;
-  margin-bottom: 20px;
-  padding: 0px;
-}
-
-div.frontpage-banners div.frontpage-banners-container
-{
-  overflow: hidden;
-  zoom: 1;
-  width: 960px;
-    height: 200px;
-    padding-bottom: 30px;
-    z-index: 98;
-}
-
-div.frontpage-banners a.nivo-imageLink
-{
-  position: absolute;
-  top: 0px;
-  left: 0px;
-  width: 960px;
-  height: 200px;
-  border: 0;
-  padding: 0;
-  margin: 0;
-  z-index: 20;
-  display: none;
-}
-
-
-div.frontpage-banners div.frontpage-banners-container div.nivo-directionNav
-{
-    width: 1px;
-    height: 1px;
-    display: none !important;
-    z-index: 18 !important;
-}
-
-div.frontpage-banners div.frontpage-banners-container div.nivo-controlNav
-{
-    position: absolute;
-    top: 200px;
-    width: 960px;
-    text-align: center;
-    font-size: 28px;
-    line-height: 25px;
-}
-
-div.frontpage-banners div.frontpage-banners-container div.nivo-controlNav a
-{
-    padding: 0px 3px;
-    text-decoration: none !important;
-    color: #919191 !important;
-}
-
-div.frontpage-banners div.frontpage-banners-container div.nivo-controlNav a.active
-{
-    color: #d12907 !important;
-}
-
-div.frontpage-banners div.frontpage-banners-selector
-{
-  overflow: hidden;
-  zoom: 1;
-    height: 20px;
-    text-align: center;
-}
-
-div.frontpage-main
-{
-  overflow: hidden;
-  zoom: 1;
-  width: 960px;
-  padding: 0px;
-}
-
-div.frontpage-boxes
-{
-    overflow: hidden;
-    zoom: 1;
-    margin: 25px 0px 0px 0px;
-    width: 515px;
-    padding: 0px;
-}
-
-div.frontpage-boxes div.frontpage-boxes-selector
-{
-    overflow: hidden;
-    zoom: 1;
-    width: 515px;
-}
-
-div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item
-{
-    overflow: hidden;
-    zoom: 1;
-    width: 127px;
-    float: left;
-    margin-left: -1px;
-    border-top: 1px #cccccc solid;
-    border-left: 1px #cccccc solid;
-    border-right: 1px #cccccc solid;
-    border-bottom: 1px #cccccc solid;
-    text-align: center;
-    margin-top: 10px;
-    padding: 0px 0px 0px 0px;
-}
-
-div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item:first-child
-{
-    margin-left: 0px;
-}
-
-div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item.selected
-{
-    background: url(/static/images/ui-tab-bg.png) repeat-x;
-    margin-top: 0px;
-    border-bottom: none;
-    padding: 5px 0px 6px 0px;
-}
-
-div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item a
-{
-    display: block;
-    font-size: 14px;
-    line-height: 13px;
-    font-weight: bold;
-    color: #444444 !important;
-    text-decoration: none !important;
-    padding: 9px 0px 8px 0px;
-}
-
-div.frontpage-boxes div.frontpage-boxes-container
-{
-      overflow: hidden;
-      zoom: 1;
-      font-size: 14px;
-    width: 511px;
-    height: 150px;
-    padding-top: 20px;
-    border-left: 1px #cccccc solid;
-    border-right: 1px #cccccc solid;
-    border-bottom: 1px #cccccc solid;
-    padding-left: 0px;
-}
-
-div.frontpage-boxes div.frontpage-boxes-container div.frontpage-box img
-{
-    padding: 5px 15px 55px 0;
-    float:left;
-}
-
-.innerpage-box {
-    padding: 10px 20px;
-}
-
-.frontpage-icon-section {
-    clear: both;
-}
-
-.frontpage-icon-section img{
-    float: left;
-    margin-right: 12px;
-    width: 55px;
-    height: 55px;
-}
-
-.frontpage-icon-section p {
-    text-align: justify;
-}
-
-
-/*
- *   Content
- */
-
-#contentcontainer
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 960px;
-        padding: 0px 0px;
-        margin: 0px auto;
-}
-
-#content
-{
-        float: left;
-        width: 515px;
-}
-
-#content p
-{
-       margin-bottom:15px;
-}
-
-/*#content h1
-{
-        font-size: 23px;
-        line-height: 30px;
-        margin: 5px 0px 10px 0px;
-        color: #d5390b;
-        font-weight: normal;
-}
-*/
-#content h2
-{
-    font-weight: normal;
-        font-size: 17px;
-        line-height: 20px;
-        padding: 0px 0px 3px 0px;
-        margin: 30px 0px 15px 0px;
-        color: #000000;
-        border-bottom: 1px #e0e0e0 solid;
-}
-
-#content h3
-{
-        font-weight: bold;
-        font-size: 14px;
-        line-height: 17px;
-        margin: 20px 0px 10px 0px;
-        padding-bottom:5px;
-        color: #000000;
-        text-transform: uppercase;
-        border-bottom:1px solid #ccc;
-}
-
-#content dl dt
-{
-        font-weight: bold;
-        margin-top: 10px;
-        margin-bottom: 10px;
-}
-
-#content dl dd
-{
-        padding: 0px 0px 0px 30px;
-}
-
-#content ol
-{
-        list-style-type: decimal;
-        padding: 0px 0px 0px 30px;
-}
-
-#content ol li
-{
-        list-style-type: decimal;
-        margin: 8px 0px;
-}
-
-
-
-div.side-column-block
-{
-    position: relative;
-    margin: 0 0 20px;
-}
-
-div.side-column-block .header
-{
-    background: url("/static/images/boxes_header_bulletpoint.png") left no-repeat;
-    text-align: left;
-    font-size: 14px;
-    line-height: 20px;
-    padding: 3px 0px 3px 20px;
-    margin-bottom: 10px;
-    font-weight: bold;
-    border-bottom: 1px solid #efece8;
-    
-}
-
-div.side-column-block div.content
-{
-    font-size: 11px;
-    padding-left: 5px;
-}
-
-div.side-column-block div.content div.more
-{
-        overflow: hidden;
-        zoom: 1;
-        text-align: right;
-        padding: 5px 0px 0px 0px;
-        font-size: 11px;
-        line-height: 17px;
-}
-div.side-column-block div.content li {
-    padding-left: 10px;
-    list-style:none;
-    background: url('/static/images/boxes_list_bulletpoints.png') left top no-repeat;
-    margin-bottom:7px;
-}
-
-div.side-column-block .content a {
-    color: #b82c02;
-    text-decoration: none;
-}
-
-div.side-column-block .content table.call-us {
-    width: 100%;
-}
-div.side-column-block .content table.call-us tr {
-    margin-bottom: 10px;
-}
-div.side-column-block .content table.call-us th {
-    vertical-align: text-top;
-    color: #e05d02;
-    font-size: 11px;
-    font-weight: normal;
-}
-div.side-column-block .content table.call-us td, div.side-column-block .content table.call-us th {
-    padding-bottom: 10px;
-}
-div.side-column-block .content table.call-us td a {
-    color: #e05d02;
-}
-
-div.side-column-block .content .button-customer-login span{
-    display: none;
-}
-.side-column-block .content .button-customer-login {
-    display: block;
-    background: url('/static/images/button-customer-login.png') top left no-repeat;
-    width: 220px;
-    height: 30px;
-    margin-top: 12px;
-}
-.side-column-block .side-contact-buttons {
-    margin-left: -5px;
-}
-.side-column-block .side-contact-buttons li {
-    margin-bottom: 5px;
-    padding-left: 0 !important;
-}
-.side-column-block .side-contact-buttons a {
-    display: block;
-    width: 228px;
-    height: 32px;
-    background: url('/static/images/side_buttons.png') top left no-repeat;
-}
-.side-column-block .side-contact-buttons a.contact-me { background-position: 0px 0px; }
-.side-column-block .side-contact-buttons a.webinar { background-position: 0px -36px; }
-.side-column-block .side-contact-buttons a.download-software { background-position: 0px -72px; }
-.side-column-block .side-contact-buttons a.newsletters { background-position: 0px -108px; }
-
-.side-column-block .side-contact-buttons a span {
-    display: none;
-}
-
-
-.side-column-block .content .numbers
-{
-        padding-left: 45px;
-        background: url(/static/images/phone.png) 2px center no-repeat;
-        line-height: 18px;
-        text-align: right;
-        padding-right: 5px;
-}
-
-/*
- *   Our team list
- */
-
-.our-team-page h2
-{
-    clear: both;
-}
-
-
-.our-team-page div.views-row {
-    margin-top: 0px !important;
-    text-align: center;
-}
-
-.our-team-page .views-field-title a {
-    text-decoration: none;
-    font-weight: bold;
-}
-.our-team-page .views-field-field-job-title {
-    color: #555555;
-}
-
-.our-team-page .views-field-field-picture img {
-    border-radius: 8px;
-    box-shadow: 2px 2px 3px #bbbbbb;
-}
-
-
-
-div.our-team-item
-{
-    text-align: center;
-    overflow: hidden;
-    zoom: 1;
-    width: 162px;
-    margin-left: 5px;
-    height: 200px;
-    float: left;
-}
-
-.pagecontent div.our-team-profile {
-    height: inherit;
-    margin-left: 0;
-}
-.pagecontent div.our-team-profile img{
-    margin-top: 20px;
-    margin-left: 0;
-    margin-right: 0;
-}
-div.our-team-item .img img
-{
-        border: 1px #e0e0e0 solid;
-        padding: 2px;
-}
-
-/*
- *   Phone Directory
- */
-
-table.phonetable {
-    margin-top: 1em;
-    border-collapse: collapse;
-}
-
-.phonetable {
-        margin-left: 2em;
-}
-
-table.phonetable th,
-table.phonetable tr {
-    text-align: left;
-}
-
-table.phonetable th {
-        border: 1px #e0e0e0 solid;
-        background: #f8f8f8;
-        padding: 7px;
-        font-weight: bold;
-}
-
-table.phonetable td {
-        border: 1px #e0e0e0 solid;
-        padding: 7px ;
-}
-
-table.phonetable .label {
-    text-align: left;
-}
-
-table.phonetable td.label {
-}
-
-/*
- * contact forms
- */
-.form-item
-{
-    clear: both;
-    margin-top: 1em;
-    position: relative;
-}
-.form-item label
-{
-    display: block;
-    font-weight: bold;
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 13em;
-}
-.form-required
-{
-    color: #fa0;
-    font-weight: bold;
-}
-.form-item .description
-{
-    color: #888;
-    font-size: 0.85em;
-    line-height: 150%;
-    position: relative;
-    left: 14em;
-}
-#edit-submitbutton
-{
-    position: relative;
-    left: 12em;
-    margin: 1em 0;
-}
-.form-item input[type=text],
-.form-item input[type=password],
-.form-item select,
-.form-item textarea
-{
-    border: 1px solid #CCC;
-    width: 350px;
-    position: relative;
-    top: 0;
-    left: 13em;
-}
-.form-item textarea
-{
-    height: 12em;
-    padding: 3px;
-    left: 12em;
-}
-.form-item-spacer
-{
-    padding-top: 1em;
-}
-.form-item #captcha
-{
-    position: relative;
-    top: 0;
-    left: 12em;
-}
-#edit-submitted-captcha
-{
-    margin-top: 0.5em;
-    width: 154px;
-}
-fieldset.form-item-set
-{
-    border: 1px solid #ccc;
-    display: block;
-    margin: 12px 0;
-    padding: 12px;
-}
-fieldset.form-item-set legend
-{
-    border: none;
-    display: block;
-    padding: 0 2px;
-}
-div.error
-{
-    background: #fff;
-    border: solid 1px #c52020;
-    color: #C52020;
-    padding: 5px;
-}
-div.messages
-{
-    margin: 5px 20px;
-    font-size: 12px;
-}
-div.messages ul,
-div.messages ul li
-{
-    list-style-image: none;
-    list-style-type: none;
-}
-div.messages ul li
-{
-    padding: 0 0 0.2em 0;
-}
-.form-item .error
-{
-    background-color :#fdd;
-}
-
-#emergency-contacts .node-field-name
-{
-    text-align: right;
-    font-weight: bold;
-    padding-right: 1em;
-}
-#emergency-contacts .node-field-value-phone
-{
-    font-weight: bold;
-    color: #137F00;
-}
-#emergency-contacts .node-field-help
-{
-    font-weight: bold;
-}
-
-/*
- * compact template
- */
-#compact_footer
-{
-    width: auto !important;
-}
-#compact_contentcontainer
-{
-    overflow: hidden;
-    zoom: 1;
-    width: auto;
-    padding: 30px 0px;
-    margin: 0px 20px;
-}
-
-.content-featured-box {
-    float: right;
-    background-color: #f9f9f9;
-    color: #999999;
-    font-size: 11px;
-    padding: 20px;
-    width: 130px;
-    margin: 0px 0 10px 10px;
-}
-.content-featured-box .footer {
-    margin-top: 10px;
-    text-align: right;
-    color: #666666;
-    font-size: 11px;
-}
-.content-featured-box .footer em {
-    font-style: normal;
-    font-size: 11px;
-}
-
-.quotes-box {
-    /*height: 200px;*/
-}
-.quotes-box .content {
-    /*height: 190px;
-    overflow: auto;*/
-}
-
-#content ul {
-    margin-left: 0px;
-    padding-left: 15px;
-    margin-bottom: 30px;
-}
-
-#content ul li {
-    /*list-style-image: url('/static/images/content_list_bulletpoint.png');*/
-    list-style-image: url('/sites/all/themes/percona/images/orange-bullet-square.png');
-    margin-bottom: 5px;
-    line-height: 16px;
-}
-
-#content ul.alt-list li {
-    /*list-style-image: url('/static/images/content_list_bulletpoint.png');*/
-    list-style-image: url('/sites/all/themes/percona/images/orange-bullet-square.png');
-    font-size: 12px;
-}
-
-#content ul.alt-list li a {
-    text-decoration: none;
-    
-}
-
-.field-row {
-    margin-bottom: 20px;
-}
-.field-row label {
-    display:block;
-    width: 80px;
-    color: #cc3300;
-    float: left;
-}
-.field-row .field {
-    display: block;
-    width: 400px;
-    float: left;
-}
-.field-row:after {
-    content: ".";
-    display: block;
-    visibility: hidden;
-    height: 0;
-    clear:both;
-}
-
-
-/*
- *   Customer list
- */
-
-.custlogo img
-{
-   /* Images are 175px wide; three side-by-side in a 720px div means each has
-    * roughly 240px of space to occupy. */
-   padding: 20px;
-   border: 1px solid white;
-}
-
-.custlogo img:hover
-{
-   border: 1px solid gray;
-}
-
-/*
- *   Form table
- */
-
-table.formtable
-{
-        border-collapse: collapse;
-}
-
-table.formtable th
-{
-        font-weight: normal;
-        white-space: nowrap;
-        padding: 4px 20px 4px 0px;
-}
-
-table.formtable td
-{
-        padding: 4px 0px 4px 0px;
-}
-
-table.formtable td input[type='text'],
-table.formtable td select
-{
-        border: 1px #e0e0e0 solid;
-        padding: 4px;
-        width: 400px;
-}
-
-table.formtable td.submit
-{
-        padding: 10px 0px 0px 0px;
-        text-align: center;
-}
-
-
-/*
- *   Data table
- */
-
-table.datatable
-{
-    margin-top: 1em;
-        border-collapse: collapse;
-        font-size:12px;
-}
-.datatable
-{
-        margin-left: 2em;
-}
-table.datatable th,
-table.datatable tr {
-    text-align: center;
-}
-
-table.datatable th
-{
-    background: none repeat scroll 0 0 #525151;
-    border-bottom: 3px solid #e67b1a;
-    border-top: 1px solid #e0e0e0;
-    border-right: 1px solid #e0e0e0;
-    border-left: 1px solid #e0e0e0;
-    font-weight: normal;
-    padding: 5px;
-    font-size:16px;
-    text-transform:uppercase;
-    color:#fff;
-}
-
-table.datatable td
-{
-        border: 1px #e0e0e0 solid;
-        padding: 7px;
-}
-
-table.datatable .label {
-    text-align: left;
-    
-}
-
-/*
- *   Presentations
- */
-
-div.presentation
-{
-        border-top: 1px #e0e0e0 dotted;
-        padding: 15px 0px;
-}
-div.presentation:first-child
-{
-    margin-top: 0;
-        border: none;
-}
-
-div.presentation table.presentation
-{
-        border-collapse: collapse;
-}
-
-div.presentation table.presentation td div.bordered-image-screenshot
-{
-        border: 1px #e0e0e0 solid;
-        background: #f8f8f8;
-        padding: 5px;
-}
-
-div.presentation table.presentation td.presentations-descr
-{
-    vertical-align: top;    
-        padding-left: 15px;
-}
-
-div.presentation table.presentation td.presentations-descr * {
-    vertical-align: top;
-}
-div.presentation table.presentation td.presentations-descr h4
-{
-    font-size: 14px;
-    
-   font-weight: bold;
-    margin-top: 0px !important;
-    margin-bottom: 10px;
-    border-top: none !important;
-}
-
-/** New Presentations */
-.view-technical-presentations .view-filters * {
-    font-size: 10px;
-}
-.view-technical-presentations .view-filters .form-item input {
-    left: 0 !important;
-    width: 100px;
-    }
-.view-technical-presentations .view-filters .form-item select {
-    left: 0 !important;
-   width: 60px;
-    /*left: 70px;*/
-}
-.view-technical-presentations .view-filters .form-item label {
-    width: 70px;
-}
-.view-technical-presentations .view-filters .views-exposed-form {
- /*   padding-left: 300px;*/
-    border-bottom: 1px solid #eee;
-}
-/*.view-technical-presentations .view-filters .views-exposed-form .views-exposed-widget {
-    float: none;
-}*/
-.view-technical-presentations li {
-    list-style-image: url("/static/images/left_menu_item_selected_bulletpoint.png") !important;
-    margin-bottom: 20px; 
-    border-bottom: 1px solid #eee;
-}
-.view-technical-presentations h3 {
-    font-size: 16px;
-}
-.view-technical-presentations h3 a {
-    text-decoration: none !important;
-}
-.view-technical-presentations .presentation-date {
-    font-size:12px; 
-    font-weight: bold;
-    margin-bottom:5px
-}
-.view-percona-tv .views-exposed-form .views-exposed-widgets {
-    padding-left: 25px;
-}
-.view-percona-tv .views-exposed-form .views-exposed-widget
-{
-    display: inline-block;
-    float: left;
-}
-.view-percona-tv .views-exposed-form .views-exposed-widget label {
-    display: none !important;
-}
-.view-percona-tv .views-exposed-form .views-exposed-widget select, .view-percona-tv .views-exposed-form .views-exposed-widget input[type="text"] {
-    left: 0 !important;
-    position: inherit;
-    width: 150px;
-}
-.view-percona-tv .views-exposed-form .views-exposed-widget input[type="submit"] {
-    margin-top: 0;
-}
-
-
-.view-percona-tv .views-submit-button {
-    text-align: right;
-}
-.view-percona-tv .view-content {
-    margin-top:25px;
-}
-.view-percona-tv .view-content .views-field-title {
-    font-weight: bold;
-    font-size: 14px;
-    margin: 10px 0;
-}
-.view-percona-tv .view-content .views-field-field-video-thumbnail img {
-    border-radius: 7px;
-}
-.view-percona-tv .view-content .views-row {
-    width: 205px;
-    float: left;
-    margin-bottom: 30px;
-}
-.view-percona-tv .view-content .views-row-odd {
-    margin-right: 35px;
-    margin-left: 15px;
-    clear: left;
-}
-.view-percona-tv .view-content .views-field-field-video-thumbnail .field-content {
-    text-align: center;
-}
-.view-percona-tv .view-content .views-field-field-video-thumbnail a {
-     opacity:0.5;
-    filter:alpha(opacity=50); /* For IE8 and earlier */
-    }
-.view-percona-tv .view-content .views-field-field-video-thumbnail a:hover {
-    opacity:1;
-    filter:alpha(opacity=100); /* For IE8 and earlier */
-}
-
-.views-field-created {
-    font-weight: bold;
-}
-
-
-.customer-vote {
-    width: 412px;
-    text-align: justify;
-}
-
-.training-info-container {
-    float: right;
-    width:200px;
-    background-color:#fff;
-    padding:10px;
-    margin:0 15px;
-    border:1px solid #E0E0E0;
-}
-
-.node-percona-tv-video .content iframe {
-    width: 100% !important;
-}
-
-
-/*
- * Software info container
- */
-
-div.software-info-container
-{
-    overflow: hidden;
-    zoom: 1;
-    float: right;
-    padding: 0px 0px 25px 25px;
-}
-
-table.software-info-container
-{
-    width: 240px;
-    border-collapse: collapse;
-}
-
-table.software-info-container td
-{
-    border: 1px #e0e0e0 solid;
-    padding: 10px 10px 10px 10px;
-}
-
-table.software-info-container td.latest
-{
-    padding: 10px 10px 10px 62px;
-    background: url(/static/images/software-latest.png) 15px center no-repeat;
-    min-height: 32px;
-    font-size: 16px;
-    line-height: 24px;
-}
-
-table.software-info-container td.download a
-{
-    font-weight: bold;
-}
-
-table.software-info-container td.download
-{
-    padding: 15px 62px 15px 20px;
-    background: url(/static/images/software-download.png) 195px center no-repeat;
-    min-height: 32px;
-    font-size: 18px;
-    line-height: 24px;
-}
-
-table.software-info-container td.links
-{
-    text-align: left;
-    padding: 4px 10px 4px 20px;
-}
-
-table.software-info-container td.links div
-{
-    margin: 10px 0px;
-}
-
-.inv {
-    display: none;
-}
-
-/*
- *   Downloads table
- */
-
-ul.downloads_list {
-    font-size: 16px;
-}
-ul.downloads_list li {
-    line-height: 20px;
-}
-ul.downloads_list a {
-    text-decoration: none;
-    }
-
-table.downloadstable
-{
-    margin-top: 20px;
-    border-collapse: collapse;
-}
-
-table.downloadstable th
-{
-        border: 1px #e0e0e0 solid;
-        background: #f8f8f8;
-        padding: 7px;
-        font-weight: bold;
-}
-
-table.downloadstable td
-{
-        border: 1px #e0e0e0 solid;
-        padding: 7px;
-}
-
-table.downloadstable td.file
-{
-    width: 90%;
-    text-align: left;
-}
-
-table.downloadstable td.modified
-{
-    width: 5%;
-    text-align: center;
-    white-space: nowrap;
-}
-
-table.downloadstable td.size
-{
-    width: 5%;
-    text-align: right;
-    white-space: nowrap;
-}
-
-/*
- *   Maintenance promo on /downloads
- */
-
-div.downloads-maintenance-promo, div.downloads-warning  
-{
-    border: 1px #e0e0e0 solid;
-    padding: 15px 20px 15px 150px;
-    margin: 30px 0px;
-    background: url(/static/images/shield.png) 35px center no-repeat;
-}
-div.downloads-maintenance-promo > .close-button
-{
-    float:right;
-    clear:right;
-    margin-top:-10px;
-    margin-right:-15px;
-    cursor: pointer; cursor: hand;
-}
-
-div.downloads-warning {
-    background: url(/static/images/warning.png) 35px center no-repeat;
-}
-
-
-/*
- *   Downloads pages
- */
-
-div.downloads-version
-{
-    border-top: 1px #e0e0e0 solid;
-    margin-top: -10px;
-    padding-top: 10px;
-    text-align: right;
-    font-size: 14px;
-    line-height: 14px;
-    font-weight: bold;
-}
-
-div.downloads-anchors
-{
-    font-size: 13px;
-    line-height: 15px;
-    margin: 20px 0px;
-}
-
-div.downloads-backtotop
-{
-    font-size: 13px;
-    line-height: 15px;
-    padding-top: 8px;
-}
-
-.fixedwidth-wrapper {
-    margin: 0 auto;
-    overflow: hidden;
-    width: 1000px;
-    border: solid #ccc 0px;
-}
-
-
-/***
- * side style buttons
-*/
-/* .a-btn-container {
-    overflow:hidden;
-    border-radius:4px;
-}
-.a-btn, .a-btn-new {
-    width: 220px;
-    height: 48px;
-    background: #fdcd34;
-    background:-webkit-gradient(linear,left top,left bottom,color-stop(##fdcd34,0),color-stop(##d42c14,1));
-    background:-webkit-linear-gradient(top, #fdcd34 0%, #d42c14 100%);
-    background:-moz-linear-gradient(top, #fdcd34 0%, #d42c14 100%);
-    background:-o-linear-gradient(top, #fdcd34 0%, #d42c14 100%);
-    background:linear-gradient(top, #fdcd34 0%, #d42c14 100%);
-    filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdcd34', endColorstr='#d42c14',GradientType=0 );
-    
-    padding:0px;
-    
-    display:inline-block;
-    position:relative;
-    -webkit-border-radius:4px;
-    -moz-border-radius:4px;
-    border-radius:4px;
-    
-    overflow:hidden;
-    -webkit-transition:all 0.3s linear;
-    -moz-transition:all 0.3s linear;
-    -o-transition:all 0.3s linear;
-    transition:all 0.3s linear;
-    text-decoration: none !important;
-    border: 1px solid #f08900;
-    margin-bottom: 10px;
-}
-
-.a-btn-text{
-    padding-left:10px;
-    padding-top:10px;
-    display:block;
-    font-size:13px;
-    white-space:nowrap;
-    color: #ffffff;
-    -webkit-transition:all 0.3s linear;
-    -moz-transition:all 0.3s linear;
-    -o-transition:all 0.3s linear;
-    transition:all 0.3s linear;
-    
-}
-
-.a-btn-slide-text, .a-btn-fixed-slide-text {
-    padding-left: 10px;
-    left:0px;
-    width:auto;
-    right:52px;
-    height:0px;
-    
-    color:#000000;
-    font-size:12px;
-    white-space:nowrap;
-    font-family:Georgia, serif;
-    font-style:italic;
-    text-indent:15px;
-    overflow:hidden;
-    
-    
-}
-.a-btn-fixed-slide-text{
-    height: 30px;
-}
-
-.a-btn-icon-right{
-    position:absolute;
-    right:0px;
-    top:0px;
-    height:100%;
-    width:52px;
-}
-
-.a-btn-icon-right span{
-    width:38px;
-    height:38px;
-    
-    position:absolute;
-    left:50%;
-    top:50%;
-    margin:-20px 0px 0px -20px;
-    background:transparent url('/static/images/button-download-icon.png') no-repeat 50% 55%;
-    -webkit-transition:all 0.3s linear;
-    -moz-transition:all 0.3s linear;
-    -o-transition:all 0.3s linear;
-    transition:all 0.3s linear;
-    
-}
-*/
-
-
-.a-btn-green, .a-btn-green-big {
-    background: #84bb81; /* Old browsers */
-    border: none;
-    border-radius: 0;
-    display: inline-block;
-    height: 65px;
-    margin-bottom: 10px;
-    overflow: hidden;
-    padding: 0;
-    position: relative;
-    text-decoration: none !important;
-    transition: all 0.3s linear 0s;
-    width: 100%;
-    
-    box-shadow: 0px 5px #4d9355;
-}
-.a-btn-text-green {
-    color: #FFFFFF;
-    display: block;
-    font-size: 13px;
-    padding-left: 15px;
-    padding-top: 16px;
-    transition: all 0.3s linear 0s;
-    white-space: nowrap;
-    font-weight: bold;
-}
-.a-btn-text-green-big {
-    color: #FFFFFF;
-    display: block;
-    font-size: 23px;
-    padding-left: 50px;
-    padding-top: 18px;
-    transition: all 0.3s linear 0s;
-    white-space: nowrap;
-}
-.a-btn-text-green-big-second {
-    color: #fbdc32;
-    display: block;
-    font-size: 16px;
-    padding-left: 50px;
-    padding-top: 8px;
-    transition: all 0.3s linear 0s;
-    white-space: nowrap;
-}
-
-.a-btn-fixed-slide-text-green {
-    color: #ffffff;
-    font-family: Arial, Helvetica, sans-serif;
-    font-size: 14px;
-    font-style: italic;
-    left: 0;
-    overflow: hidden;
-    padding-left: 14px;
-    right: 52px;
-    text-indent: 15px;
-    white-space: nowrap;
-    width: auto;
-    line-height:20px;
-}
-.a-btn-icon-right-green {
-    height: 100%;
-    position: absolute;
-    right: 0;
-    top: 0;
-    width: 52px;
-    border-left: 1px solid #eee;
-}
-.a-btn-icon-left-green, .a-btn-icon-left-orange {
-    height: 100%;
-    position: absolute;
-    left: 0;
-    top: 0;
-    width: 52px;
-}
-.a-btn-icon-right-green span, .a-btn-icon-left-green span, .a-btn-icon-left-orange span {
-    height: 38px;
-    left: 50%;
-    margin: -19px 0 0 -22px;
-    position: absolute;
-    top: 50%;
-    transition: all 0.3s linear 0s;
-    width: 38px;
-}
-.a-btn-icon-right-green span {
-    background: url("bullet-white.png") no-repeat scroll 50% 55% transparent;
-    margin: -19px 0 0 -22px;
-}
-.a-btn-icon-left-green span {
-    background: url("/static/images/bullet-yellow-green.png") no-repeat scroll 50% 55% transparent;
-    margin: -20px 0 0 -17px;
-}
-.a-btn-icon-left-orange span {
-    background: url("/static/images/bullet-orange.png") no-repeat scroll 50% 55% transparent;
-    margin: -20px 0 0 -30px;
-}
-/* **** */
-
-.paper-desc {
-    padding-left: 20px;
-}
-.papers-content h2 a {
-    text-decoration: none !important;
-    color: inherit !important;
-}
-.paper-author {
-    padding-bottom: 20px;
-}
-.paper-author img {
-    border: 1px solid #CCCCCC;
-    display: block;
-    float: left;
-    margin-right: 15px;
-    padding: 1px;
-    width: 110px;
-}
-.paper-author h2 {
-    border-bottom: 0 !important;
-    color: #000000;
-    font-family: Arial,Helvetica,sans-serif;
-    font-size: 20px;
-    line-height: 20px;
-    margin: 30px 0 0 !important;
-    padding: 0 0 3px;
-}
-.paper-author h3 {
-     color: #555555 !important;
-    font-family: Times New Roman,serif !important;
-    font-style: italic;
-    font-weight: normal !important;
-    margin-left: 130px !important;
-    margin-top: 5px !important;
-}
-.paper-long-desc {
-    width: 310px; 
-    float: left;
-    
-}
-.paper-long-desc > p{
-    padding: 0 20px;
-    margin:0 !important;
-}
-.paper-details .paper-thumb {
-    width: 185px; float: left;
-    margin-right: 10px;
-}
-.paper-details .paper-thumb div.content {
-    padding: 5px;
-}
-.paper-details .paper-thumb img {
-    width: 175px;
-    border: 1px solid #999;
-    box-shadow: 5px 5px 5px #888888;
-}
-.pr-subhead {
-    font-size: 16px !important;
-    border: none !important;
-    text-align: center;
-    margin-top: 15px !important;
-    font-style: italic;
-}
-
-
-.clearer {
-    clear: both;
-}
-
-blockquote {
-display: block;
-padding: 0 0 0 35px;
-font-style: italic;
-}
-
-.book_cover {
-    border: 1px solid #CCCCCC;
-    margin-right: 20px;
-}
-
-.support-yes { color: green; font-weight: bold; }
-.support-no { color: red; }
-.support-cs { color: blue; }
-
-table.support-table * {
-    font-size: 12px !important;
-}
-
-/* 
- * social share styles
- *
-.sharrre .button, .sharrre .IN-widget, .linkedin-company-follow {
-    height: 35px;
-    padding-left: 5px;
-  }
-  
-  .sharrre .linkedin { display: none; }
-  .sharrre .IN-widget, .sharrre .twitter { height: 30px; }
-  */
-
-.translation-buttons {
-    text-align: right;
-}
-.translation-buttons img {
-    width: 25px;
-    
-    margin-right: 10px;
-}
-
-
-
-.news-article {
-    clear:both;
-    margin-top: 10px;
-    padding-bottom: 10px;
-
-}
-.news-article hr {
-    clear: both;
-    border: none;
-
-}
-.news-article > .image {
-    float: left;
-    width: 155px;
-    border: 1px solid #ccc;
-}
-.news-article > .image img {
-    margin: 5px;
-    border: 0;
-}
-.news-article > .news-body {
-    float: left;
-    max-width: 700px;
-    margin-left: 10px;
-}
-.news-article > .news-body .date {
-    font-style: italic;
-    font-size: 12px;
-}
-.news-article > .news-body h3 {
-    margin: 0 !important;
-}
-
-
-.block-aggregator .more-link {
-    display: none;
-}
-
-
-#agreement_form .form_field label {
-    display: inline-block !important;
-    width: 100px;
-    font-size: 14px;
-}
-#agreement_form .form_field .for_checkbox {
-    display: inline !important;
-}
-#agreement_form .form_field input:not([type=checkbox]) {
-    font-size: 14px;
-    padding: 5px;
-    width: 175px;
-    border: 1px solid #999999;
-    border-radius: 10px;
-    color: #333333;
-    outline: medium none;
-    padding-left: 10px;
-}
-#agreement_form .form-submit {
-    display: block;
-    margin:auto;
-    font-size: 18px;
-}
-
-
-#agreement_form .form_field {
-    padding: 15px 0 10px 25px;
-}
-
-
-#location_proposal_form { 
-    background-color: #F9F9F9;
-    border: 1px solid #ccc;
-    border-radius: 10px;
-    padding: 20px 10px;
-    display: none;
-}
-
-#percona-training-location-form label {
-    font-size: 13px;
-    width: 8em;
-    text-align: right;
-    padding-top: 5px;
-}
-#percona-training-location-form .form-text {
-    font-size: 12px;
-    padding: 5px;
-    border: 1px solid #999999;
-    border-radius: 10px;
-    color: #333333;
-    outline: medium none;
-    left: 9em;
-}
-#percona-training-location-form .form-submit {
-    display: block;
-    margin:auto;
-    font-size: 14px;
-    margin-top: 10px;
-}
-
-#location_proposal_form .error {
-    margin-bottom: 10px;
-}
-
-.view-percona-mysql-university a {
-    text-decoration: none;
-}
-
-.view-percona-mysql-university li.views-row {
-    margin-bottom: 15px !important;
-}
-
-.node-percona-mysql-university-event .where_content, .node-percona-mysql-university-event .agenda_content {
-    padding-left: 25px;
-}
-
-.view-percona-mysql-university .views-field-field-city, 
-.view-percona-mysql-university .views-field-field-country {
-
-    font-size:16px;
-    
-
-}
-
-.view-display-id-agenda_block .views-field-field-time {
-    text-align:center; font-size: 11px; font-weight: bold; width: 75px; padding: 8px 0;
-    border-bottom: 1px solid #ccc;
-}
-.view-display-id-agenda_block .views-field-title {
-    padding: 8px 10px;
-    border-bottom: 1px solid #ccc;
-}
-.view-display-id-agenda_block td.views-field-field-time {
-    background-color: #eee;
-    }
- .view-display-id-agenda_block .views-field-nothing,
- .view-display-id-agenda_block .views-field-field-slides-link-1 {
-    font-size: 13px; padding: 8px 10px;
-    text-align: center;
-    border-bottom: 1px solid #ccc;
-
-}
-.view-display-id-agenda_block tr.item-percona-mysql-university-session {
-    background: none;
-}
-.view-display-id-agenda_block tr.item-percona-mysql-university-session td.views-field-nothing,
-.view-display-id-agenda_block tr.item-percona-mysql-university-session .views-field-field-slides-link-1
-{
-    border-left: 1px solid #ccc;
-}
-.view-display-id-agenda_block td.views-field-field-slides-link-1 {
-    
-    border-right: 1px solid #ccc;
-}
-
-.node-percona-mysql-university-session img {
-    margin-top: 0 !important;
-    
-}
-.node-percona-mysql-university-session .our-team-list {
-    
-}
-
-
-.social-share-toolbar {
-
-}
-
-.social-share-toolbar .share_button {
-    display: inline-block;
-    width: 36px;
-    margin-right: 10px;
-    height: 37px;
-    background: url('/static/images/social_share_icons.png') top left no-repeat;
-}
-
-.social-share-toolbar .share_button span {
-    display: none;
-    }
-
-.social-share-toolbar .facebook {
-    background-position: -34px 0;
-    
-}
-
-.social-share-toolbar .linkedin {
-    background-position: -69px 0;
-}
-
-.social-share-toolbar .googleplus {
-    background-position: 0 0;
-    width: 34px;
-}
-
-.social-share-toolbar .twitter {
-    background-position: -105px 0;
-}
-
-h2 a, h2 a:visited {
-    text-decoration: none;
-    color: #000000;
-}
-
-#related-resources {
-    padding-left: 10px;
-}
-
-#related-resources h3 { 
-    cursor: pointer;
-    outline: none;
-    
-}
-
-#related-resources h3 span {
-    background: url("/static/images/arrow_bulletpoints.png") 5px center no-repeat;
-    width: 15px;
-    height: 9px;
-    display: inline-block;
-    margin-right: 5px;
-}
-
-#related-resources h3.ui-state-active span {
-    background-position: -8px;
-}
-
-#related-resources > div {
-    padding-left: 15px;
-}
-
-#related-resources .more-links {
-    text-align: right;
-    padding-right: 25px;
-}
-
-
-
-/** DOWNLOADS */
-#downloads {
-
-}
-
-#downloads .product {
-    padding: 25px 25px;
-    
-    border-bottom: 1px solid #eee;
-    overflow: hidden;
-}
-
-#downloads .product h2 { display: none; }
-
-#downloads .product img {
-    float: left;
-    margin-right: 20px;
-    width: 180px;
-}
-
-#downloads .product p {
-    float: left;
-}
-
-#downloads .product .links {
-    clear: both;
-    overflow: hidden;
-}
-
-#downloads .product .links a{
-    font-size: 12px;
-    display: block;
-    text-decoration: none;
-    width: 40%;
-    text-align: center;
-    float: left;
-}
-
-
-#downloads .product .links ul.major-versions {
-    margin: 0;
-    padding: 0;
-}
-#downloads .product .links ul.major-versions li {
-    list-style: none;
-    width: 22%;
-    float: left;
-    margin-right: 2%;
-
-}
-#downloads .product .links .minor-versions li {
-    list-style: none !important;
-}
-
-#downloads .product .links ul.major-versions li a {
-    clear: both;
-    width: 100%;
-    font-size: 12px;
-}
-#downloads .product .links ul.major-versions li a.latest {
-    margin-bottom: 10px;
-    font-size: 14px;
-}
-#downloads .product .links ul.major-versions li a .version {
-    font-size: 20px;
-    color: #fff;
-    margin-bottom: 0px;
-}
-
-#downloads .product .links ul.major-versions li a span{
-    display: block;
-    text-align: center;
-    font-size:11px;
-}
-#downloads .product .links a.latest{
-
-/**
-    border: none;
-    border-radius: 4px 4px 4px 4px;
-    display: inline-block;
-    height: 65px;
-    margin-bottom: 10px;
-    overflow: hidden;
-    padding: 0;
-    position: relative;
-    text-decoration: none !important;
-    transition: all 0.3s linear 0s;
-    width: 100%;
-    
-
-*/
-
-    background: #0a4200; /* Old browsers */
-    background: -moz-linear-gradient(top,  #de6616 0%, #de6616 100%); /* FF3.6+ */
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#de6616), color-stop(100%,#de6616)); /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top,  #de6616 0%,#de6616 100%); /* Chrome10+,Safari5.1+ */
-    background: -o-linear-gradient(top,  #de6616 0%,#de6616 100%); /* Opera 11.10+ */
-    background: -ms-linear-gradient(top,  #de6616 0%,#de6616 100%); /* IE10+ */
-    background: linear-gradient(to bottom,  #de6616 0%,#de6616 100%); /* W3C */
-    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#de6616', endColorstr='#de6616',GradientType=0 ); /* IE6-9 */
-    border: none;
-    background-color:#de6616;
-    
-    font-size: 14px;
-    border-radius: 0px;
-    
-    color: #fff;
-    padding: 5px;
-}
-#downloads .other-products li {
-    font-size: 14px;
-
-}
-
-#downloads .download-form {
-    clear: both;
-    overflow: hidden;
-}
-
-.side-column-block .download-form {
-    margin-bottom: 20px;
-    display: block;
-    border: 1px solid #ccc; 
-    padding: 5px;
-}
-
-h2.w_links a{
-    color: #D5390B !important;
-}
-h2.w_links a:hover {
-    text-decoration: underline !important;
-}
-
-
-
-
-.inapplp-button-dwnl {
-    width: 40%;
-    margin: 20px;
-    
-    
-    float: left;
-    
-}
-
-a.inapplp-button {
-    background: #0a4200; /* Old browsers */
-    background: -moz-linear-gradient(top,  #099b00 0%, #0a4200 100%); /* FF3.6+ */
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#099b00), color-stop(100%,#0a4200)); /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top,  #099b00 0%,#0a4200 100%); /* Chrome10+,Safari5.1+ */
-    background: -o-linear-gradient(top,  #099b00 0%,#0a4200 100%); /* Opera 11.10+ */
-    background: -ms-linear-gradient(top,  #099b00 0%,#0a4200 100%); /* IE10+ */
-    background: linear-gradient(to bottom,  #099b00 0%,#0a4200 100%); /* W3C */
-    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#099b00', endColorstr='#0a4200',GradientType=0 ); /* IE6-9 */
-    border: none;
-    background-color:#0a4200;
-    
-    font-size: 16px;
-    border-radius: 5px;
-    
-    color: #FBDC32;
-    text-decoration: none;
-    padding: 20px 0;
-    width: 40%;
-    margin: 20px;
-    
-    display: inline-block;
-    float: left;
-    text-align: center;
-}
-
-.2cols {
-    clear: both;
-    overflow: hidden;
-    width: 100%;
-}
-
-
-#block-breadcrumb-breadcrumb {
-    margin-bottom: 15px;
-}
-.pager li{
-  font-size: 16px;
-
-}
-.pager li a{
-  padding: 0 5px;
-  text-decoration: none;
-}
-
-
-
-
-.transcript-speaker {
-    float: left;
-    width: 100px;
-    font-weight: bold;
-}
-
-.transcript-text {
-    margin-left: 120px;
-}
-
-
-
-/*
- *   WM123 OVERRIDES
- */
-
-body, html {
-    color: #666;
-    font-family: Arial;
-    font-size: 14px;
-    line-height: 1.6;
-}
-
-#contentcontainer {
-    margin: 0 auto;
-    overflow: hidden;
-    width: 1024px;
-    border: solid #ccc 0px;
-}
-
-.front #contentcontainer {
-    padding-top: 0px;
-}
-
-#content {
-    float: left;
-    width: 770px;
-    margin-top:20px;
-}
-
-.field-content {
-    margin-bottom:25px;
-}
-
-
-
-/* HEADER (Logo, Top Right Nav, Contact Button) */
-
-.topNavContainer {
-    width:1000px;
-    margin-left:auto;
-    margin-right:auto;
-    margin-top:20px;
-}
-
-#topnav {
-    width:720px;
-    float:right;
-    font-size:11px;
-    text-align:right;
-}
-
-.search-field {
-    margin-top:5px;
-}
-
-.search-button {
-    border: 0px solid #006;
-    background: #b4b3b3;
-    color:#fff;
-    text-transform:uppercase;
-    padding:3px 5px 3px 5px;
-    font-weight:bold;
-}
-
-.search-button:hover {
-    background: #777;
-    cursor:pointer;
-}
-
-.getHelpBox {
-    border:0px solid #000;
-    width:240px;
-    height:30px;
-    float:right;
-    background-color:#e67b1a;
-    text-align:center;
-    color:#fff;
-    font-weight:bold;
-    font-size:16px;
-    border-radius: 5px 5px 0px 0px;
-    margin-bottom:0px;
-    margin-top:25px;
-    padding-top:5px;
-}
-
-.getHelpArrow img{
-    margin-left:5px;
-}
-
-.topnavLink a {
-    font-size:11px;
-    text-align:right;
-    margin-left:10px;
-    margin-right:10px;
-    text-decoration:none;
-    text-decoration:none;
-    margin-right:8px;
-    margin-left:8px;
-    color:#333 important!;
-}
-
-.topnavLink a:hover {
-    color:#d5390b important!;
-}
-
-
-
-#header {
-    background: none repeat scroll 0 0 #fff;
-    /*height: 0px;*/
-    overflow: visible;
-}
-
-
-
-#header .header .right .navicontainer {
-    background: url("") no-repeat scroll left top #333;
-    float: left;
-    margin-left:80px;
-    height: 35px;
-    overflow: hidden;
-    background-color: #333;
-}
-
-#header input[type="submit"] {
-    background-color: #b6b6b6;
-    border: medium none;
-    border-radius: 0px;
-    box-shadow: none;
-    color: #fff;
-    cursor: pointer;
-    font-size: 12px;
-    line-height: 1;
-    padding: 6px;
-    text-transform: uppercase;
-    width: auto;
-    font-family:arial;
-}
-
-#header input[type="submit"]:hover {
-    background-color: #777;
-    color: #fff;
-}
-
-
-#header input {
-    background-color: #fff;
-    border: 1px solid #e3e3e3;
-    box-shadow: 1px 1px 3px #eee inset;
-    color: #999;
-    font-size: 12px;
-    padding: 4px;
-    width: 150px;
-    border-radius: 0px;
-    margin-right: 5px;
-}
-
-/* Eof HEADER (Logo, Top Right Nav, Contact Button) */
-
-
-
-/* Main top nav */
-
-.tb-megamenu{
-  position: relative;
-  background-color: #000;
-}
-
-.tb-megamenu .nav-collapse.collapse {
-    height: auto !important;
-    overflow: visible !important;
-}
-
-.tb-megamenu .nav {
-    margin: 0px;
-    list-style: outside none none;
-    padding: 0px !important;
-}
-
-.tb-megamenu .nav > li {
-    float: left;
-    margin-left: 0px;
-}
-.tb-megamenu .nav > li > a {
-    display: block;
-    border-right: 1px solid #222;
-    border-top: 0px none;
-    color: #FFF;
-    font-size: 18px;
-    font-weight: normal;
-    padding: 13px 26px;
-    text-shadow: none;
-    text-transform: uppercase;
-    text-decoration: none;
-}
-
-.tb-megamenu .nav li a:hover {
-    background-color: #eff0f5 !important;  
-  color: #0e4a86 !important;
-  text-decoration: none !important;
-}
-
-.tb-megamenu:after {
-    clear: both;
-}
-.tb-megamenu:before, .tb-megamenu:after {
-    content: "";
-    display: table;
-    line-height: 0;
-}
-
-/* Eof main top nav */
-
- .searchlink
-{
-        overflow: hidden;
-        zoom: 1;
-        width: 35px;
-        height: 35px;
-        float: right;
-        padding: 0px 0px 0px 10px;
-        display:none;
-}
-
-.lifecycle-box { 
-    display: inline-block;  padding: 5px;
-    width: 130px;
-    text-align: center;
-    vertical-align: middle;
-    text-decoration: none;
-    background-color: #f9f9f9;
-    border: 1px solid #ccc;
-    height: 40px;
-    font-size:12px;
-    margin-bottom:10px;
-}
-.one-line-align {
-    display: inline-block;
-    margin-top:15px;
-}
-.two-line-align {
-    display: inline-block;
-    margin-top:10px;
-}
-
-
-.quotes-box .content {
-font-size:18px;
-line-height:20px;
-font-family:'times';
-color:#626161;
-font-weight:normal;
-font-style:italic;
-padding:10px;
-border-top:1px solid #ccc;
-border-bottom:1px solid #ccc;
-}
-
-td.label {font-size:11px;}
-
-.content-featured-box .footer {
-    color: #666666;
-    font-size: 16px;
-    margin-top: 5px;
-    text-align: right;
-    font-family:'times';
-    font-style:normal;
-}
-
-.content-featured-box .footer em {
-    font-size: 12px;
-    font-style: normal;
-}
-
-
-
-#header .header .logo{
-    float:left;
-    overflow:hidden;
-    padding:10px 0;
-    width:220px;
-    height:66px;
-    zoom:1;
-}
-
-
-.team-name a {
-    color: #d5390b;
-    cursor: pointer;
-    text-decoration: none !important;
-}
-
-.pagecontent div.our-team-profile img{
-    margin-top: 0px;
-    margin-left: 0;
-    margin-right: 0;
-}
-div.our-team-item .img img
-{
-        border: 0px #e0e0e0 solid;
-        padding: 0px 10px 0px 0px;
-}
-
-div.navi-dropdown .navi-dropdown-header-l {
-    background: url('') no-repeat scroll left top rgba(0, 0, 0, 0);
-    height: 0px;
-    overflow: hidden;
-    width: 255px;
-}
-
-div.navi-dropdown .navi-dropdown-footer {
-    background: url("") no-repeat scroll left top rgba(0, 0, 0, 0);
-    height: 10px;
-    overflow: hidden;
-    width: 255px;
-}
-
-div.navi-dropdown .navi-dropdown-content {
-    background: url("") repeat-y scroll 0 0 #ffffff;
-    color: #333333;
-    font-family: "MyriadPro",Arial,Helvetica,sans-serif;
-    font-size: 12px;
-    line-height: 18px;
-    overflow: hidden;
-    padding: 0 15px 5px;
-    width: 180px;
-    margin-top:2px;
-    border-top: 1px solid #333;
-    border-left: 1px solid #333;
-    border-right: 1px solid #333;
-    border-bottom: 1px solid #333;
-}
-
-#header .header .right .navicontainer .navi span.selected, #header .header .right .navicontainer .navi span.selected:hover {
-    background: #445c90 url("") no-repeat scroll left top;
-}
-
-#header .header .right .navicontainer .navi span a:hover
-{
-        background: #445c90 url() top right no-repeat;
-        color:#fff;
-        background-color: #445c90;
-}
-
-
-#header .header .right .navicontainer .navi span.selected a.selected, #header .header .right .navicontainer .navi span.selected a.selected:visited, #header .header .right .navicontainer .navi span.selected a.selected:hover
-{
-        background: url() top right no-repeat;
-        background-color: #445c90;
-        color: #ffffff;
-}
-
-#header .header .right .navicontainer .navi span a, #header .header .right .navicontainer .navi span a:visited {
-    color: #fff;
-    display: block;
-    font-family: "MyriadPro",Arial,Helvetica,sans-serif;
-    font-size: 18px;
-    height: 17px;
-    line-height: 20px;
-    padding: 8px 24px 8px;
-    text-decoration: none;
-    text-transform: uppercase;
-    position: relative;
-    background-color: #333;
-    float:left;
-    margin-left:auto;
-    margin-right:auto;
-}
-
-#header .header .right .navicontainer .navi span.selected a.selected, #header .header .right .navicontainer .navi span.selected a.selected:visited, #header .header .right .navicontainer .navi span.selected a.selected:hover {
-    background: url("") no-repeat scroll right top #445c90;
-    background-color: #445c90;
-    color: #ffffff;
-}
-
-.home-box-titles a:hover{
-text-decoration:none;
-}
-
-.home-box-titles {
-text-decoration:none;
-}
-
-.home-box-titles a{
-text-decoration:none;
-}
-
-.home-box-links {
-text-decoration:none;
-color: #333;
-}
-
-.home-box-links a {
-text-decoration:none;
-color: #333;
-}
-
-.home-box-links a:hover{
-text-decoration:none;
-color: #de6616;
-}
-
-.home-box-more-link a {
-margin-left:10px;
-font-weight:bold;
-color:#de6616;
-font-size:12px;
-text-decoration:none;
-}
-
-.home-box-more-link a:hover {
-margin-left:10px;
-font-weight:bold;
-color:#b94d06;
-font-size:12px;
-text-decoration:none;
-}
-
-
-.home-community-events-news-links ul {
-    font-family: arial;
-    font-size: 12px;
-    margin-bottom: 5px;
-    margin-left: 5px;
-    padding-left: 10px;
-    padding-top: 7px;
-}
-
-
-.home-community-events-news-links a {
-text-decoration:none;
-color: #333;
-}
-
-.home-community-events-news-links a:hover{
-text-decoration:none;
-color: #de6616;
-}
-
-
-
-div.frontpage-banners {
-    margin: 0 0 20px;
-    overflow: hidden;
-    padding: 0;
-    width: 1024px;
-}
-
-div.frontpage-banners a.nivo-imageLink {
-    border: 0 none;
-    display: none;
-    height: 200px;
-    left: 0;
-    margin: 0;
-    padding: 0;
-    position: absolute;
-    top: 0;
-    width: 1024px;
-    z-index: 20;
-}
-
-div.frontpage-banners div.frontpage-banners-container div.nivo-controlNav {
-    font-size: 28px;
-    line-height: 25px;
-    position: absolute;
-    text-align: center;
-    top: 200px;
-    width: 1024px;
-    display:none;
-}
-
-div.frontpage-banners div.frontpage-banners-container div.nivo-controlNav a {
-    color: #ccc !important;
-    padding: 0 3px;
-    text-decoration: none !important;
-}
-
-div.frontpage-banners div.frontpage-banners-container {
-    height: 200px;
-    overflow: hidden;
-    padding-bottom: 0;
-    width: 1024px;
-    z-index: 98;
-}
-
-#left-column {
-    width: 220px;
-    float: left;
-    margin-right: 25px;
-}
-
-div.side-column-block .header
-{
-    display:none;
-    
-}
-
-#stripe {
-    background: url("") no-repeat scroll center top #d24300;
-    height: 0px;
-    overflow: hidden;
-}
-
-.front h1#page-title {
-  display: none;
-}
-
-.front #left-column {
-    width: 165px;
-    float: right;
-    margin-right: 0px;
-    border:1px solid #000;
-    display: none;
-}
-
-.front #content {
-    float: left;
-    width: 100%;
-    border:0px solid #000;
-    margin-top:0px;
-}
-
-.front #content ul {
-    padding-top: 7px;
-    margin-bottom: 5px;
-    margin-left: 5px;
-    padding-left: 10px;
-    font-size: 14px;
-    font-family:'Open Sans',arial;
-}
-
-#content ul li {
-    line-height: 20px;
-    /*list-style-image: url("/sites/all/themes/percona/images/home-arrow-list.png");*/
-    list-style-type: square;
-    margin-bottom: 5px;
-}
-
-.content-featured-box {
-    background-color: #fff;
-    color: #999999;
-    float: right;
-    font-size: 11px;
-    margin: 0 0 10px 10px;
-    padding: 20px;
-    width: 750px;
-    border:1px 1px solid #000;
-}
-
-.body h1 {
-    color: #333;
-    font-family: Arial,helvetica,Tahoma,Verdana;
-    font-size: 24px;
-    font-weight: bold;
-    line-height: 30px;
-    margin: 5px 0px 10px;
-    text-transform: uppercase;
-    border-bottom: 2px solid #E67B1A;
-}
-
-.body h2 {
-    color: #333;
-    font-family: helvetica,Arial,Tahoma,Verdana;
-    font-size: 18px;
-    font-weight: bold;
-    line-height: 22px;
-    margin: 5px 0 20px;
-    text-transform: uppercase;
-    border-bottom: 2px solid #de6616
-}
-
-.breadcrumb {
-    color: #000;
-    font-size: 10px;
-    text-decoration: none;
-    text-transform: uppercase;
-}
-
-.breadcrumb a {
-    color: #000;
-    font-size: 10px;
-    text-decoration: none;
-    text-transform: uppercase;
-}
-
-.introText {
-    font-size:16px;
-    line-height:21px;
-    margin-bottom:15px;
-}
-
-.breadcrumb a:hover {
-    color: #de6616;
-    text-decoration: none;
-    text-transform: uppercase;
-}
-
-#left-column .navi-title {
-    color: #333;
-    font-size: 15px;
-    font-weight:bold;
-    margin-bottom: 0px;
-    text-align:right;
-    border-bottom: 2px solid #5073bc;
-    text-transform: uppercase;
-    margin-top:15px;
-}
-
-#left-column .navi-title-submain{
-    border-bottom: 0px solid #5073bc;
-    color: #999;
-    font-size: 15px;
-    font-weight: bold;
-    padding-right: 5px;
-    margin-top: 15px;
-    text-align: right;
-    text-transform: uppercase;
-    text-decoration:none;
-}
-
-#left-column .navi-title-submain a{
-    border-bottom: 0px solid #5073bc;
-    color: #999;
-    font-size: 15px;
-    font-weight: bold;
-    padding-right: 5px;
-    margin-top: 15px;
-    text-align: right;
-    text-transform: uppercase;
-    text-decoration:none;
-}
-
-#left-column .navi-title-submain a:hover{
-    color: #333;
-}
-
-#left-column .navi-title span {
-    background: url("") no-repeat scroll right top rgba(0, 0, 0, 0);
-    padding-left: 0px;
-    padding-right: 10px;
-}
-
-#left-column .item a, #left-column .subitem a {
-    background: url("/sites/all/themes/percona/images/leftnav-blue-gradation.jpg");
-    color: #666;
-    display: block;
-    font-size: 11px;
-    min-height: 18px;
-    padding: 7px 12px 7px 7px;
-    text-decoration: none;
-    text-align:right;
-    border-bottom: 3px solid #333;
-    border-right: 1px solid #e0dede;
-}
-
-#left-column .item a, #left-column .subitem .selected > a {
-    background: url("/sites/all/themes/percona/images/leftnav-blue-gradation.jpg");
-    color: #666;
-    display: block;
-    font-size: 11px;
-    min-height: 18px;
-    padding: 7px 12px 7px 7px;
-    text-decoration: none;
-    text-align:right;
-    border-bottom: 1px solid #e0dede;
-    border-right: 1px solid #e0dede;
-}
-
-#left-column .item, #left-column .subitem .selected > {
-    border-top: 0px solid #f3f1ee;
-}
-
-#left-column .item a:hover { 
-    text-decoration: none;
-    color: #333;
-}
-
-#left-column .selected > a {
-    font-weight:bold;
-    font-size: 12px;
-    color: #333;
-    background: url('/sites/all/themes/percona/images/leftnav-active-arrow.png') right no-repeat;
-}
-
-/* About */
-
-.SectionTitle {
-    font-family:'GeosansLight';
-    font-size:20px;
-    color:#bf3a32;
-    line-height:22px;
-    font-weight:bold;
-    padding-left:0px;
-    letter-spacing:1px;
-    margin-top:30px;
-}
-
-.SectionContent {
-    text-align:justify;
-    line-height:18px;
-    margin-top:7px;
-    font-size:13px;
-    padding:0px 10px 10px 0px;
-}
-
-
-
-
-/* Services */
-
-.ServicesBoxContent {
-    text-align:justify;
-    line-height:18px;
-    margin-top:10px;
-    font-size:13px;
-    padding:0px 10px 10px 10px;
-}
-
-.ServicesBoxPerconaTitle {
-    font-family:'GeosansLight';
-    font-size:17px;
-    letter-spacing:2px;
-    color:#333;
-    line-height:16px;
-    padding-top:10px;
-    padding-left:10px;
-}
-
-.ServicesBoxTitle {
-    font-family:'GeosansLight';
-    font-size:20px;
-    color:#bf3a32;
-    line-height:22px;
-    font-weight:bold;
-    padding-left:10px;
-    letter-spacing:1px;
-}
-
-.ServicesBoxOutline {
-    margin-top:20px;
-    width:362px;
-    height:185px;
-    border:1px solid #d9d9d9;
-    -moz-border-radius: 8px;
-    border-radius: 8px;
-    background-color:#f7f7f7;
-    float:left;
-}
-
-.ServicesBoxDetailsOutline {
-    border-top:1px solid #d9d9d9;
-    height:15px;
-}
-
-.ServicesBoxDetails {
-    width:230px;
-    float:left;
-    border-right:1px solid #d9d9d9;
-    font-size:11px;
-    text-align:right;
-    padding: 5px 10px;
-}
-
-.ServicesBoxLearnMore {
-    width:90px;
-    float:right;
-    font-size:12px;
-    font-weight:bold;
-    padding: 3px 10px;
-    text-align:right;
-}
-
-/* Software */
-
-.SoftwareBoxOutline {
-    margin-top:-10px;
-    width:100%;
-    border:1px solid #d9d9d9;
-    -moz-border-radius: 0px 0px 8px 8px;
-    border-radius: 0px 0px 8px 8px;
-    background-color:#f7f7f7;
-    float:left;
-}
-
-.SoftwareServicesBoxOutline {
-    margin-top:20px;
-    width:362px;
-    height:185px;
-    background-color:#f7f7f7;
-    float:left;
-}
-
-.SoftwareClusterBoxOutline {
-    margin-top:20px;
-    width:362px;
-    height:185px;
-    background-color:#f7f7f7;
-    float:left;
-}
-
-.SoftwareBoxDetailsOutline {
-    border-top:1px solid #d9d9d9;
-    border-bottom:1px solid #d9d9d9;
-    height:25px;
-}
-
-.SoftwareBoxPerconaTitle {
-    font-family:'GeosansLight';
-    font-size:17px;
-    letter-spacing:2px;
-    color:#333;
-    line-height:16px;
-    padding-top:10px;
-    padding-left:10px;
-}
-
-.SoftwareBoxTitle {
-    font-family:'GeosansLight';
-    font-size:20px;
-    color:#bf3a32;
-    line-height:22px;
-    font-weight:bold;
-    padding-left:10px;
-    letter-spacing:1px;
-}
-
-.SoftwareBoxContent {
-    text-align:justify;
-    line-height:18px;
-    margin-top:10px;
-    font-size:13px;
-    padding:0px 10px 10px 10px;
-}
-
-.SoftwareBoxDetails {
-    width:230px;
-    float:left;
-    border-right:1px solid #d9d9d9;
-    font-size:11px;
-    text-align:right;
-    padding: 5px 10px;
-}
-
-.SoftwareBoxLearnMore {
-    width:90px;
-    float:right;
-    font-size:12px;
-    font-weight:bold;
-    padding: 3px 10px;
-    text-align:right;
-}
-
-
-/* Resources */
-
-.ResourcesBoxContent {
-    text-align:justify;
-    line-height:18px;
-    margin-top:10px;
-    font-size:13px;
-    padding:0px 10px 10px 10px;
-}
-
-
-.ResourcesBoxTitle {
-    font-family:'GeosansLight';
-    font-size:20px;
-    color:#bf3a32;
-    line-height:22px;
-    font-weight:bold;
-    padding-top:10px;
-    padding-left:10px;
-    letter-spacing:1px;
-}
-
-.ResourcesBoxOutline {
-    margin-top:20px;
-    width:362px;
-    height:155px;
-    border:1px solid #d9d9d9;
-    -moz-border-radius: 8px;
-    border-radius: 8px;
-    background-color:#f7f7f7;
-    float:left;
-}
-
-.ResourcesBoxDetailsOutline {
-    border-top:1px solid #d9d9d9;
-    height:15px;
-    margin-top:20px;
-}
-
-.ResourcesBoxDetails {
-    width:230px;
-    float:left;
-    border-right:1px solid #d9d9d9;
-    font-size:11px;
-    text-align:right;
-    padding: 5px 10px;
-}
-
-.ResourcesBoxLearnMore {
-    width:90px;
-    float:right;
-    font-size:12px;
-    font-weight:bold;
-    padding: 3px 10px;
-    text-align:right;
-}
-
-
-#block-block-33 h2 {
-display:none;
-}
-
-
-
-
-/* #Tablet (Portrait)
-================================================== */
-
-    /* Note: Design for a width of 768px */
-    
-    
-@media screen and (max-width: 768px) {
-    #contentcontainer {
-        width: 768px;
-    }
-    
-    #content {
-    float: left;
-    width: 490px;
-}
-
-.content-featured-box {
-    width: 450px;
-}
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/*=============================================================
- * MEGA MENU
- *-------------------------------------------------------------
- * This style sheet is divided into the following 3 sections:
- * 1 Fundamentals
- *      1.1 Reset
- *      1.2 Structure
- *      1.3 Default styles
- * 2 User Overrides
- *      2.1 Widths, margins, and padding
- *      2.2 Vertical menu
- *      2.3 Horizontal slots
- * 3 Skins
- *=============================================================*/
-
-/* @group Fundamentals */
-
-/* Reset
- *------------------------------------------------------------*/
- /* @group Reset */
-.megamenu-menu,
-.megamenu-menu *,
-.megamenu-menu .megamenu-parent,
-.megamenu-menu .megamenu-parent-title,
-.megamenu-menu .megamenu-bin,
-.megamenu-menu .megamenu-slot,
-.megamenu-menu .megamenu-slot-title,
-.megamenu-menu .megamenu-items {
-    margin: 0;
-    padding: 0;
-    border: 0;
-    outline: 0;
-    font-size: 100%;
-    font-weight: normal;
-    vertical-align: baseline;
-    background: transparent;
-}
-
-ul.megamenu-menu,
-.megamenu-menu ul.megamenu-items {
-    list-style: none;
-}
-/* @end */ 
-
-/* Structure
- *------------------------------------------------------------*/
-/* @group Structure */
-.megamenu-menu {
-    overflow: visible; /* Contain floated elements */
-}
-
-.megamenu-menu .megamenu-parent {
-    display: inline;
-    position: relative;
-    z-index: 99;
-}
-
-.megamenu-menu .megamenu-parent-title {
-    display: inline;
-}
-
-.megamenu-menu .megamenu-bin {
-    position: absolute;
-    left: 0; /* Default horizontal orientation */
-    top: -9000px; /* default hidden position */
-    z-index: 10000;
-    overflow: hidden;
-    
-}
-
-/* Bin Alignment
- *--------------------------------------------------------*/
-.megamenu-menu .megamenu-bin-right{
-                     left:auto;
-                     right:-500px;
-}
-
-/* @group Horizontal Links */
-.megamenu-menu .megamenu-links-horizontal {
-    overflow: hidden;
-}
-
-.megamenu-menu .megamenu-links-horizontal li, 
-.megamenu-menu .megamenu-links-horizontal li a {
-    float: left;
-}
-/* @end Horizontal Links */
-
-.megamenu-menu .megamenu-menu-vertical .megamenu-parent {
-    display: block;
-}
-
-/* @end Structure */
-
-
-
-
-/* Default styles
- *--------------------------------------------------------*/
-/* @group Default styles */
-
-.megamenu-menu ul a {
-    text-decoration: none;
-}
-
-.megamenu-menu ul a:hover {
-    text-decoration: underline;
-}
-/* @end */
-/* @end Fundamentals */
-
-
-/* User Overrides
- *
- * This part will have to be dynamically generated in the 
- * customization admin screen.  The user can specify the 
- * proper widths for structural elements according to the 
- * ID of the mega menu.
- *--------------------------------------------------------*/
-/* @group Widths, Padding, & Margins */
-.megamenu-parent {
-    margin: 0.1em 1em; /* Left margin affects fly-out value */
-}
-
-.megamenu-menu .megamenu-bin {
-    padding: 0.5em;
-}
-
-.megamenu-menu .megamenu-slot {
-    width: 200px; /* move this to skins or php */
-    margin-bottom: 0.5em;
-}
-
-/* Vertical Orientation
- *--------------------------------------------------------*/
-/* @group Vertical Menu */
-.megamenu-menu-vertical {
-    width: 8em;
-}
-.megamenu-menu-vertical .megamenu-parent {
-    margin-top: 1em;
-}
-.megamenu-slots.flyright {
-    left: 7em; /* [megamenu-menu-vertical] (width) - [megamenu-parent] (margin) */
-    top: 0;
-}
-
-.megamenu-slots.flyleft {
-    left: -16.2em; /* Calculation of this value did not seem straightforward */
-    top: 0;
-}
-/* @end */
-
-
-/* Horizontal Orientation
- *--------------------------------------------------------*/
-/* @group Horizontal Slots */
-/* This value will have to be calculated to account for slot widths + margins */
-/* 2009.1009.1437 EFD: this width conflicted with our layout. it made more sense for us to set width on the slots themselves. unsure how the interface should handle this. */
-.megamenu-menu .megamenu-slots-columnar {
-    overflow: hidden; /* contain floated slots */
-}
-.megamenu-slots-columnar li.megamenu-slot {
-    float: left;
-}
-/* @end Horizontal Slots */
-/* @end Widths*/
-
-/* megamenu-menu end */
-
-/* Compatibilty with Admin Menu */
-.megamenu-menu {
-  z-index:1000;
-}
-
-/* Skins
- *
- * Skin styles should be limited to typography, colors, and
- * backgrounds. Except for text elements (i.e. h3, megamenu-title,
- * etc.), widths, margins, and padding of structural blocks are
- * set in the administration area.
- *--------------------------------------------------------*/
-
-/* @group Minimal */
-
-.megamenu-skin-minimal {
-    background-color:#bbb;
-}
-
-.megamenu-skin-minimal .megamenu-title {
-    font-size:18px;
-    font-weight:normal;
-}
-
-.megamenu-skin-minimal .megamenu-bin {
-    background-color:#eee;
-    border:2px groove #7e7e7e;
-    -moz-border-radius:0.583em;
-    -webkit-border-radius:0.583em;
-    border-radius:0.583em;
-}
-
-.megamenu-skin-minimal .megamenu-slot {
-    margin-right: 4px;
-
-    border-bottom:1px solid #bbb;
-}
-
-.megamenu-skin-minimal .megamenu-slot-title,
-.megamenu-skin-minimal .megamenu-slot-title a {
-    background-color:#bbb;
-    color:#fff; /* white */
-    font-size:20px;;
-    text-align:center;
-    text-transform:uppercase;
-}
-
-.megamenu-skin-minimal .megamenu-link {
-    font-size:85%;
-}
-/* @end Minimal*/
-
-
-
-/* @group friendly (ucsf theme)*/
-
-/* overrides - begin */
-
-    .megamenu-skin-friendly li{
-        margin:0px;
-        padding:0px;
-        line-height:120%;
-    }
-  .megamenu-skin-friendly *{
-        list-style:none;
-    }
-
-/* overrides - end */
-
-
-.megamenu-skin-friendly{
-    font-family:verdana,tahoma,arial,helvetica,sans-serif;
-    background:#333; /* pharmacy medium gold */
-    padding:7px 0px 6px 10px;
-    color:#fff;
-}
-
-
-.megamenu-skin-friendly a:hover{
-    text-decoration:none;
-}
-.megamenu-skin-friendly .megamenu-parent-title{
-    text-transform:uppercase;
-}
-.megamenu-skin-friendly .megamenu-parent-title{
-    font-weight:normal;
-    font-size:100%;
-    vertical-align:bottom;
-}
-.megamenu-skin-friendly .megamenu-parent-title a,
-.megamenu-skin-friendly .megamenu-parent-title span,
-.megamenu-skin-friendly .megamenu-parent-title a:visited{
-    font-style:normal;
-    color:#fff; /* black */
-    padding:5px;
-}
-.megamenu-skin-friendly .megamenu-parent-title a,
-.megamenu-skin-friendly .megamenu-parent-title span,
-.megamenu-skin-friendly .hovering .megamenu-parent-title a:hover{
-    -moz-border-radius-topright:0px;
-    -webkit-border-top-right-radius:0px;
-    -moz-border-radius-topleft:0px;
-    -webkit-border-top-left-radius:0px;
-}
-.megamenu-skin-friendly .megamenu-slot,
-.megamenu-skin-friendly .megamenu-slot a:hover{
-    -moz-border-radius:0px;
-    -webkit-border-radius:0px;
-    border-radius:0px;
-}
-.megamenu-skin-friendly li.megamenu-slot{
-    /*width:auto;*/
-    /*max-width:200px;*/
-    width:200px;
-    margin:10px 10px auto auto;
-    background:#445c90; /* pharmacy dark gold */
-    padding-top:0px;
-    padding-bottom:10px;
-    color:#333;
-}
-.megamenu-skin-friendly li.megamenu-slot:hover{
-    background-color:#445c90; /* pharmacy dark gold */
-    color:#333;
-}
-.megamenu-skin-friendly .hovering .megamenu-parent-title a,
-.megamenu-skin-friendly .hovering .megamenu-parent-title span{
-    color:#fff;
-    background:#445c90; /* pharmacy dark gold */
-}
-.megamenu-skin-friendly .hovering .megamenu-parent-title span:hover,
-.megamenu-skin-friendly .megamenu-slot-title span{
-    cursor:default;
-}
-.megamenu-skin-friendly .hovering .megamenu-parent-title a:hover{
-    color:#ccc; /* white */
-    background:#445c90; /* 540 blue */
-}
-.megamenu-skin-friendly .megamenu-bin{
-    margin-top:5px;
-    padding:0px;
-    color:#000; /* white */
-    background: #eef1f6;
-    border: 1px solid #000;
-    z-index: 1000;
-}
-.megamenu-skin-friendly .megamenu-slot-title{
-    font-family:"Arial Black",Arial,Helvetica,sans-serif;
-    color:#fff; /* 80% white on pharmacy dark gold */
-}
-.megamenu-skin-friendly .megamenu-slot-title a:link,
-.megamenu-skin-friendly .megamenu-slot-title a:visited{
-    color:#fff; /* 80% white on pharmacy dark gold */
-}
-
-.megamenu-skin-friendly .megamenu-slot-title a:link,
-.megamenu-skin-friendly .megamenu-slot-title a{
-    color:#333; /* 80% white on pharmacy dark gold */
-}
-
-.megamenu-skin-friendly .megamenu-slot-title 
-.megamenu-skin-friendly .megamenu-slot-title {
-    color:#333; /* 80% white on pharmacy dark gold */
-}
-
-.megamenu-skin-friendly .megamenu-slot-title a,
-.megamenu-skin-friendly .megamenu-slot-title span,
-.megamenu-skin-friendly .megamenu-item a,
-.megamenu-skin-friendly .megamenu-item span{
-    padding:5px 12px 7px 12px;
-    display:block;
-}
-.megamenu-skin-friendly .megamenu-slot a{
-    color:#333; /* black */
-}
-.megamenu-skin-friendly .megamenu-slot a:hover{
-    color:#333; /* black */
-    background:#e1e6f1; /* 540 blue */
-}
-.megamenu-skin-friendly .megamenu-item a,
-.megamenu-skin-friendly .megamenu-item span{
-    color:#333; /* white */
-    font-size:12px;;
-    background:#eef1f6; 
-}
-.megamenu-skin-friendly .megamenu-item a:hover{
-    color:#333; /* white */
-    background:#e1e6f1; /* 540 blue */
-}
-.megamenu-skin-friendly li.megamenu-slot{
-    z-index:3000;
-    background:#eef1f6; /* pharmacy dark gold */
-    margin-bottom:1.5em;
-    border:0px;
-    border-radius:0px;
-    -moz-border-radius:0px;
-    -webkit-border-radius:0px;
-    -opera-border-radius:0px;
-    -khtml-border-radius:0px;
-  -khtml-box-shadow:rgba(0,0,0,.33) 0px 0px 0px;
-    -moz-box-shadow:rgba(0,0,0,.33) 0px 0px 0px;
-    box-shadow:rgba(0,0,0,.33) 0px 0px 0px;
-    color:#333;
-
-}
-.megamenu-skin-friendly ul a:hover{
-    text-decoration:none;
-}
-
-.megamenu-skin-friendly .megamenu-slot-title{
-    font-size:100%;
-    line-height:100%;
-    font-weight:bold;
-}
-
-/* start - ensure that #megamenu-menu bar is the same height in all browsers
- * very frustrating to get this correct - do not touch!
- *--------------------------------------------------------*/
-.megamenu-skin-friendly .megamenu-item a,
-.megamenu-skin-friendly .megamenu-item span
-{
-   font-size: 10px;
-    line-height: 12px;
-}
-.megamenu-menu,
-.megamenu-skin-friendly .megamenu-parent,
-.megamenu-skin-friendly .megamenu-parent-title
-/* this is the key -- all these must be set to the same value */
-{
-    font-size:100%;
-    line-height:100%;
-    height:100%;
-}
-
-.megamenu-skin-friendly .megamenu-parent-title a,
-.megamenu-skin-friendly .megamenu-parent-title a:link,
-.megamenu-skin-friendly .megamenu-parent-title a:visited,
-.megamenu-skin-friendly .megamenu-parent-title a:focus,
-.megamenu-skin-friendly .megamenu-parent-title a:hover,
-.megamenu-skin-friendly .megamenu-parent-title a:active,
-.megamenu-skin-friendly .megamenu-parent-title span
-{
-    padding:4px 8px;
-}
-/* end - ensure that #megamenu-menu bar is the same height in all browsers
- *--------------------------------------------------------*/
-.megamenu-skin-friendly .megamenu-parent-title a:hover {
-    text-decoration:none;
-    color:#fff; /* white */
-    background:#445c90; /* 540 blue coated */
-}
-/* @end Friendly */
-
-
-
-#stickyfooter {
-    margin: -97px auto 0;
-    position: relative;
-}
-#footer {
-    
-    background-color: #EDECEC;
-    border-top: 0;
-    margin-top: 20px;
-    overflow: hidden;
-    /*padding: 0 60px;
-    font-family: Arial,Helvetica,sans-serif;
-    font-size: 11px;
-    color: #E0E0E0;
-    line-height: 15px;
-    position: relative;*/
-}
-#footer .footer {
-    overflow: hidden;
-    width: 1024px;
-    margin: 0px auto;
-    padding: 0px;
-}
-
-
-.footerContainer {
-    max-width: 1000px;
-    min-height: 250px;
-    background-color: #EDECEC;
-    margin-left: auto;
-    margin-right: auto;
-    padding-top: 10px;
-    padding-left: 0px;
-}
-
-.footerNewsletterContainer {
-    width: 190px;
-    min-height: 200px;
-    float: left;
-    margin-right: 15px;
-    margin-top: 10px;
-    border-right: 1px solid #CCC;
-}
-
-.footerSocialIcon img {
-    float: left;
-    margin-right: 6px;
-    width: 30px;
-    height: 30px;
-}
-.footerNewsletterTitle {
-    font-family: "Lucida Sans Unicode","Lucida Grande",sans-serif;
-    font-size: 17px;
-    color: #333;
-    line-height: 1.1;
-    margin: 20px 0px 10px;
-}
-#footer a {
-    border: medium none;
-    color: #333;
-    cursor: pointer;
-    text-decoration: none;
-}
-.footerNewsletter {
-    width: 165px;
-    background-color: #E67B1A;
-    color: #FFF;
-    padding: 5px;
-    margin-bottom: 20px;
-    text-align: center;
-    text-transform: uppercase;
-    font-weight: bold;
-}
-
-.footerLinksContainer {
-    max-width: 580px;
-    float: left;
-    min-height: 200px;
-    margin-top: 10px;
-}
-.footerGetHelpContainer {
-    background-color: #DDD;
-    float: right;
-    margin-right: 0px;
-    margin-top: -10px;
-    min-height: 260px;
-    width: 212px;
-}
-.footerLinksRow1Col1 {
-    width: 140px;
-    height: 120px;
-    float: left;
-    margin-right: 15px;
-    margin-left: 35px;
-}
-.footerLinksTitle {
-    font-family: Arial,Helvetica,sans-serif;
-    font-weight: bold;
-    font-size: 13px;
-    color: #333;
-}
-ul.footerLinks {
-    color: #333;
-    font-family: Arial,Helvetica,sans-serif;
-    font-size: 11px;
-    font-style: normal;
-    font-variant: normal;
-    font-weight: normal;
-    list-style-type: none;
-    list-style-position: outside;
-    text-decoration: none;
-    text-indent: 0px;
-    margin: 0px;
-    padding: 0px;
-}
-.footerLinksRow1Col2 {
-    width: 170px;
-    height: 120px;
-    float: left;
-    margin-right: 15px;
-    margin-left: 15px;
-}
-.footerLinksRow1Col3 {
-    width: 150px;
-    height: 130px;
-    float: left;
-    margin-right: 15px;
-    margin-left: 15px;
-}
-.footerLinksRow2Col4 {
-    width: 140px;
-    height: 100px;
-    float: left;
-    margin-right: 15px;
-    margin-left: 35px;
-}
-.footerLinksRow2Col5 {
-    width: 170px;
-    height: 100px;
-    float: left;
-    margin-right: 15px;
-    margin-left: 15px;
-}
-.footerLinksRow2Col6 {
-    width: 150px;
-    height: 100px;
-    float: left;
-    margin-right: 15px;
-    margin-left: 15px;
-}
-.footerGetHelpEmergency {
-    background-color: #D12906;
-    padding: 10px;
-    color: #FFF;
-    font-weight: bold;
-    font-size: 18px;
-    text-align: center;
-    line-height: 1.3;
-}
-.footerPhoneNoContainer {
-    margin: 15px;
-}
-.footerGetHelpNow {
-    color: #FFF;
-    font-size: 12px;
-    text-align: center;
-}
-.footerSalesRegionTitle {
-    font-size: 12px;
-    color: #333;
-    font-weight: bold;
-    line-height: 12px;
-    margin-top: 15px;
-}
-
-.footerPhoneNo {
-    font-size: 11px;
-    color: #424242;
-    margin-bottom: 10px;
-}
-
-.copyright-container {
-    width: 100%;
-    background-color: #000;
-    bottom: 0px;
-}
-
-.copyright {
-    margin-left: auto;
-    margin-right: auto;
-    font-size: 10px;
-    padding: 10px;
-    color: #CCC;
-    text-align: center;
-}
-
-
-
-.cta-sidebar-second {
-    width: 236px;
-    float: right;
-    margin: 80px 0px 10px 20px;
-    border-left: 1px solid #CCC;
-    padding-left: 20px;
-}
-
-.CTA-buttons {
-    background-color: #E67B1A;
-    padding: 5px 5px 5px 3px;
-    margin-bottom: 5px;
-}
-.a-btn-text-orange, .a-btn-text {
-    color: #FFF;
-    display: block;
-    font-size: 14px;
-    padding-left: 5px;
-    padding-top: 4px;
-    transition: all 0.3s linear 0s;
-    white-space: nowrap;
-    background-color: #E67B1A;
-}
-#block-cta-buttons .content {
-    padding: 0;
-}
-
-
diff --git a/config/sphinx-build/percona-theme/static/percona.com.js b/config/sphinx-build/percona-theme/static/percona.com.js
deleted file mode 100644
index 20d397b..0000000
--- a/config/sphinx-build/percona-theme/static/percona.com.js
+++ /dev/null
@@ -1,269 +0,0 @@
-window.jQuery(function($) {
-
-
-
-function setCookie(c_name, value, expiredays)
-{
-	var exdate = new Date();
-	exdate.setDate(exdate.getDate() + expiredays);
-	document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";path=/;expires=" + exdate.toUTCString());
-}
-
-function getCookie(c_name)
-{
-	if (document.cookie.length > 0)
-	{
-		c_start = document.cookie.indexOf(c_name + "=");
-		if (c_start != -1)
-		{
-			c_start = c_start + c_name.length+1;
-			c_end = document.cookie.indexOf(";",c_start);
-			if (c_end == -1)
-			{
-				c_end = document.cookie.length;
-			}
-			return unescape(document.cookie.substring(c_start, c_end));
-		}
-	}
-	return "";
-}
-
-
-NAVI = new Object();
-
-NAVI.CloseTimer = null;
-
-NAVI.Open = function ( menu_tag, dir )
-{
-  NAVI_CancelTimer();
-  NAVI_Close();
-  SEARCH_CancelTimer();
-  SEARCH_Close();
-  if ('h' == dir)
-  {
-    return;
-  }
-  var pos = $("#navilink-span-"+menu_tag).offset();
-  if (dir=='r')
-  {
-    $("#navi-dropdown-"+menu_tag).css( { "position": "absolute", "left": (pos.left + ($("#navilink-span-"+menu_tag).width()) + 2 - ($("#navi-dropdown-"+menu_tag).width())) + "px", "top": (pos.top + 32) + "px" } );
-  }
-  else
-  {
-    $("#navi-dropdown-"+menu_tag).css( { "position": "absolute", "left": (pos.left) + "px", "top": (pos.top + 32) + "px" } );
-  }
-  $("#navi-dropdown-"+menu_tag).show();
-  $("#navilink-span-"+menu_tag).bind('mouseover',NAVI_CancelTimer);
-  $("#navilink-span-"+menu_tag).bind('mouseout',NAVI_Timer);
-  $("#navi-dropdown-"+menu_tag).bind('mouseover',NAVI_CancelTimer);
-  $("#navi-dropdown-"+menu_tag).bind('mouseout',NAVI_Timer);
-};
-
-function NAVI_Close()
-{
-  $(".navi-dropdown").hide();
-  $("#menu div").unbind('mouseover');
-  $(".dropdown").unbind('mouseover');
-  $(".dropdown").unbind('mouseout');
-
-  $("#search-dropdown").hide();
-  $("#searchlink-anchor").unbind('mouseover');
-  $("#searchlink-anchor").unbind('mouseout');
-  $("#search-dropdown").unbind('mouseover');
-  $("#search-dropdown").unbind('mouseout');
-}
-
-function NAVI_CancelTimer()
-{
-  if (NAVI.CloseTimer!=null)
-  {
-    window.clearTimeout(NAVI.CloseTimer);
-    NAVI.CloseTimer = null;
-  }
-}
-
-function NAVI_Timer()
-{
-  if (NAVI.CloseTimer==null)
-  {
-    NAVI.CloseTimer = window.setTimeout(NAVI_Close, 300);
-  }
-}
-
-
-SUBNAVI = new Object();
-
-SUBNAVI.Open = function ( menu_tag )
-{
-  if ($("#sidesubnavi-" + menu_tag + ':hidden').length)
-  {
-    $(".sidesubnavi").hide();
-    $("#sidesubnavi-"+menu_tag).show();
-    return false;
-  } else {
-    return true;
-  }
-};
-
-
-SEARCH = new Object();
-
-SEARCH.CloseTimer = null;
-
-SEARCH.Open = function()
-{
-  NAVI_CancelTimer();
-  NAVI_Close();
-  SEARCH_CancelTimer();
-  SEARCH_Close();
-  var pos = $("#searchlink-anchor").offset();
-  $("#search-dropdown").css( { "position": "absolute", "left": (pos.left - ($("#search-dropdown").width()) + 40) + "px", "top": (pos.top + 36) + "px" } );
-  $("#search-dropdown").show();
-  $("#searchlink-anchor").bind('mouseover',NAVI_CancelTimer);
-  $("#searchlink-anchor").bind('mouseout',NAVI_Timer);
-  $("#search-dropdown").bind('mouseover',NAVI_CancelTimer);
-  $("#search-dropdown").bind('mouseout',NAVI_Timer);
-  $("#search-input")[0].focus();
-};
-
-function SEARCH_Close()
-{
-  $(".navi-dropdown").hide();
-  $("#menu div").unbind('mouseover');
-  $(".dropdown").unbind('mouseover');
-  $(".dropdown").unbind('mouseout');
-
-  $("#search-dropdown").hide();
-  $("#searchlink-anchor").unbind('mouseover');
-  $("#searchlink-anchor").unbind('mouseout');
-  $("#search-dropdown").unbind('mouseover');
-  $("#search-dropdown").unbind('mouseout');
-}
-
-
-function SEARCH_CancelTimer()
-{
-  if (SEARCH.CloseTimer!=null)
-  {
-    window.clearTimeout(SEARCH.CloseTimer);
-    SEARCH.CloseTimer = null;
-  }
-}
-
-function SEARCH_Timer()
-{
-  if (SEARCH.CloseTimer==null)
-  {
-    SEARCH.CloseTimer = window.setTimeout(SEARCH_Close, 300);
-  }
-}
-
-menuImg1 = new Image(); menuImg1.src = 'http://s1.percona.com/ui-dropdown-header-l.png';
-menuImg2 = new Image(); menuImg2.src = 'http://s2.percona.com/ui-dropdown-header-r.png';
-menuImg3 = new Image(); menuImg3.src = 'http://s3.percona.com/ui-dropdown-header-search.png';
-menuImg4 = new Image(); menuImg4.src = 'http://s0.percona.com/ui-dropdown-bg.png';
-menuImg5 = new Image(); menuImg5.src = 'http://s1.percona.com/ui-dropdown-footer.png';
-
-
-});
-
-
-var Percona = {
-    ssl: false,
-    host: 'www.percona.com'
-};
-/**
- * @param string selector jQuery selector string
- */
-Percona.getRecentServerVersion = function(selector)
-{
-    if ('string' != typeof(selector))
-    {
-        alert('Percona.getRecentServerVersion: missed or wrong selector!');
-    }
-    /* Localize jQuery variable */
-    var jQuery;
-    /******** Load jQuery if not present *********/
-    if (window.jQuery === undefined || window.jQuery.fn.jquery !== '1.4.2')
-    {
-        var script_tag = document.createElement('script');
-        script_tag.setAttribute("type","text/javascript");
-        script_tag.setAttribute('src', 'http' + (Percona.ssl ? 's' : '') + ':/' + '/ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js');
-        script_tag.onload = scriptLoadHandler;
-        script_tag.onreadystatechange = function () /* Same thing but for IE */
-        {
-            if (this.readyState == 'complete' || this.readyState == 'loaded')
-            {
-                scriptLoadHandler();
-            }
-        };
-        /* Try to find the head, otherwise default to the documentElement */
-        (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
-    } else {
-        /* The jQuery version on the window is the one we want to use */
-        jQuery = window.jQuery;
-        main();
-    }
-    var scriptLoadHandler_counter = 0;
-    /******** Called once jQuery has loaded ******/
-    function scriptLoadHandler()
-    {
-        if (++scriptLoadHandler_counter > 1)
-        {
-            return;
-        }
-        /* Restore $ and window.jQuery to their previous values and store the
-           new jQuery in our local jQuery variable */
-        jQuery = window.jQuery.noConflict(true);
-        /* Call our main function */
-        main(jQuery);
-    }
-    /******** Our main function ********/
-    function main($)
-    {
-        var fillRecentServerVersion = function($)
-        {
-            if ($(selector).get(0))
-            {
-                $.get('http' + (Percona.ssl ? 's' : '') + ':/' + '/' + Percona.host + '/ajax/server-version/?callback=?', {}, function(json)
-                {
-                    if ('object' == typeof(json) && 'string' == typeof(json.recentServerVersion))
-                    {
-                        $(selector).text(' ' + json.recentServerVersion);
-                    }
-                }, 'jsonp');
-            }
-        };
-        $(document).ready(function()
-        {
-            fillRecentServerVersion(jQuery);
-        });
-    }
-};
-
-$(document).ready(function(){
-	$(window).bind("resize", resizeWindow);
-	resizeWindow();
-	function resizeWindow() {
-		var win_w = $(window).width();
-		var ribon = $("#support-ribbon");
-		if(win_w < 1265){
-			if(/mobile/i.test(navigator.userAgent)){
-				ribon.hide();
-			}else{
-				if(ribon.hasClass("vertical")){
-					ribon.removeClass("vertical");
-					ribon.addClass("horizontal");
-				}
-				ribon.css({"left":'50%', "margin-left": '-'+(ribon.width() / 2)+'px'});
-			}
-		}else{
-			if(ribon.hasClass("horizontal")){
-				ribon.addClass("vertical");
-				ribon.removeClass("horizontal");
-				ribon.removeAttr("style");
-			}
-
-		}
-	}
-});
\ No newline at end of file
diff --git a/config/sphinx-build/percona-theme/static/phone-small.png b/config/sphinx-build/percona-theme/static/phone-small.png
deleted file mode 100644
index e151f37..0000000
Binary files a/config/sphinx-build/percona-theme/static/phone-small.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/phone.png b/config/sphinx-build/percona-theme/static/phone.png
deleted file mode 100644
index 9b0d9f2..0000000
Binary files a/config/sphinx-build/percona-theme/static/phone.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/shield.png b/config/sphinx-build/percona-theme/static/shield.png
deleted file mode 100644
index 97fddbc..0000000
Binary files a/config/sphinx-build/percona-theme/static/shield.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/side_buttons.png b/config/sphinx-build/percona-theme/static/side_buttons.png
deleted file mode 100644
index 7b89a44..0000000
Binary files a/config/sphinx-build/percona-theme/static/side_buttons.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/sidebar.js b/config/sphinx-build/percona-theme/static/sidebar.js
deleted file mode 100644
index a45e192..0000000
--- a/config/sphinx-build/percona-theme/static/sidebar.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * sidebar.js
- * ~~~~~~~~~~
- *
- * This script makes the Sphinx sidebar collapsible.
- *
- * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
- * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
- * used to collapse and expand the sidebar.
- *
- * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
- * and the width of the sidebar and the margin-left of the document
- * are decreased. When the sidebar is expanded the opposite happens.
- * This script saves a per-browser/per-session cookie used to
- * remember the position of the sidebar among the pages.
- * Once the browser is closed the cookie is deleted and the position
- * reset to the default (expanded).
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-$(function() {
-  // global elements used by the functions.
-  // the 'sidebarbutton' element is defined as global after its
-  // creation, in the add_sidebar_button function
-  var bodywrapper = $('.bodywrapper');
-  var sidebar = $('.sphinxsidebar');
-  var sidebarwrapper = $('.sphinxsidebarwrapper');
-
-  // for some reason, the document has no sidebar; do not run into errors
-  if (!sidebar.length) return;
-
-  // original margin-left of the bodywrapper and width of the sidebar
-  // with the sidebar expanded
-  var bw_margin_expanded = bodywrapper.css('margin-left');
-  var ssb_width_expanded = sidebar.width();
-
-  // margin-left of the bodywrapper and width of the sidebar
-  // with the sidebar collapsed
-  var bw_margin_collapsed = '.8em';
-  var ssb_width_collapsed = '.8em';
-
-  // colors used by the current theme
-  var dark_color = $('.related').css('background-color');
-  var light_color = $('.document').css('background-color');
-
-  function sidebar_is_collapsed() {
-    return sidebarwrapper.is(':not(:visible)');
-  }
-
-  function toggle_sidebar() {
-    if (sidebar_is_collapsed())
-      expand_sidebar();
-    else
-      collapse_sidebar();
-  }
-
-  function collapse_sidebar() {
-    sidebarwrapper.hide();
-    sidebar.css('width', ssb_width_collapsed);
-    bodywrapper.css('margin-left', bw_margin_collapsed);
-    sidebarbutton.css({
-        'margin-left': '0',
-        'height': bodywrapper.height()
-    });
-    sidebarbutton.find('span').text('»');
-    sidebarbutton.attr('title', _('Expand sidebar'));
-    document.cookie = 'sidebar=collapsed';
-  }
-
-  function expand_sidebar() {
-    bodywrapper.css('margin-left', bw_margin_expanded);
-    sidebar.css('width', ssb_width_expanded);
-    sidebarwrapper.show();
-    sidebarbutton.css({
-        'margin-left': ssb_width_expanded-12,
-        'height': bodywrapper.height()
-    });
-    sidebarbutton.find('span').text('«');
-    sidebarbutton.attr('title', _('Collapse sidebar'));
-    document.cookie = 'sidebar=expanded';
-  }
-
-  function add_sidebar_button() {
-    sidebarwrapper.css({
-        'float': 'left',
-        'margin-right': '0',
-        'width': ssb_width_expanded - 28
-    });
-    // create the button
-    sidebar.append(
-        '<div id="sidebarbutton"><span>&laquo;</span></div>'
-    );
-    var sidebarbutton = $('#sidebarbutton');
-    light_color = sidebarbutton.css('background-color');
-    // find the height of the viewport to center the '<<' in the page
-    var viewport_height;
-    if (window.innerHeight)
- 	  viewport_height = window.innerHeight;
-    else
-	  viewport_height = $(window).height();
-    sidebarbutton.find('span').css({
-        'display': 'block',
-        'margin-top': (viewport_height - sidebar.position().top - 20) / 2
-    });
-
-    sidebarbutton.click(toggle_sidebar);
-    sidebarbutton.attr('title', _('Collapse sidebar'));
-    sidebarbutton.css({
-        'color': '#FFFFFF',
-        'border-left': '1px solid ' + dark_color,
-        'font-size': '1.2em',
-        'cursor': 'pointer',
-        'height': bodywrapper.height(),
-        'padding-top': '1px',
-        'margin-left': ssb_width_expanded - 12
-    });
-
-    sidebarbutton.hover(
-      function () {
-          $(this).css('background-color', dark_color);
-      },
-      function () {
-          $(this).css('background-color', light_color);
-      }
-    );
-  }
-
-  function set_position_from_cookie() {
-    if (!document.cookie)
-      return;
-    var items = document.cookie.split(';');
-    for(var k=0; k<items.length; k++) {
-      var key_val = items[k].split('=');
-      var key = key_val[0];
-      if (key == 'sidebar') {
-        var value = key_val[1];
-        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
-          collapse_sidebar();
-        else if ((value == 'expanded') && (sidebar_is_collapsed()))
-          expand_sidebar();
-      }
-    }
-  }
-
-  add_sidebar_button();
-  var sidebarbutton = $('#sidebarbutton');
-  set_position_from_cookie();
-});
diff --git a/config/sphinx-build/percona-theme/static/software-download.png b/config/sphinx-build/percona-theme/static/software-download.png
deleted file mode 100644
index db14087..0000000
Binary files a/config/sphinx-build/percona-theme/static/software-download.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/software-latest.png b/config/sphinx-build/percona-theme/static/software-latest.png
deleted file mode 100644
index b2d7cd1..0000000
Binary files a/config/sphinx-build/percona-theme/static/software-latest.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/support-small.png b/config/sphinx-build/percona-theme/static/support-small.png
deleted file mode 100644
index 6ee14f2..0000000
Binary files a/config/sphinx-build/percona-theme/static/support-small.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-dropdown-bg.png b/config/sphinx-build/percona-theme/static/ui-dropdown-bg.png
deleted file mode 100644
index fae4adc..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-dropdown-bg.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-dropdown-footer.png b/config/sphinx-build/percona-theme/static/ui-dropdown-footer.png
deleted file mode 100644
index 6b01306..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-dropdown-footer.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-dropdown-header-l.png b/config/sphinx-build/percona-theme/static/ui-dropdown-header-l.png
deleted file mode 100644
index d6ef833..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-dropdown-header-l.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-dropdown-header-r.png b/config/sphinx-build/percona-theme/static/ui-dropdown-header-r.png
deleted file mode 100644
index 108c855..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-dropdown-header-r.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-dropdown-header-search.png b/config/sphinx-build/percona-theme/static/ui-dropdown-header-search.png
deleted file mode 100644
index cf913fd..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-dropdown-header-search.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-footer-logo.png b/config/sphinx-build/percona-theme/static/ui-footer-logo.png
deleted file mode 100644
index 12c7d3c..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-footer-logo.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-leftnavi-sel.png b/config/sphinx-build/percona-theme/static/ui-leftnavi-sel.png
deleted file mode 100644
index bed5634..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-leftnavi-sel.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-logo.png b/config/sphinx-build/percona-theme/static/ui-logo.png
deleted file mode 100644
index 9ab750c..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-logo.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-navi-hover-l.png b/config/sphinx-build/percona-theme/static/ui-navi-hover-l.png
deleted file mode 100644
index bb0cac5..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-navi-hover-l.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-navi-hover-r.png b/config/sphinx-build/percona-theme/static/ui-navi-hover-r.png
deleted file mode 100644
index 2900615..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-navi-hover-r.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-navi-l.png b/config/sphinx-build/percona-theme/static/ui-navi-l.png
deleted file mode 100644
index b1b16d3..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-navi-l.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-navi-r.png b/config/sphinx-build/percona-theme/static/ui-navi-r.png
deleted file mode 100644
index 765d341..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-navi-r.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-navi-sel-l.png b/config/sphinx-build/percona-theme/static/ui-navi-sel-l.png
deleted file mode 100644
index 34023c2..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-navi-sel-l.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-navi-sel-r.png b/config/sphinx-build/percona-theme/static/ui-navi-sel-r.png
deleted file mode 100644
index b431fed..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-navi-sel-r.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-orange-content.png b/config/sphinx-build/percona-theme/static/ui-orange-content.png
deleted file mode 100644
index 0fdc46f..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-orange-content.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-orange-front.png b/config/sphinx-build/percona-theme/static/ui-orange-front.png
deleted file mode 100644
index cfa2a62..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-orange-front.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-search.png b/config/sphinx-build/percona-theme/static/ui-search.png
deleted file mode 100644
index 18afa3b..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-search.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/ui-tab-bg.png b/config/sphinx-build/percona-theme/static/ui-tab-bg.png
deleted file mode 100644
index 115b160..0000000
Binary files a/config/sphinx-build/percona-theme/static/ui-tab-bg.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/static/warning.png b/config/sphinx-build/percona-theme/static/warning.png
deleted file mode 100644
index e78f347..0000000
Binary files a/config/sphinx-build/percona-theme/static/warning.png and /dev/null differ
diff --git a/config/sphinx-build/percona-theme/theme.conf b/config/sphinx-build/percona-theme/theme.conf
deleted file mode 100644
index e79ecbf..0000000
--- a/config/sphinx-build/percona-theme/theme.conf
+++ /dev/null
@@ -1,32 +0,0 @@
-[theme]
-inherit = default
-stylesheet = default.css
-pygments_style = sphinx
-
-[options]
-rightsidebar = false
-stickysidebar = false
-collapsiblesidebar = false
-externalrefs = false
-
-footerbgcolor    = #11303d
-footertextcolor  = #ffffff
-sidebarbgcolor   = #1c4e63
-sidebarbtncolor  = #3c6e83
-sidebartextcolor = #ffffff
-sidebarlinkcolor = #98dbcc
-relbarbgcolor    = #133f52
-relbartextcolor  = #ffffff
-relbarlinkcolor  = #ffffff
-bgcolor          = #ffffff
-textcolor        = #000000
-headbgcolor      = #f2f2f2
-headtextcolor    = #20435c
-headlinkcolor    = #c60f0f
-linkcolor        = #355f7c
-visitedlinkcolor = #355f7c
-codebgcolor      = #eeffcc
-codetextcolor    = #333333
-
-bodyfont = sans-serif
-headfont = 'Arial', 'Helvetica' sans-serif
diff --git a/debian/changelog b/debian/changelog
index 7ba16b3..352a77f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+percona-toolkit (3.3.1-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Wed, 16 Mar 2022 04:08:43 -0000
+
 percona-toolkit (3.2.1-1) unstable; urgency=medium
 
   * New upstream release (3.2.1) 
diff --git a/debian/patches/01-fix-spelling-errors.diff b/debian/patches/01-fix-spelling-errors.diff
index 1052cbe..05c437a 100644
--- a/debian/patches/01-fix-spelling-errors.diff
+++ b/debian/patches/01-fix-spelling-errors.diff
@@ -9,7 +9,7 @@ Index: percona-toolkit/bin/pt-kill
 ===================================================================
 --- percona-toolkit.orig/bin/pt-kill
 +++ percona-toolkit/bin/pt-kill
-@@ -7835,7 +7835,7 @@ type: DSN
+@@ -7836,7 +7836,7 @@ type: DSN
  Store each query killed in this DSN.
  
  The argument specifies a table to store all killed queries.  The DSN
@@ -22,7 +22,7 @@ Index: percona-toolkit/bin/pt-online-schema-change
 ===================================================================
 --- percona-toolkit.orig/bin/pt-online-schema-change
 +++ percona-toolkit/bin/pt-online-schema-change
-@@ -12000,7 +12000,7 @@ C<wsrep_OSU_method> is not C<TOI>.  Ther
+@@ -12079,7 +12079,7 @@ C<wsrep_OSU_method> is not C<TOI>.  Ther
  =head1 MySQL 5.7 + Generated columns
  
  The tools ignores MySQL 5.7+ C<GENERATED> columns since the value for those columns
@@ -31,7 +31,7 @@ Index: percona-toolkit/bin/pt-online-schema-change
  
  =head1 OUTPUT
  
-@@ -12816,7 +12816,7 @@ type: DSN; repeatable: yes
+@@ -12906,7 +12906,7 @@ type: DSN; repeatable: yes
  
  DSN to skip when checking slave lag. It can be used multiple times.
  Example: --skip-check-slave-lag h=127.0.0.1,P=12345 --skip-check-slave-lag h=127.0.0.1,P=12346
@@ -44,7 +44,7 @@ Index: percona-toolkit/bin/pt-query-digest
 ===================================================================
 --- percona-toolkit.orig/bin/pt-query-digest
 +++ percona-toolkit/bin/pt-query-digest
-@@ -16100,7 +16100,7 @@ Port number to use for connection.
+@@ -16101,7 +16101,7 @@ Port number to use for connection.
  =item --preserve-embedded-numbers
  
  Preserve numbers in database/table names when fingerprinting queries.
@@ -70,7 +70,7 @@ Index: percona-toolkit/bin/pt-table-checksum
 ===================================================================
 --- percona-toolkit.orig/bin/pt-table-checksum
 +++ percona-toolkit/bin/pt-table-checksum
-@@ -11487,7 +11487,7 @@ sub main {
+@@ -11488,7 +11488,7 @@ sub main {
     TABLE:
     while ( $oktorun && $have_time->() && (my $tbl = $schema_iter->next()) ) {
        eval {
@@ -79,7 +79,7 @@ Index: percona-toolkit/bin/pt-table-checksum
           # be saved here.  print_checksum_results() uses this info.
           $tbl->{checksum_results} = {};
  
-@@ -12919,7 +12919,7 @@ of the tool; they're only reminders to h
+@@ -12920,7 +12920,7 @@ of the tool; they're only reminders to h
  
  =item RocksDB support
  
@@ -88,7 +88,7 @@ Index: percona-toolkit/bin/pt-table-checksum
  or they way RocksDB handles Gap locks, pt-table-cheksum will skip tables using RocksDB engine.
  More Information: (L<https://www.percona.com/doc/percona-server/LATEST/myrocks/limitations.html>)
  
-@@ -13100,7 +13100,7 @@ type: string
+@@ -13101,7 +13101,7 @@ type: string
  Channel name used when connected to a server using replication channels.
  Suppose you have two masters, master_a at port 12345, master_b at port 1236 and
  a slave connected to both masters using channels chan_master_a and chan_master_b.
@@ -97,7 +97,7 @@ Index: percona-toolkit/bin/pt-table-checksum
  won't be able to determine what's the correct master since SHOW SLAVE STATUS
  will return 2 rows. In this case, you can use --channel=chan_master_a to specify
  the channel name to use in the SHOW SLAVE STATUS command.
-@@ -13118,7 +13118,7 @@ See "Replicas using row-based replicatio
+@@ -13119,7 +13119,7 @@ See "Replicas using row-based replicatio
  This option modifies the behavior of L<"--create-replicate-table"> such that the
  replicate table's upper and lower boundary columns are created with the BLOB
  data type.
@@ -110,7 +110,7 @@ Index: percona-toolkit/bin/pt-table-sync
 ===================================================================
 --- percona-toolkit.orig/bin/pt-table-sync
 +++ percona-toolkit/bin/pt-table-sync
-@@ -12186,7 +12186,7 @@ type: string
+@@ -12187,7 +12187,7 @@ type: string
  Channel name used when connected to a server using replication channels.
  Suppose you have two masters, master_a at port 12345, master_b at port 1236 and
  a slave connected to both masters using channels chan_master_a and chan_master_b.
diff --git a/docs/percona-toolkit.pod b/docs/percona-toolkit.pod
index 1069d26..85a98ee 100644
--- a/docs/percona-toolkit.pod
+++ b/docs/percona-toolkit.pod
@@ -567,6 +567,6 @@ Place, Suite 330, Boston, MA  02111-1307  USA.
 
 =head1 VERSION
 
-Percona Toolkit v3.2.1 released 2020-08-12
+Percona Toolkit v3.3.1 released 2021-04-22
 
 =cut
diff --git a/docs/pt-k8s-debug-collector.rst b/docs/pt-k8s-debug-collector.rst
new file mode 100644
index 0000000..4cec97f
--- /dev/null
+++ b/docs/pt-k8s-debug-collector.rst
@@ -0,0 +1,59 @@
+.. _pt-k8s-debug-collector:
+
+==================================
+:program:`pt-k8s-debug-collector`
+==================================
+
+Collects debug data (logs, resource statuses etc.) from a k8s/OpenShift cluster. Data is packed into the ``cluster-dump.tar.gz`` archive in the current working directory. 
+
+Data that will be collected
+===========================
+
+.. code-block:: bash
+
+   "pods",
+   "replicasets",
+   "deployments",
+   "statefulsets",
+   "replicationcontrollers",
+   "events",
+   "configmaps",
+   "secrets",
+   "cronjobs",
+   "jobs",
+   "podsecuritypolicies",
+   "poddisruptionbudgets",
+   "perconaxtradbbackups",
+   "perconaxtradbclusterbackups",
+   "perconaxtradbclusterrestores",
+   "perconaxtradbclusters",
+   "clusterrolebindings",
+   "clusterroles",
+   "rolebindings",
+   "roles",
+   "storageclasses",
+   "persistentvolumeclaims",
+   "persistentvolumes",
+   "modes",
+   "your-custom-resource" (depends on 'resource' flag)
+
+
+Usage
+=====
+
+``pt-k8s-debug-collector <flags>``
+
+Flags:
+
+``--resource` targeted custom resource name (default "pxc")``
+
+``--namespace` targeted namespace. By default data will be collected from all namespaces``
+
+``--cluster` targeted pxc/psmdb cluster. By default data from all available clusters to be collected``
+
+Requirements
+============
+
+- Installed and configured ``kubectl``
+- Installed and configured ``pt-mysql-summary``
+- Installed and configured ``pt-mongodb-summary`` 
diff --git a/docs/pt-pg-summary.rst b/docs/pt-pg-summary.rst
index bff3313..8142913 100644
--- a/docs/pt-pg-summary.rst
+++ b/docs/pt-pg-summary.rst
@@ -25,7 +25,7 @@ Parameters
 +--------+---------------------------------+---------+----------------------------------------------------------------------------+
 |        | ``--databases=DATABASES``       |         | Summarize this comma-separated list of databases. All if not specified.    |
 +--------+---------------------------------+---------+----------------------------------------------------------------------------+
-| ``-h`` | ``--host=HOST``                 |         | Host to connect to.                                                        |
+| ``-h`` | ``--host=HOST``                 |         | Host to connect to or local Unix socket for connection                     |
 +--------+---------------------------------+---------+----------------------------------------------------------------------------+
 | ``-W`` | ``--password=PASSWORD``         |         | Password to use when connecting.                                           |
 +--------+---------------------------------+---------+----------------------------------------------------------------------------+
diff --git a/docs/release_notes.rst b/docs/release_notes.rst
index fbb8797..76cf782 100644
--- a/docs/release_notes.rst
+++ b/docs/release_notes.rst
@@ -1,6 +1,55 @@
 Percona Toolkit
 ***************
 
+v3.3.0 released 2021-01-14
+==========================
+
+New Features
+------------
+
+* :jirabug:`PT-1905`: pt-osc: Option to reverse triggers after table swap
+* :jirabug:`PT-1865`: New tool: pt-k8s-debug-collector provides information for support teams
+
+Improvements
+------------
+
+* :jirabug:`PT-1907`: pt-pg-summary: Support socket connections
+
+Bugs Fixed
+----------
+
+* :jirabug:`PT-1891`: pt-mongodb-summary fails for SSL enabled mongodb instances
+* :jirabug:`PT-169`: pt-online-schema-change remove the old and new table
+* :jirabug:`PT-1898`: pt-archiver keeps transaction open while waiting for replica to catch up
+* :jirabug:`PT-1857`: pt-heartbeat doesn't reconnect after killing connection
+* :jirabug:`PT-1528`: pt-online-schema-change "Invalid utf8mb4 character string: 'A111E8'"
+* :jirabug:`PT-1908`: pt_query_digest: Profile file 'Query ID' field truncated (Thanks to Andrew G for reporting this issue)
+* :jirabug:`PT-1881`: pt-upgrade fails when query including format strings and SQL errors is given (Thanks to Nayuta Yanagisawa for reporting this issue)
+* :jirabug:`PT-1892`: pt-summary reports sshd not running
+
+
+
+
+v3.2.1 released 2020-08-13
+==========================
+
+Improvements:
+
+* :jirabug:`PT-1836`: Review and consider lintian reported issues (Thanks to user midget for reporting this issue)
+
+Bugs Fixed:
+
+* :jirabug:`PT-1853`: Added --no-check-foreign-keys to pt-osc
+* :jirabug:`PT-1869`: pt-osc dynamically update slave list on check slaves (Thanks to user mateus.dubiela for reporting this issue)
+* :jirabug:`PT-1829`: pt-heartbeat doesn't reconnect for check-read-only
+* :jirabug:`PT-1822`: pt-mongodb-summary fails on standalone mongodb instances
+* :jirabug:`PT-1851`: Backslashes missing from documentation (Thanks to user billkarwin for reporting this issue)
+* :jirabug:`PT-1518`: pt-table-checksum gives error CRC32 never needs BIT_XOR optimization (Thanks to user soumya_s_das (AT homedepot DOT com) for reporting this issue)
+* :jirabug:`PT-1859`: pt-pg-summary fails for Postgres12
+
+
+
+
 v3.2.0 released 2020-04-23
 ==========================
 
@@ -59,7 +108,7 @@ Bugs Fixed:
 
 
 
-  
+
 v3.0.13 released 2019-01-03
 ===========================
 
@@ -445,7 +494,7 @@ New Features
 
 * 1642994: Following schemas/tables have been added to the default ignore list: ``mysql.gtid_execution``, ``sys.sys_config``, ``mysql.proc``, ``mysql.inventory``, ``mysql.plugin``, ``percona.*`` (including checksums, dsns table), ``test.*``, and ``percona_schema.*``.
 
-* 1643940: ``pt-summary`` now provides information about Transparent huge pages. 
+* 1643940: ``pt-summary`` now provides information about Transparent huge pages.
 
 * 1604834: New ``--preserve-embedded-numbers`` option has been implemented for ``pt-query-digest`` which can be used to preserve numbers in database/table names when fingerprinting queries.
 
@@ -454,7 +503,7 @@ Bug Fixes
 * 1613915: ``pt-online-schema-change`` could miss the data due to the way ENUM values are sorted.
 
 * 1625005: ``pt-online-schema-change`` didn't apply underscores to foreign keys individually.
-  
+
 * 1566556: ``pt-show-grants`` didn't work correctly with *MariaDB* 10 (*Daniël van Eeden*).
 
 * 1634900: ``pt-upgrade`` would fail when log contained ``SELECT...INTO`` queries.
@@ -469,19 +518,19 @@ Changelog
 ---------
 
 * Fixed bug 1362942: pt-slave-restart fails on MariaDB 10.0.13 (gtid_mode confusion)
-* Fixed bug 1566556: pt-show-grants fails against MariaDB10+    
+* Fixed bug 1566556: pt-show-grants fails against MariaDB10+
 * Feature    1604834: pt-query-digest numbers in table or column names converted to question marks (--preserve-embedded-numbers)
-* Fixed bug 1613915: pt-online-schema-change misses data.  Fixed sort order for ENUM fields 
+* Fixed bug 1613915: pt-online-schema-change misses data.  Fixed sort order for ENUM fields
 * Fixed bug 1625005: pt-online-schema-change doesn't apply underscores to foreign keys individually
-* Fixed bug 1634900: pt-upgrade fails with SELECT INTO 
-* Fixed bug 1635734: pt-slave-restart --config does not recognize = as separator 
+* Fixed bug 1634900: pt-upgrade fails with SELECT INTO
+* Fixed bug 1635734: pt-slave-restart --config does not recognize = as separator
 * Feature   1636068: Added pause to NibbleIterator
 * Feature   1638293: --data-dir parameter in order to create the table on a different partition
-* Feature   1639052: with pt-table-checksum automatically exclude checking schemas named percona, percona_schema     
+* Feature   1639052: with pt-table-checksum automatically exclude checking schemas named percona, percona_schema
 * Feature   1642364: pt-online-schema-change Added --remove-data-dir feature
 * Feature   1643914: Fixed several typos in the doc (Thanks Dario Minnucci)
 * Feature   1643940: Add Transparent huge pages info to pt-summary
-* Feature   1643941: Add Memory management library to pt-mysql-summary 
+* Feature   1643941: Add Memory management library to pt-mysql-summary
 
 v2.2.19 released 2016-08-16
 ===========================
@@ -548,7 +597,7 @@ New features:
 * 1553340: Added "Shared" memory info to ``pt-summary``
 
 * PT-24: Added the ``--no-vertical-format`` option for ``pt-query-digest``, allowing compatibility with non-standard MySQL clients that don't support the ``\G`` directive at the end of a statement
-  
+
 Bug fixes:
 
 * 1402776: Fixed error when parsing ``tcpdump`` capture with ``pt-query-digest``
@@ -674,7 +723,7 @@ v2.2.15 released 2015-08-28
   This feature was requested in the following bugs: 1413101 and 1413137.
 
 * Added the ``--sleep`` option for ``pt-online-schema-change`` to avoid performance problems. The option accepts float values in seconds.
-  
+
   This feature was requested in the following bug: 1413140.
 
 * Implemented ability to specify ``--check-slave-lag`` multiple times. The following example enables lag checks for two slaves:
@@ -686,69 +735,69 @@ v2.2.15 released 2015-08-28
   This feature was requested in the following bug: 14452911.
 
 * Added the ``--rds`` option to ``pt-kill``, which makes the tool use Amazon RDS procedure calls instead of the standard MySQL ``kill`` command.
-  
+
   This feature was requested in the following bug: 1470127.
 
 **Bugs Fixed**
 
 * 1042727: ``pt-table-checksum`` doesn't reconnect the slave $dbh
-  
+
   Before, the tool would die if any slave connection was lost. Now the tool waits forever for slaves.
 
 * 1056507: ``pt-archiver --check-slave-lag`` agressiveness
-  
+
   The tool now checks replication lag every 100 rows instead of every row, which significantly improves efficiency.
 
 * 1215587: Adding underscores to constraints when using ``pt-online-schema-change`` can create issues with constraint name length
-  
+
   Before, multiple schema changes lead to underscores stacking up on the name of the constraint until it reached the 64 character limit. Now there is a limit of two underscores in the prefix, then the tool alternately removes or adds one underscore, attempting to make the name unique.
 
 * 1277049: ``pt-online-schema-change`` can't connect with comma in password
-  
+
   For all tools, documented that commas in passwords provided on the command line must be escaped.
 
 * 1441928: Unlimited chunk size when using ``pt-online-schema-change`` with ``--chunk-size-limit=0`` inhibits checksumming of single-nibble tables
-  
+
   When comparing table size with the slave table, the tool now ignores ``--chunk-size-limit`` if it is set to zero to avoid multiplying by zero.
 
 * 1443763: Update documentation and/or implentation of ``pt-archiver --check-interval``
-  
+
   Fixed the documentation for ``--check-interval`` to reflect its correct behavior.
 
 * 1449226: ``pt-archiver`` dies with "MySQL server has gone away" when ``--innodb_kill_idle_transaction`` is set to a low value and ``--check-slave-lag`` is enabled
-  
-  The tool now sends a dummy SQL query to avoid timing out. 
+
+  The tool now sends a dummy SQL query to avoid timing out.
 
 * 1446928: ``pt-online-schema-change`` not reporting meaningful errors
-  
+
   The tool now produces meaningful errors based on text from MySQL errors.
 
 * 1450499: ReadKeyMini causes ``pt-online-schema-change`` session to lock under some circumstances
-  
+
   Removed ReadKeyMini, because it is no longer necessary.
 
 * 1452914: ``--purge`` and ``--no-delete`` are mutually exclusive, but still allowed to be specified together by ``pt-archiver``
-  
+
   The tool now issues an error when ``--purge`` and ``--no-delete`` are specified together
 
 * 1455486: ``pt-mysql-summary`` is missing the ``--ask-pass`` option
-  
+
   Added the ``--ask-pass`` option to the tool
 
 * 1457573: ``pt-sift`` fails to download ``pt-diskstats`` ``pt-pmp`` ``pt-mext`` ``pt-align``
-  
+
   Added the ``-L`` option to ``curl`` and changed download address to use HTTPS.
 
 * 1462904: ``pt-duplicate-key-checker`` doesn't support triple quote in column name
-  
+
   Updated TableParser module to handle literal backticks.
 
 * 1488600: ``pt-stalk`` doesn't check TokuDB status
-  
+
   Implemented status collection similar to how it is performed for InnoDB.
 
 * 1488611: various testing bugs related to newer perl versions
-  
+
   Fixed test failures related to new Perl versions.
 
 v2.2.14 released 2015-04-14
@@ -758,7 +807,7 @@ Percona Toolkit 2.2.14 has been released. This release contains two new features
 
 New Features:
 
-* pt-slave-find can now resolve the IP address and show the slave's hostname. This can be done with the new ``--resolve-address`` option.  
+* pt-slave-find can now resolve the IP address and show the slave's hostname. This can be done with the new ``--resolve-address`` option.
 
 * pt-table-sync can now ignore the tables whose names match specific Perl regex with the ``--ignore-tables-regex`` option.
 
@@ -778,7 +827,7 @@ Bugs Fixed:
 
 * Fixed bug 1417558: pt-stalk when used along with ``--collect-strace`` didn't write the strace output to the expected destination file.
 
-* Fixed bug 1421025: Missing dependency for ``perl-TermReadKey`` RPM package was causing toolkit commands to fail when they were run with ``--ask-pass`` option. 
+* Fixed bug 1421025: Missing dependency for ``perl-TermReadKey`` RPM package was causing toolkit commands to fail when they were run with ``--ask-pass`` option.
 
 * Fixed bug 1421781: pt-upgrade would fail when log contained ``SELECT...INTO`` queries. Fixed by ignoring/skipping those queries.
 
@@ -815,11 +864,11 @@ Percona Toolkit 2.2.13 has been released. This release contains one new feature
 
 New Features:
 
-* pt-kill now supports new ``--query-id`` option. This option can be used to print a query fingerprint hash after killing a query to enable the cross-referencing with the pt-query-digest output. This option can be used along with ``--print`` option as well.  
+* pt-kill now supports new ``--query-id`` option. This option can be used to print a query fingerprint hash after killing a query to enable the cross-referencing with the pt-query-digest output. This option can be used along with ``--print`` option as well.
 
 Bugs Fixed:
 
-* Fixed bug 1019479: pt-table-checksum now works with ``ONLY_FULL_GROUP_BY`` sql_mode. 
+* Fixed bug 1019479: pt-table-checksum now works with ``ONLY_FULL_GROUP_BY`` sql_mode.
 
 * Fixed bug 1394934: running pt-table-checksum in debug mode would cause an error.
 
@@ -829,9 +878,9 @@ Bugs Fixed:
 
 * Fixed bug 1408375: Percona Toolkit was vulnerable to MITM attack which could allow exfiltration of MySQL configuration information via ``--version-check`` option. This vulnerability was logged as `CVE 2015-1027 <http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=2015-1027>_`
 
-* Fixed bug 1321297: pt-table-checksum was reporting differences on timestamp columns with replication from 5.5 to 5.6 server version, although the data was identical. 
+* Fixed bug 1321297: pt-table-checksum was reporting differences on timestamp columns with replication from 5.5 to 5.6 server version, although the data was identical.
 
-* Fixed bug 1388870: pt-table-checksum was showing differences if the master and slave were in different time zone.  
+* Fixed bug 1388870: pt-table-checksum was showing differences if the master and slave were in different time zone.
 
 * Fixed bug 1402668: pt-mysql-summary would exit if Percona XtraDB Cluster was in ``Donor/Desynced`` state.
 
@@ -840,19 +889,19 @@ Bugs Fixed:
 Changelog
 ---------
 
-* Feature   1391240:  pt-kill added query fingerprint hash to output 
-* Fixed bug 1402668:  pt-mysql-summary fails on cluster in Donor/Desynced status 
-* Fixed bug 1396870:  pt-online-schema-change CTRL+C leaves terminal in inconsistent state 
+* Feature   1391240:  pt-kill added query fingerprint hash to output
+* Fixed bug 1402668:  pt-mysql-summary fails on cluster in Donor/Desynced status
+* Fixed bug 1396870:  pt-online-schema-change CTRL+C leaves terminal in inconsistent state
 * Fixed bug 1396868:	pt-online-schema-change --ask-pass option error
-* Fixed bug 1266869:  pt-stalk fails to start if $HOME environment variable is not set 
+* Fixed bug 1266869:  pt-stalk fails to start if $HOME environment variable is not set
 * Fixed bug 1019479:	pt-table-checksum does not work with sql_mode ONLY_FULL_GROUP_BY
 * Fixed bug 1394934:  pt-table-checksum error in debug mode
-* Fixed bug 1321297:  pt-table-checksum reports diffs on timestamp columns in 5.5 vs 5.6 
+* Fixed bug 1321297:  pt-table-checksum reports diffs on timestamp columns in 5.5 vs 5.6
 * Fixed bug 1399789:	pt-table-checksum fails to find pxc nodes when wsrep_node_incoming_address is set to AUTO
 * Fixed bug 1388870:  pt-table-checksum has some errors with different time zones
 * Fixed bug 1408375:  vulnerable to MITM attack which would allow exfiltration of MySQL configuration information via --version-check
-* Fixed bug 1404298:  missing MySQL5.7 test files for pt-table-checksum 
-* Fixed bug 1403900:  added sandbox and fixed sakila test db for 5.7 
+* Fixed bug 1404298:  missing MySQL5.7 test files for pt-table-checksum
+* Fixed bug 1403900:  added sandbox and fixed sakila test db for 5.7
 
 v2.2.12 released 2014-11-14
 ===========================
@@ -861,7 +910,7 @@ Percona Toolkit 2.2.12 has been released. This release contains one new feature
 
 New Features:
 
-* pt-stalk now gathers ``dmesg`` output from up to 60 seconds before the triggering event. 
+* pt-stalk now gathers ``dmesg`` output from up to 60 seconds before the triggering event.
 
 Bugs Fixed:
 
@@ -873,7 +922,7 @@ Bugs Fixed:
 
 * Fixed bug 1328686: Running pt-hearbeat with --check-read-only option would cause an error when running on server with ``read_only`` option. Tool now waits for server ``read_only`` status to be disabled before starting to run.
 
-* Fixed bug 1373937: pt-table-checksum now supports ``none`` as valid ``--recursion-method`` when using with Percona XtraDB Cluster. 
+* Fixed bug 1373937: pt-table-checksum now supports ``none`` as valid ``--recursion-method`` when using with Percona XtraDB Cluster.
 
 * Fixed bug 1377888: Documentation was stating that pt-query-digest is able to parse a raw binary log file, while it can only parse a file which was decoded with ``mysqlbinlog`` tool before. Fixed by improving the documentation and adding a check for binary file and providing a relevant error message.
 
@@ -886,7 +935,7 @@ Changelog
 * Fixed bug 1217466:	pt-table-checksum refuses to run on PXC if server_id is the same on all nodes
 * Fixed bug 1373937:	pt-table-checksum requires recursion when working with and XtraDB Cluster node
 * Fixed bug 1377888:	pt-query-digest manual for --type binlog is ambiguous
-* Fixed bug 1349086:	pt-stalk should also gather dmesg output 
+* Fixed bug 1349086:	pt-stalk should also gather dmesg output
 * Fixed bug 1361293:	Some scripts fail when no-version-check option is put in global config file
 
 v2.2.11 released 2014-09-26
@@ -939,12 +988,12 @@ Bugs Fixed:
 Changelog
 ---------
 
-* Fixed bug 1287253: pt-table-checksum deadlock 
+* Fixed bug 1287253: pt-table-checksum deadlock
 * Fixed bug 1299387: 5.6 slow query log Thead_id becomes Id
 * Fixed bug 1311654: pt-table-checksum + PXC inconsistent results upon --resume
 * Fixed bug 1340728: pt-online-schema-change doesn't work with HASH indexes
 * Fixed bug 1253872: pt-table-checksum max load 20% rounds down
-* Fixed bug 1340364: some shell tools output error when queried for --version 
+* Fixed bug 1340364: some shell tools output error when queried for --version
 
 v2.2.9 released 2014-07-08
 ==========================
@@ -967,10 +1016,10 @@ Changelog
 ---------
 
 * Fixed bug 1258135: pt-deadlock-logger introduces a noise to MySQL
-* Fixed bug 1329422: pt-online-schema-change foreign-keys-method=none breaks constraints 
-* Fixed bug 1315130: pt-online-schema-change not properly detecting foreign keys 
+* Fixed bug 1329422: pt-online-schema-change foreign-keys-method=none breaks constraints
+* Fixed bug 1315130: pt-online-schema-change not properly detecting foreign keys
 * Fixed bug 1335960: pt-query-digest cannot parse binlogs from 5.6
-* Fixed bug 1335322: pt-stalk fails when variable or threshold is non-integer 
+* Fixed bug 1335322: pt-stalk fails when variable or threshold is non-integer
 
 v2.2.8 released 2014-06-04
 ==========================
@@ -992,7 +1041,7 @@ Bugs Fixed:
 
 * Fixed bug 1286250: pt-online-schema-change was requesting password twice.
 
-* Fixed bug 1295667: pt-deadlock-logger was logging incorrect timestamp because tool wasn't aware of the time-zones. 
+* Fixed bug 1295667: pt-deadlock-logger was logging incorrect timestamp because tool wasn't aware of the time-zones.
 
 * Fixed bug 1304062: when multiple tables were specified with pt-table-checksum --ignore-tables, only one of them would be ignored.
 
@@ -1016,7 +1065,7 @@ Changelog
 v2.2.7 released 2014-02-20
 ==========================
 
-Percona Toolkit 2.2.7 has been released. This release has only one bug fix. 
+Percona Toolkit 2.2.7 has been released. This release has only one bug fix.
 
 * Fixed bug 1279502: --version-check behaves like spyware
 
@@ -1130,9 +1179,9 @@ Changelog
 v2.2.4 released 2013-07-18
 ==========================
 
-Percona Toolkit 2.2.4 has been released. This release two new features and a number of bugfixes. 
+Percona Toolkit 2.2.4 has been released. This release two new features and a number of bugfixes.
 
-pt-query-digest --output json includes query examples as of v2.2.3. Some people might not want this because it exposes real data. New option, --output json-anon, has been implemented. This option will provide the same data without query examples. It's "anonymous" in the sense that there's no identifying data; nothing more than schema and table structs can be inferred from fingerprints. 
+pt-query-digest --output json includes query examples as of v2.2.3. Some people might not want this because it exposes real data. New option, --output json-anon, has been implemented. This option will provide the same data without query examples. It's "anonymous" in the sense that there's no identifying data; nothing more than schema and table structs can be inferred from fingerprints.
 
 When using drop swap with pt-online-schema-change there is some production impact. This impact can be measured because tool outputs the current timestamp on lines for operations that may take awhile.
 
@@ -1140,7 +1189,7 @@ When using drop swap with pt-online-schema-change there is some production impac
   pt-table-checksum would fail if variable explicit_defaults_for_timestamp was enabled in MySQL 5.6.
 
 * Fixed bug #1182856: Zero values causes "Invalid --set-vars value: var=0"
-  Trying to assign 0 to any variable by using --set-vars option would cause “Invalid --set-vars value” message. 
+  Trying to assign 0 to any variable by using --set-vars option would cause “Invalid --set-vars value” message.
 
 * Fixed bug #1188264: pt-online-schema-change error copying rows: Undefined subroutine &pt_online_schema_change::get
 
@@ -1844,7 +1893,7 @@ Changelog
 * Fixed bug 954990: pt-stalk --nostalk does not work
 * Fixed bug 977226: pt-summary doesn't detect LSI RAID control
 * Fixed bug 1030031: pt-table-checksum reports wrong number of DIFFS
-* Fixed bug 916168: pt-table-checksum privilege check fails on MySQL 5.5 
+* Fixed bug 916168: pt-table-checksum privilege check fails on MySQL 5.5
 * Fixed bug 950294: pt-table-checksum should always create schema and tables with IF NOT EXISTS
 * Fixed bug 953141: pt-table-checksum ignores its default and explicit --recursion-method
 * Fixed bug 1030975: pt-table-sync crashes if sql_mode includes ANSI_QUOTES
@@ -2204,7 +2253,7 @@ Changelog
 * Fixed bug 1402776: Improved fix (protocol parser fix): error when parsing tcpdump capture with pt-query-digest
 * Fixed bug 1632522: pt-osc: Fails with duplicate key in table for self-referencing (Thanks Amiel Marqeta)
 * Fixed bug 1654668: pt-summary exists with an error (Thanks Marcelo Altmann)
-* New tool         : pt-mongodb-summary 
+* New tool         : pt-mongodb-summary
 * New tool         : pt-mongodb-query-digest
 
 Percona Toolkit 3.0.0 RC includes the following changes:
diff --git a/docs/rn.3-2-1.txt b/docs/rn.3-2-1.txt
new file mode 100644
index 0000000..1952257
--- /dev/null
+++ b/docs/rn.3-2-1.txt
@@ -0,0 +1,28 @@
+.. _PT-3.2.1:
+
+================================================================================
+*Percona Toolkit* 3.2.1
+================================================================================
+
+:Date: August 13, 2020
+:Installation: `Installing Percona Toolkit <https://www.percona.com/doc/percona-toolkit/LATEST/installation.html>`_
+
+Improvements
+================================================================================
+
+* :jirabug:`PT-1836`: Review and consider lintian reported issues (Thanks to user midget for reporting this issue)
+
+
+
+Bugs Fixed
+================================================================================
+
+* :jirabug:`PT-1853`: Added --no-check-foreign-keys to pt-osc
+* :jirabug:`PT-1869`: pt-osc dynamically update slave list on check slaves (Thanks to user mateus.dubiela for reporting this issue)
+* :jirabug:`PT-1829`: pt-heartbeat doesn't reconnect for check-read-only
+* :jirabug:`PT-1822`: pt-mongodb-summary fails on standalone mongodb instances
+* :jirabug:`PT-1851`: Backslashes missing from documentation (Thanks to user billkarwin for reporting this issue)
+* :jirabug:`PT-1518`: pt-table-checksum gives error CRC32 never needs BIT_XOR optimization (Thanks to user soumya_s_das@homedepot.com for reporting this issue)
+* :jirabug:`PT-1859`: pt-pg-summary fails for Postgres12
+
+
diff --git a/docs/rn.3-3-0.txt b/docs/rn.3-3-0.txt
new file mode 100644
index 0000000..0e6d0aa
--- /dev/null
+++ b/docs/rn.3-3-0.txt
@@ -0,0 +1,37 @@
+.. _PT-3.3.0:
+
+================================================================================
+*Percona Toolkit* 3.3.0
+================================================================================
+
+:Date: January 14, 2021
+:Installation: `Installing Percona Toolkit <https://www.percona.com/doc/percona-toolkit/LATEST/installation.html>`_
+
+New Features
+================================================================================
+
+* :jirabug:`PT-1905`: pt-osc: Option to reverse triggers after table swap
+* :jirabug:`PT-1865`: New tool: pt-k8s-debug-collector provides information for support teams
+
+
+
+Improvements
+================================================================================
+
+* :jirabug:`PT-1907`: pt-pg-summary: Support socket connections
+
+
+
+Bugs Fixed
+================================================================================
+
+* :jirabug:`PT-1891`: pt-mongodb-summary fails for SSL enabled mongodb instances
+* :jirabug:`PT-169`: pt-online-schema-change remove the old and new table
+* :jirabug:`PT-1898`: pt-archiver keeps transaction open while waiting for replica to catch up
+* :jirabug:`PT-1857`: pt-heartbeat doesn't reconnect after killing connection
+* :jirabug:`PT-1528`: pt-online-schema-change "Invalid utf8mb4 character string: 'A111E8'"
+* :jirabug:`PT-1908`: pt_query_digest: Profile file 'Query ID' field truncated (Thanks to Andrew G for reporting this issue)
+* :jirabug:`PT-1881`: pt-upgrade fails when query including format strings and SQL errors is given (Thanks to Nayuta Yanagisawa for reporting this issue)
+* :jirabug:`PT-1892`: pt-summary reports sshd not running
+
+
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..31fa677
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,39 @@
+module github.com/percona/percona-toolkit
+
+go 1.14
+
+require (
+	github.com/Masterminds/semver v1.4.2
+	github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
+	github.com/alecthomas/kingpin v2.2.6+incompatible
+	github.com/go-ini/ini v1.46.0
+	github.com/go-ole/go-ole v1.2.4 // indirect
+	github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129
+	github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf // indirect
+	github.com/google/go-cmp v0.5.2 // indirect
+	github.com/google/uuid v1.1.2
+	github.com/hashicorp/go-version v1.2.1-0.20190424083514-192140e6f3e6
+	github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c
+	github.com/klauspost/compress v1.10.10 // indirect
+	github.com/lib/pq v1.2.0
+	github.com/mattn/go-shellwords v1.0.6
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe
+	github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3
+	github.com/percona/go-mysql v0.0.0-20190903141930-197f4ad8db8d
+	github.com/pkg/errors v0.9.1
+	github.com/prometheus/common v0.13.0
+	github.com/shirou/gopsutil v2.20.8+incompatible
+	github.com/sirupsen/logrus v1.6.0
+	github.com/stretchr/testify v1.6.1
+	github.com/xdg/stringprep v1.0.1-0.20180714160509-73f8eece6fdc // indirect
+	go.mongodb.org/mongo-driver v1.3.4
+	golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
+	golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 // indirect
+	golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6 // indirect
+	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
+	gopkg.in/ini.v1 v1.61.0 // indirect
+	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
+	gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect
+	k8s.io/api v0.20.1
+	mvdan.cc/gofumpt v0.0.0-20200927160801-5bfeb2e70dd6 // indirect
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..836f7f3
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,620 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc=
+github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
+github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
+github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
+github.com/alecthomas/kingpin v2.2.6+incompatible h1:5svnBTFgJjZvGKyYBtMB0+m5wvrbUHiqye8wRJMlnYI=
+github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
+github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
+github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
+github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
+github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
+github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
+github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-ini/ini v1.46.0 h1:hDJFfs/9f75875scvqLkhNB5Jz5/DybKEOZ5MLF+ng4=
+github.com/go-ini/ini v1.46.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
+github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY=
+github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
+github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
+github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
+github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
+github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
+github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
+github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
+github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
+github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
+github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
+github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
+github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
+github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
+github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
+github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
+github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
+github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
+github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
+github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
+github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
+github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
+github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
+github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
+github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
+github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
+github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
+github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
+github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
+github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
+github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
+github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129 h1:tT8iWCYw4uOem71yYA3htfH+LNopJvcqZQshm56G5L4=
+github.com/golang/mock v1.3.1-0.20190508161146-9fa652df1129/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws=
+github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
+github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
+github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go-version v1.2.1-0.20190424083514-192140e6f3e6 h1:rL76JewpeImeqMtpkAHVZkHrXWt6B5sGSj6sAsL0VnI=
+github.com/hashicorp/go-version v1.2.1-0.20190424083514-192140e6f3e6/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c h1:kQWxfPIHVLbgLzphqk3QUflDy9QdksZR4ygR807bpy0=
+github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
+github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I=
+github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
+github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
+github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
+github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
+github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-shellwords v1.0.6 h1:9Jok5pILi5S1MnDirGVTufYGtksUs/V2BWUP3ZkeUUI=
+github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
+github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
+github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
+github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
+github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
+github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
+github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
+github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
+github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
+github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3 h1:YtFkrqsMEj7YqpIhRteVxJxCeC3jJBieuLr0d4C4rSA=
+github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
+github.com/percona/go-mysql v0.0.0-20190903141930-197f4ad8db8d h1:ZkztfR4jYDnkFQtZfwMVm9z7wkK/WiCXRQ7l1CB1/1M=
+github.com/percona/go-mysql v0.0.0-20190903141930-197f4ad8db8d/go.mod h1:/SGLf9OMxlnK6jq4mkFiImBcJXXk5jwD+lDrwDaGXcw=
+github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
+github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.13.0 h1:vJlpe9wPgDRM1Z+7Wj3zUUjY1nr6/1jNKyl7llliccg=
+github.com/prometheus/common v0.13.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/shirou/gopsutil v2.20.8+incompatible h1:8c7Atn0FAUZJo+f4wYbN0iVpdWniCQk7IYwGtgdh1mY=
+github.com/shirou/gopsutil v2.20.8+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk=
+github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
+github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
+github.com/xdg/stringprep v1.0.1-0.20180714160509-73f8eece6fdc h1:vIp1tjhVogU0yBy7w96P027ewvNPeH6gzuNcoc+NReU=
+github.com/xdg/stringprep v1.0.1-0.20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
+go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE=
+go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY=
+golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6 h1:qKpj8TpV+LEhel7H/fR788J+KvhWZ3o3V6N2fU/iuLU=
+golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6 h1:rbvTkL9AkFts1cgI78+gG6Yu1pwaqX6hjSJAatB78E4=
+golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/ini.v1 v1.61.0 h1:LBCdW4FmFYL4s/vDZD1RQYX7oAR6IjujCYgMdbHBR10=
+gopkg.in/ini.v1 v1.61.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+k8s.io/api v0.20.1 h1:ud1c3W3YNzGd6ABJlbFfKXBKXO+1KdGfcgGGNgFR03E=
+k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
+k8s.io/apimachinery v0.20.1 h1:LAhz8pKbgR8tUwn7boK+b2HZdt7MiTu2mkYtFMUjTRQ=
+k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
+k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ=
+k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
+k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
+mvdan.cc/gofumpt v0.0.0-20200927160801-5bfeb2e70dd6 h1:z+/YqapuV7VZPvBb3GYmuEJbA88M3PFUxaHilHYVCpQ=
+mvdan.cc/gofumpt v0.0.0-20200927160801-5bfeb2e70dd6/go.mod h1:bzrjFmaD6+xqohD3KYP0H2FEuxknnBmyyOxdhLdaIws=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
diff --git a/lib/Percona/Toolkit.pm b/lib/Percona/Toolkit.pm
index 3685158..573ab8a 100644
--- a/lib/Percona/Toolkit.pm
+++ b/lib/Percona/Toolkit.pm
@@ -18,7 +18,7 @@
 # ###########################################################################
 package Percona::Toolkit;
 
-our $VERSION = '3.2.1';
+our $VERSION = '3.3.1';
 
 use strict;
 use warnings FATAL => 'all';
diff --git a/lib/TableParser.pm b/lib/TableParser.pm
index c2e3501..eba7d15 100644
--- a/lib/TableParser.pm
+++ b/lib/TableParser.pm
@@ -218,9 +218,10 @@ sub parse {
 
 sub remove_quoted_text {
    my ($string) = @_;
-   $string =~ s/[^\\]`[^`]*[^\\]`//g; 
-   $string =~ s/[^\\]"[^"]*[^\\]"//g; 
-   $string =~ s/[^\\]'[^']*[^\\]'//g; 
+   $string =~ s/\\['"]//g;
+   $string =~ s/`[^`]*?`//g; 
+   $string =~ s/"[^"]*?"//g; 
+   $string =~ s/'[^']*?'//g; 
    return $string;
 }
 
diff --git a/lib/UpgradeResults.pm b/lib/UpgradeResults.pm
index 4959710..1608435 100644
--- a/lib/UpgradeResults.pm
+++ b/lib/UpgradeResults.pm
@@ -405,7 +405,7 @@ sub _print_failures {
    foreach my $failure ( @$failures ) {
       print "\n-- $failno.\n";
       if ( ($failure->[1] || '') eq ($failure->[2] || '') ) {
-         printf "\nOn both hosts:\n\n" . ($failure->[1] || '') . "\n";
+         print "\nOn both hosts:\n\n" . ($failure->[1] || '') . "\n";
       }
       else {
          printf "\n%s\n\nvs.\n\n%s\n",
diff --git a/sandbox/servers/5.6/sys/.gitignore b/sandbox/servers/5.6/sys/.gitignore
new file mode 100644
index 0000000..e8e450b
--- /dev/null
+++ b/sandbox/servers/5.6/sys/.gitignore
@@ -0,0 +1 @@
+gen/
diff --git a/sandbox/servers/5.7/sys/.gitignore b/sandbox/servers/5.7/sys/.gitignore
new file mode 100644
index 0000000..e8e450b
--- /dev/null
+++ b/sandbox/servers/5.7/sys/.gitignore
@@ -0,0 +1 @@
+gen/
diff --git a/src/go/Makefile b/src/go/Makefile
index 57064f2..f91c759 100644
--- a/src/go/Makefile
+++ b/src/go/Makefile
@@ -113,19 +113,19 @@ env-down: env				## Clean-up MongoDB docker containers cluster
 
 linux-amd64: 				## Build Mongo tools for linux-amd64
 	@echo "Building linux/amd64 binaries in ${BIN_DIR}"
-	@cd ${TOP_DIR} && dep ensure
+	@cd ${TOP_DIR} && go get ./...
 	@$(foreach pkg,$(pkgs),rm -f ${BIN_DIR}/$(pkg) 2> /dev/null;)
 	@$(foreach pkg,$(pkgs),GOOS=linux GOARCH=amd64 go build -ldflags ${LDFLAGS} -o ${BIN_DIR}/$(pkg) ./$(pkg);)
 
 linux-386: 					## Build Mongo tools for linux-386
 	@echo "Building linux/386 binaries in ${BIN_DIR}"
-	@cd ${TOP_DIR} && dep ensure
+	@cd ${TOP_DIR} && go get ./...
 	@$(foreach pkg,$(pkgs),rm -f ${BIN_DIR}/$(pkg) 2> /dev/null;)
 	@$(foreach pkg,$(pkgs),GOOS=linux GOARCH=386 go build -ldflags ${LDFLAGS} -o ${BIN_DIR}/$(pkg) ./$(pkg);)
 
 darwin-amd64:				## Build Mongo tools for darwin-amd64 (MacOS) 
 	@echo "Building darwin/amd64 binaries in ${BIN_DIR}"
-	@cd ${TOP_DIR} && dep ensure
+	@cd ${TOP_DIR} && go get ./...
 	@$(foreach pkg,$(pkgs),rm -f ${BIN_DIR}/$(pkg) 2> /dev/null;)
 	@$(foreach pkg,$(pkgs),GOOS=darwin GOARCH=amd64 go build -ldflags ${LDFLAGS} -o ${BIN_DIR}/$(pkg) ./$(pkg);)
 
@@ -138,8 +138,8 @@ test:						## Run tests
 	@./runtests.sh
 
 format:                         ## Format source code.
-	gofmt -w -s $(FILES)
-	goimports -local github.com/percona/pmm-managed -l -w $(FILES)
+	gofumpt -w -s $(FILES)
+	gofumports -local github.com/percona/pmm-managed -l -w $(FILES)
 
 vet:						## Run vet on Go code
 	@echo ">> vetting code"
diff --git a/src/go/internal/testutils/env.go b/src/go/internal/testutils/env.go
index e46b2fa..ea2c9ca 100644
--- a/src/go/internal/testutils/env.go
+++ b/src/go/internal/testutils/env.go
@@ -1,11 +1,16 @@
 package testutils
 
 import (
+	"context"
+	"net"
 	"os"
 	"os/exec"
 	"path/filepath"
 	"strings"
 	"time"
+
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
 )
 
 const (
@@ -143,30 +148,70 @@ func BaseDir() string {
 	}
 
 	basedir = strings.TrimSpace(string(out))
+
 	return basedir
 }
 
 // GetMongoDBAddr returns the address of an instance by replicaset name and instance type like
-// (rs1, primary) or (rs1, secondary1)
+// (rs1, primary) or (rs1, secondary1).
 func GetMongoDBAddr(rs, name string) string {
 	if _, ok := hosts[rs]; !ok {
 		return ""
 	}
+
 	replset := hosts[rs]
+
 	if host, ok := replset[name]; ok {
 		return host
 	}
+
 	return ""
 }
 
-// GetMongoDBReplsetAddrs return the addresses of all instances for a replicaset name
+// GetMongoDBReplsetAddrs return the addresses of all instances for a replicaset name.
 func GetMongoDBReplsetAddrs(rs string) []string {
 	addrs := []string{}
+
 	if _, ok := hosts[rs]; !ok {
 		return addrs
 	}
+
 	for _, host := range hosts[rs] {
 		addrs = append(addrs, host)
 	}
+
 	return addrs
 }
+
+// TestClient returns a new MongoDB connection to the specified server port.
+func TestClient(ctx context.Context, port string) (*mongo.Client, error) {
+	if port == "" {
+		port = MongoDBShard1PrimaryPort
+	}
+
+	hostname := "127.0.0.1"
+	direct := true
+	to := time.Second
+	co := &options.ClientOptions{
+		ConnectTimeout: &to,
+		Hosts:          []string{net.JoinHostPort(hostname, port)},
+		Direct:         &direct,
+		Auth: &options.Credential{
+			Username:    MongoDBUser,
+			Password:    MongoDBPassword,
+			PasswordSet: true,
+		},
+	}
+
+	client, err := mongo.Connect(ctx, co)
+	if err != nil {
+		return nil, err
+	}
+
+	err = client.Ping(ctx, nil)
+	if err != nil {
+		return nil, err
+	}
+
+	return client, nil
+}
diff --git a/src/go/lib/config/config.go b/src/go/lib/config/config.go
index 0c35c1c..820fc89 100644
--- a/src/go/lib/config/config.go
+++ b/src/go/lib/config/config.go
@@ -75,10 +75,8 @@ func DefaultConfigFiles(toolName string) ([]string, error) {
 }
 
 func DefaultConfig(toolname string) *Config {
-
 	files, _ := DefaultConfigFiles(toolname)
 	return NewConfig(files...)
-
 }
 
 func NewConfig(files ...string) *Config {
@@ -94,7 +92,6 @@ func NewConfig(files ...string) *Config {
 }
 
 func read(filename string, opts map[string]interface{}) error {
-
 	f, err := os.Open(filename)
 	if err != nil {
 		return err
@@ -135,7 +132,7 @@ func read(filename string, opts map[string]interface{}) error {
 		}
 
 		if f == float64(int64(f)) {
-			opts[key] = int64(f) //int64
+			opts[key] = int64(f) // int64
 			continue
 		}
 
diff --git a/src/go/lib/config/config_test.go b/src/go/lib/config/config_test.go
index 2bc7133..abbf5a5 100644
--- a/src/go/lib/config/config_test.go
+++ b/src/go/lib/config/config_test.go
@@ -11,7 +11,6 @@ import (
 )
 
 func TestReadConfig(t *testing.T) {
-
 	rootPath, err := tutil.RootPath()
 	if err != nil {
 		t.Errorf("cannot get root path: %s", err)
@@ -69,7 +68,6 @@ func TestReadConfig(t *testing.T) {
 }
 
 func TestOverrideConfig(t *testing.T) {
-
 	rootPath, err := tutil.RootPath()
 	if err != nil {
 		t.Errorf("cannot get root path: %s", err)
@@ -131,7 +129,6 @@ func TestOverrideConfig(t *testing.T) {
 }
 
 func TestDefaultFiles(t *testing.T) {
-
 	user, _ := user.Current()
 	toolname := "pt-testing"
 
@@ -150,5 +147,4 @@ func TestDefaultFiles(t *testing.T) {
 	if !reflect.DeepEqual(got, want) {
 		t.Errorf("got %#v\nwant: %#v\n", got, want)
 	}
-
 }
diff --git a/src/go/lib/pginfo/pginfo.go b/src/go/lib/pginfo/pginfo.go
index 1c42813..2923915 100644
--- a/src/go/lib/pginfo/pginfo.go
+++ b/src/go/lib/pginfo/pginfo.go
@@ -5,8 +5,8 @@ import (
 	"regexp"
 	"time"
 
-	"github.com/percona/percona-toolkit/src/go/pt-pg-summary/models"
 	"github.com/hashicorp/go-version"
+	"github.com/percona/percona-toolkit/src/go/pt-pg-summary/models"
 	"github.com/pkg/errors"
 	"github.com/shirou/gopsutil/process"
 	"github.com/sirupsen/logrus"
diff --git a/src/go/lib/tutil/util.go b/src/go/lib/tutil/util.go
index 0309818..3ef8d8e 100644
--- a/src/go/lib/tutil/util.go
+++ b/src/go/lib/tutil/util.go
@@ -108,17 +108,15 @@ func LoadBson(filename string, destination interface{}) error {
 }
 
 func WriteJson(filename string, data interface{}) error {
-
 	buf, err := json.MarshalIndent(data, "", "  ")
 	if err != nil {
 		return err
 	}
-	err = ioutil.WriteFile(filename, buf, 0777)
+	err = ioutil.WriteFile(filename, buf, 0o777)
 	if err != nil {
 		return err
 	}
 	return nil
-
 }
 
 func ShouldUpdateSamples() bool {
diff --git a/src/go/lib/versioncheck/version_check_test.go b/src/go/lib/versioncheck/version_check_test.go
index e4f0da1..0d449df 100644
--- a/src/go/lib/versioncheck/version_check_test.go
+++ b/src/go/lib/versioncheck/version_check_test.go
@@ -12,7 +12,6 @@ import (
 )
 
 func TestCheckUpdates(t *testing.T) {
-
 	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		body, _ := ioutil.ReadAll(r.Body)
 		m := strings.Split(string(body), ";")
@@ -39,11 +38,9 @@ func TestCheckUpdates(t *testing.T) {
 	if msg == "" {
 		t.Error("got empty response")
 	}
-
 }
 
 func TestEmptyResponse(t *testing.T) {
-
 	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		fmt.Fprint(w, "")
 	}))
@@ -57,5 +54,4 @@ func TestEmptyResponse(t *testing.T) {
 	if msg != "" {
 		t.Error("response should return error due to empty body")
 	}
-
 }
diff --git a/src/go/mongolib/profiler/profiler.go b/src/go/mongolib/profiler/profiler.go
index 89db989..3fe2520 100644
--- a/src/go/mongolib/profiler/profiler.go
+++ b/src/go/mongolib/profiler/profiler.go
@@ -11,10 +11,8 @@ import (
 	"go.mongodb.org/mongo-driver/mongo"
 )
 
-var (
-	// DocsBufferSize is the buffer size to store documents from the MongoDB profiler
-	DocsBufferSize = 100
-)
+// DocsBufferSize is the buffer size to store documents from the MongoDB profiler
+var DocsBufferSize = 100
 
 // Profiler interface
 type Profiler interface {
diff --git a/src/go/mongolib/proto/oplog.go b/src/go/mongolib/proto/oplog.go
index b35c768..7931d62 100644
--- a/src/go/mongolib/proto/oplog.go
+++ b/src/go/mongolib/proto/oplog.go
@@ -34,9 +34,11 @@ type OpLogs []OplogInfo
 func (s OpLogs) Len() int {
 	return len(s)
 }
+
 func (s OpLogs) Swap(i, j int) {
 	s[i], s[j] = s[j], s[i]
 }
+
 func (s OpLogs) Less(i, j int) bool {
 	return s[i].TimeDiffHours < s[j].TimeDiffHours
 }
diff --git a/src/go/mongolib/proto/procinfo.go b/src/go/mongolib/proto/procinfo.go
new file mode 100644
index 0000000..ce588d2
--- /dev/null
+++ b/src/go/mongolib/proto/procinfo.go
@@ -0,0 +1,30 @@
+package proto
+
+import "time"
+
+type ProcInfo struct {
+	CreateTime time.Time
+	Path       string
+	UserName   string
+	Error      error
+}
+
+type GetHostInfo struct {
+	Hostname          string
+	HostOsType        string
+	HostSystemCPUArch string
+	HostDatabases     int
+	HostCollections   int
+	DBPath            string
+
+	ProcPath         string
+	ProcUserName     string
+	ProcCreateTime   time.Time
+	ProcProcessCount int
+
+	// Server Status
+	ProcessName    string
+	ReplicasetName string
+	Version        string
+	NodeType       string
+}
diff --git a/src/go/mongolib/proto/replconfig.go b/src/go/mongolib/proto/replconfig.go
index 58ab705..9710f56 100644
--- a/src/go/mongolib/proto/replconfig.go
+++ b/src/go/mongolib/proto/replconfig.go
@@ -4,8 +4,11 @@ import (
 	"go.mongodb.org/mongo-driver/bson/primitive"
 )
 
-type ReplicaSetConfigTags map[string]string
-type GetLastErrorModes map[string]*ReplicaSetConfigTags
+type (
+	ReplicaSetConfigTags map[string]string
+
+	GetLastErrorModes map[string]*ReplicaSetConfigTags
+)
 
 // https://docs.mongodb.com/v3.2/reference/command/getLastError/#dbcmd.getLastError
 type GetLastErrorDefaults struct {
diff --git a/src/go/mongolib/proto/replstatus.go b/src/go/mongolib/proto/replstatus.go
index 96a0e1c..72e9f0c 100644
--- a/src/go/mongolib/proto/replstatus.go
+++ b/src/go/mongolib/proto/replstatus.go
@@ -1,6 +1,9 @@
 package proto
 
-import "go.mongodb.org/mongo-driver/bson/primitive"
+import (
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"gopkg.in/mgo.v2/bson"
+)
 
 const (
 	REPLICA_SET_MEMBER_STARTUP = iota
@@ -48,3 +51,83 @@ type ReplicaSetStatus struct {
 	Ok                      float64            `bson:"ok"`                      //
 	Set                     string             `bson:"set"`                     // Replica set name
 }
+
+type Member struct {
+	Host         string  `bson:"host"`
+	Votes        int32   `bson:"votes"`
+	ID           int32   `bson:"_id"`
+	SlaveDelay   int64   `bson:"slaveDelay"`
+	Priority     float64 `bson:"priority"`
+	BuildIndexes bool    `bson:"buildIndexes"`
+	ArbiterOnly  bool    `bson:"arbiterOnly"`
+	Hidden       bool    `bson:"hidden"`
+	Tags         bson.M  `bson:"tags"`
+}
+
+type RSConfig struct {
+	ID                                 string     `bson:"_id"`
+	ConfigServer                       bool       `bson:"configsvr"`
+	WriteConcernMajorityJournalDefault bool       `bson:"writeConcernMajorityJournalDefault"`
+	Version                            int32      `bson:"version"`
+	ProtocolVersion                    int64      `bson:"protocolVersion"`
+	Settings                           RSSettings `bson:"settings"`
+	Members                            []Member   `bson:"members"`
+}
+
+type LastErrorDefaults struct {
+	W        interface{} `bson:"w"`
+	WTimeout int32       `bson:"wtimeout"`
+}
+
+type RSSettings struct {
+	HeartbeatTimeoutSecs       int32              `bson:"heartbeatTimeoutSecs"`
+	ElectionTimeoutMillis      int32              `bson:"electionTimeoutMillis"`
+	CatchUpTimeoutMillis       int32              `bson:"catchUpTimeoutMillis"`
+	GetLastErrorModes          bson.M             `bson:"getLastErrorModes"`
+	ChainingAllowed            bool               `bson:"chainingAllowed"`
+	HeartbeatIntervalMillis    int32              `bson:"heartbeatIntervalMillis"`
+	CatchUpTakeoverDelayMillis int32              `bson:"catchUpTakeoverDelayMillis"`
+	GetLastErrorDefaults       LastErrorDefaults  `bson:"getLastErrorDefaults"`
+	ReplicaSetID               primitive.ObjectID `bson:"replicaSetId"`
+}
+
+type Signature struct {
+	Hash  primitive.Binary `bson:"hash"`
+	KeyID int64            `bson:"keyId"`
+}
+
+type ClusterTime struct {
+	ClusterTime primitive.Timestamp `bson:"clusterTime"`
+	Signature   Signature           `bson:"signature"`
+}
+
+type ReplicasetConfig struct {
+	Config              RSConfig            `bson:"config"`
+	OK                  float64             `bson:"ok"`
+	LastCommittedOpTime primitive.Timestamp `bson:"lastCommittedOpTime"`
+	ClusterTime         ClusterTime         `bson:"$clusterTime"`
+	OperationTime       primitive.Timestamp `bson:"operationTime"`
+}
+
+type ConfigVersion struct {
+	ID                   int32              `bson:"_id"`
+	MinCompatibleVersion int32              `bson:"minCompatibleVersion"`
+	CurrentVersion       int32              `bson:"currentVersion"`
+	ClusterID            primitive.ObjectID `bson:"clusterId"`
+}
+
+type ShardIdentity struct {
+	ID                        string             `bson:"_id"`
+	ShardName                 string             `bson:"shardName"`
+	ClusterID                 primitive.ObjectID `bson:"clusterId"`
+	ConfigsvrConnectionString string             `bson:"configsvrConnectionString"`
+}
+
+// MyState is a subset of getDiagnosticData result used to tag metrics in the MongoDB exporter
+type MyState struct {
+	Data struct {
+		ReplicasetGetStatus struct {
+			MyState int `bson:"myState"`
+		} `bson:"replSetGetStatus"`
+	} `bson:"data"`
+}
diff --git a/src/go/mongolib/util/util.go b/src/go/mongolib/util/util.go
index 3cdc135..f854991 100644
--- a/src/go/mongolib/util/util.go
+++ b/src/go/mongolib/util/util.go
@@ -2,23 +2,39 @@ package util
 
 import (
 	"context"
+	"fmt"
 	"sort"
 	"strings"
+	"time"
 
 	"github.com/percona/percona-toolkit/src/go/mongolib/proto"
 	"github.com/pkg/errors"
+	"github.com/prometheus/common/log"
+	"github.com/shirou/gopsutil/process"
 	"go.mongodb.org/mongo-driver/bson/primitive"
 	"go.mongodb.org/mongo-driver/mongo"
 	"go.mongodb.org/mongo-driver/mongo/options"
+	"gopkg.in/mgo.v2/bson"
 )
 
 const (
+	TypeIsDBGrid    = "isdbgrid"
+	TypeMongos      = "mongos"
+	TypeMongod      = "mongod"
+	TypeShardServer = "shardsvr"
+
+	milliToSeconds              = 1000
 	shardingNotEnabledErrorCode = 203
+	ErrNotYetInitialized        = int32(94)
+	ErrNoReplicationEnabled     = int32(76)
 )
 
 var (
 	CannotGetQueryError     = errors.New("cannot get query field from the profile document (it is not a map)")
 	ShardingNotEnabledError = errors.New("sharding not enabled")
+
+	ErrCannotGetProcess   = fmt.Errorf("cannot get process")
+	ErrCannotGetClusterID = fmt.Errorf("cannot get cluster ID")
 )
 
 func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOptions) ([]proto.Members, error) {
@@ -26,6 +42,7 @@ func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOpti
 	if err != nil {
 		return nil, errors.Wrap(err, "cannot get a new client for GetReplicasetMembers")
 	}
+
 	if err := client.Connect(ctx); err != nil {
 		return nil, errors.Wrap(err, "cannot connect to MongoDB")
 	}
@@ -34,6 +51,7 @@ func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOpti
 	if err != nil {
 		return nil, err
 	}
+
 	if err := client.Disconnect(ctx); err != nil {
 		return nil, errors.Wrapf(err, "cannot disconnect from %v", clientOptions.Hosts)
 	}
@@ -54,7 +72,10 @@ func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOpti
 		cmdOpts := proto.CommandLineOptions{}
 		// Not always we can get this info. For examples, we cannot get this for hidden hosts so
 		// if there is an error, just ignore it
-		res := client.Database("admin").RunCommand(ctx, primitive.D{{"getCmdLineOpts", 1}, {"recordStats", 1}})
+		res := client.Database("admin").RunCommand(ctx, primitive.D{
+			{Key: "getCmdLineOpts", Value: 1},
+			{Key: "recordStats", Value: 1},
+		})
 		if res.Err() == nil {
 			if err := res.Decode(&cmdOpts); err != nil {
 				return nil, errors.Wrapf(err, "cannot decode getCmdLineOpts response for host %s", hostname)
@@ -62,6 +83,7 @@ func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOpti
 		}
 
 		rss := proto.ReplicaSetStatus{}
+
 		res = client.Database("admin").RunCommand(ctx, primitive.M{"replSetGetStatus": 1})
 		if res.Err() != nil {
 			m := proto.Members{
@@ -73,26 +95,34 @@ func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOpti
 				m.ID = serverStatus.Pid
 				m.StorageEngine = serverStatus.StorageEngine
 			}
+
 			membersMap[m.Name] = m
+
 			continue // If a host is a mongos we cannot get info but is not a real error
 		}
 
 		if err := res.Decode(&rss); err != nil {
 			return nil, errors.Wrap(err, "cannot decode replSetGetStatus response")
 		}
+
 		for _, m := range rss.Members {
 			if _, ok := membersMap[m.Name]; ok {
 				continue // already exists
 			}
+
 			m.Set = rss.Set
+
 			if serverStatus, err := GetServerStatus(ctx, client); err == nil {
 				m.ID = serverStatus.Pid
 				m.StorageEngine = serverStatus.StorageEngine
+
 				if cmdOpts.Parsed.Sharding.ClusterRole != "" {
 					m.StateStr = cmdOpts.Parsed.Sharding.ClusterRole + "/" + m.StateStr
 				}
+
 				m.StateStr = strings.ToUpper(m.StateStr)
 			}
+
 			membersMap[m.Name] = m
 		}
 
@@ -104,30 +134,36 @@ func GetReplicasetMembers(ctx context.Context, clientOptions *options.ClientOpti
 	}
 
 	sort.Slice(members, func(i, j int) bool { return members[i].Name < members[j].Name })
+
 	return members, nil
 }
 
 func GetHostnames(ctx context.Context, client *mongo.Client) ([]string, error) {
 	// Probably we are connected to an individual member of a replica set
 	rss := proto.ReplicaSetStatus{}
+
 	res := client.Database("admin").RunCommand(ctx, primitive.M{"replSetGetStatus": 1})
 	if res.Err() == nil {
 		if err := res.Decode(&rss); err != nil {
 			return nil, errors.Wrap(err, "cannot decode replSetGetStatus response for GetHostnames")
 		}
+
 		return buildHostsListFromReplStatus(rss), nil
 	}
 
 	// Try getShardMap first. If we are connected to a mongos it will return
 	// all hosts, including config hosts
 	var shardsMap proto.ShardsMap
+
 	smRes := client.Database("admin").RunCommand(ctx, primitive.M{"getShardMap": 1})
 	if smRes.Err() != nil {
 		if e, ok := smRes.Err().(mongo.CommandError); ok && e.Code == shardingNotEnabledErrorCode {
 			return nil, ShardingNotEnabledError // standalone instance
 		}
+
 		return nil, errors.Wrap(smRes.Err(), "cannot getShardMap for GetHostnames")
 	}
+
 	if err := smRes.Decode(&shardsMap); err != nil {
 		return nil, errors.Wrap(err, "cannot decode getShardMap result for GetHostnames")
 	}
@@ -145,48 +181,47 @@ func GetHostnames(ctx context.Context, client *mongo.Client) ([]string, error) {
 	return nil, nil // standalone instance
 }
 
+/*
+   "members" : [
+            {
+                    "_id" : 0,
+                    "name" : "localhost:17001",
+                    "health" : 1,
+                    "state" : 1,
+                    "stateStr" : "PRIMARY",
+                    "uptime" : 4700,
+                    "optime" : Timestamp(1486554836, 1),
+                    "optimeDate" : ISODate("2017-02-08T11:53:56Z"),
+                    "electionTime" : Timestamp(1486651810, 1),
+                    "electionDate" : ISODate("2017-02-09T14:50:10Z"),
+                    "configVersion" : 1,
+                    "self" : true
+            },
+*/
 func buildHostsListFromReplStatus(replStatus proto.ReplicaSetStatus) []string {
-	/*
-	   "members" : [
-	            {
-	                    "_id" : 0,
-	                    "name" : "localhost:17001",
-	                    "health" : 1,
-	                    "state" : 1,
-	                    "stateStr" : "PRIMARY",
-	                    "uptime" : 4700,
-	                    "optime" : Timestamp(1486554836, 1),
-	                    "optimeDate" : ISODate("2017-02-08T11:53:56Z"),
-	                    "electionTime" : Timestamp(1486651810, 1),
-	                    "electionDate" : ISODate("2017-02-09T14:50:10Z"),
-	                    "configVersion" : 1,
-	                    "self" : true
-	            },
-	*/
-
 	hostnames := []string{}
 	for _, member := range replStatus.Members {
 		hostnames = append(hostnames, member.Name)
 	}
+
 	sort.Strings(hostnames) // to make testing easier
 
 	return hostnames
 }
 
+/* Example
+mongos> db.getSiblingDB('admin').runCommand('getShardMap')
+{
+  "map" : {
+    "config" : "localhost:19001,localhost:19002,localhost:19003",
+    "localhost:17001" : "r1/localhost:17001,localhost:17002,localhost:17003",
+    "r1" : "r1/localhost:17001,localhost:17002,localhost:17003",
+    "r1/localhost:17001,localhost:17002,localhost:17003" : "r1/localhost:17001,localhost:17002,localhost:17003",
+  },
+  "ok" : 1
+}.
+*/
 func buildHostsListFromShardMap(shardsMap proto.ShardsMap) []string {
-	/* Example
-	mongos> db.getSiblingDB('admin').runCommand('getShardMap')
-	{
-	  "map" : {
-	    "config" : "localhost:19001,localhost:19002,localhost:19003",
-	    "localhost:17001" : "r1/localhost:17001,localhost:17002,localhost:17003",
-	    "r1" : "r1/localhost:17001,localhost:17002,localhost:17003",
-	    "r1/localhost:17001,localhost:17002,localhost:17003" : "r1/localhost:17001,localhost:17002,localhost:17003",
-	  },
-	  "ok" : 1
-	}
-	*/
-
 	hostnames := []string{}
 	hm := make(map[string]bool)
 
@@ -197,10 +232,11 @@ func buildHostsListFromShardMap(shardsMap proto.ShardsMap) []string {
 		for _, val := range shardsMap.Map {
 			m := strings.Split(val, "/")
 			hostsStr := ""
+
 			switch len(m) {
 			case 1:
 				hostsStr = m[0] // there is no / in the hosts list
-			case 2:
+			case 2: //nolint
 				hostsStr = m[1] // there is a / in the string. Remove the prefix until the / and keep the rest
 			}
 			// since there is no Sets in Go, build a map where the value is the map key
@@ -209,33 +245,39 @@ func buildHostsListFromShardMap(shardsMap proto.ShardsMap) []string {
 				hm[host] = false
 			}
 		}
+
 		for host := range hm {
 			hostnames = append(hostnames, host)
 		}
 	}
 
 	sort.Strings(hostnames)
+
 	return hostnames
 }
 
 // GetShardedHosts is like GetHostnames but it uses listShards instead of getShardMap
-// so it won't include config servers in the returned list
+// so it won't include config servers in the returned list.
 func GetShardedHosts(ctx context.Context, client *mongo.Client) ([]string, error) {
 	shardsInfo := &proto.ShardsInfo{}
+
 	res := client.Database("admin").RunCommand(ctx, primitive.M{"listShards": 1})
 	if res.Err() != nil {
 		return nil, errors.Wrap(res.Err(), "cannot list shards")
 	}
+
 	if err := res.Decode(&shardsInfo); err != nil {
 		return nil, errors.Wrap(err, "cannot decode listShards response")
 	}
 
 	hostnames := []string{}
+
 	for _, shardInfo := range shardsInfo.Shards {
 		m := strings.Split(shardInfo.Host, "/")
 		h := strings.Split(m[1], ",")
 		hostnames = append(hostnames, h[0])
 	}
+
 	return hostnames, nil
 }
 
@@ -248,6 +290,7 @@ func GetServerStatus(ctx context.Context, client *mongo.Client) (proto.ServerSta
 		{Key: "recordStats", Value: 1},
 	}
 	res := client.Database("admin").RunCommand(ctx, query)
+
 	if res.Err() != nil {
 		return ss, errors.Wrap(res.Err(), "GetHostInfo.serverStatus")
 	}
@@ -265,14 +308,17 @@ func GetQueryField(doc proto.SystemProfile) (primitive.M, error) {
 	// however MongoDB 3.0 doesn't have that field
 	// so we need to detect protocol by looking at actual data.
 	query := doc.Query
-	if len(doc.Command) > 0 {
+
+	if len(doc.Command) > 0 { //nolint
 		query = doc.Command
+
 		if doc.Op == "update" || doc.Op == "remove" {
 			if squery, ok := query.Map()["q"]; ok {
 				// just an extra check to ensure this type assertion won't fail
 				if ssquery, ok := squery.(primitive.M); ok {
 					return ssquery, nil
 				}
+
 				return nil, CannotGetQueryError
 			}
 		}
@@ -309,6 +355,7 @@ func GetQueryField(doc proto.SystemProfile) (primitive.M, error) {
 		if ssquery, ok := squery.(primitive.M); ok {
 			return ssquery, nil
 		}
+
 		return nil, CannotGetQueryError
 	}
 
@@ -317,6 +364,7 @@ func GetQueryField(doc proto.SystemProfile) (primitive.M, error) {
 		if ssquery, ok := squery.(primitive.M); ok {
 			return ssquery, nil
 		}
+
 		return nil, CannotGetQueryError
 	}
 
@@ -333,5 +381,173 @@ func GetQueryField(doc proto.SystemProfile) (primitive.M, error) {
 func GetClientForHost(co *options.ClientOptions, newHost string) (*mongo.Client, error) {
 	newOptions := options.MergeClientOptions(co, &options.ClientOptions{Hosts: []string{newHost}})
 	newOptions.SetDirect(true)
+
 	return mongo.NewClient(newOptions)
 }
+
+func GetHostInfo(ctx context.Context, client *mongo.Client) (*proto.GetHostInfo, error) {
+	hi := proto.HostInfo{}
+	if err := client.Database("admin").RunCommand(ctx, primitive.M{"hostInfo": 1}).Decode(&hi); err != nil {
+		log.Debugf("run('hostInfo') error: %s", err)
+		return nil, errors.Wrap(err, "GetHostInfo.hostInfo")
+	}
+
+	cmdOpts := proto.CommandLineOptions{}
+	query := primitive.D{{Key: "getCmdLineOpts", Value: 1}, {Key: "recordStats", Value: 1}}
+
+	err := client.Database("admin").RunCommand(ctx, query).Decode(&cmdOpts)
+	if err != nil {
+		return nil, errors.Wrap(err, "cannot get command line options")
+	}
+
+	ss := proto.ServerStatus{}
+	query = primitive.D{{Key: "serverStatus", Value: 1}, {Key: "recordStats", Value: 1}}
+
+	if err := client.Database("admin").RunCommand(ctx, query).Decode(&ss); err != nil {
+		return nil, errors.Wrap(err, "GetHostInfo.serverStatus")
+	}
+
+	pi := proto.ProcInfo{}
+	if err := fillProcInfo(int32(ss.Pid), &pi); err != nil {
+		pi.Error = err
+	}
+
+	nodeType, _ := getNodeType(ctx, client)
+	procCount, _ := countMongodProcesses()
+
+	i := &proto.GetHostInfo{
+		Hostname:          hi.System.Hostname,
+		HostOsType:        hi.Os.Type,
+		HostSystemCPUArch: hi.System.CpuArch,
+		DBPath:            "", // Sets default. It will be overridden later if necessary
+
+		ProcessName:      ss.Process,
+		ProcProcessCount: procCount,
+		Version:          ss.Version,
+		NodeType:         nodeType,
+
+		ProcPath:       pi.Path,
+		ProcUserName:   pi.UserName,
+		ProcCreateTime: pi.CreateTime,
+	}
+	if ss.Repl != nil {
+		i.ReplicasetName = ss.Repl.SetName
+	}
+
+	if cmdOpts.Parsed.Storage.DbPath != "" {
+		i.DBPath = cmdOpts.Parsed.Storage.DbPath
+	}
+
+	return i, nil
+}
+
+func ClusterID(ctx context.Context, client *mongo.Client) (string, error) {
+	var cv proto.ConfigVersion
+	if err := client.Database("config").Collection("version").FindOne(ctx, bson.M{}).Decode(&cv); err == nil {
+		return cv.ClusterID.Hex(), nil
+	}
+
+	var si proto.ShardIdentity
+
+	filter := bson.M{"_id": "shardIdentity"}
+
+	if err := client.Database("admin").Collection("system.version").FindOne(ctx, filter).Decode(&si); err == nil {
+		return si.ClusterID.Hex(), nil
+	}
+
+	rc, err := ReplicasetConfig(ctx, client)
+	if err != nil {
+		if e, ok := err.(mongo.CommandError); ok && IsReplicationNotEnabledError(e) {
+			return "", nil
+		}
+
+		return "", err
+	}
+
+	return rc.Config.Settings.ReplicaSetID.Hex(), nil
+}
+
+func IsReplicationNotEnabledError(err mongo.CommandError) bool {
+	return err.Code == ErrNotYetInitialized || err.Code == ErrNoReplicationEnabled
+}
+
+func MyState(ctx context.Context, client *mongo.Client) (int, error) {
+	var ms proto.MyState
+	if err := client.Database("admin").RunCommand(ctx, bson.M{"getDiagnosticData": 1}).Decode(&ms); err != nil {
+		return 0, err
+	}
+
+	return ms.Data.ReplicasetGetStatus.MyState, nil
+}
+
+func ReplicasetConfig(ctx context.Context, client *mongo.Client) (*proto.ReplicasetConfig, error) {
+	var rs proto.ReplicasetConfig
+	if err := client.Database("admin").RunCommand(ctx, bson.M{"replSetGetConfig": 1}).Decode(&rs); err != nil {
+		return nil, err
+	}
+
+	return &rs, nil
+}
+
+func fillProcInfo(pid int32, procInfo *proto.ProcInfo) error {
+	proc, err := process.NewProcess(pid)
+	if err != nil {
+		return errors.Wrapf(ErrCannotGetProcess, "%s", err)
+	}
+
+	ct, err := proc.CreateTime()
+	if err != nil {
+		return err
+	}
+
+	procInfo.CreateTime = time.Unix(ct/milliToSeconds, 0)
+
+	if procInfo.Path, err = proc.Exe(); err != nil {
+		return err
+	}
+
+	if procInfo.UserName, err = proc.Username(); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func getNodeType(ctx context.Context, client *mongo.Client) (string, error) {
+	md := proto.MasterDoc{}
+	if err := client.Database("admin").RunCommand(ctx, primitive.M{"isMaster": 1}).Decode(&md); err != nil {
+		return "", err
+	}
+
+	if md.SetName != nil || md.Hosts != nil {
+		return TypeShardServer, nil
+	} else if md.Msg == TypeIsDBGrid {
+		// isdbgrid is always the msg value when calling isMaster on a mongos
+		// see http://docs.mongodb.org/manual/core/sharded-cluster-query-router/
+		return TypeMongos, nil
+	}
+
+	return TypeMongod, nil
+}
+
+func countMongodProcesses() (int, error) {
+	pids, err := process.Pids()
+	if err != nil {
+		return 0, err
+	}
+
+	count := 0
+
+	for _, pid := range pids {
+		p, err := process.NewProcess(pid)
+		if err != nil {
+			continue
+		}
+
+		if name, _ := p.Name(); name == TypeMongod || name == TypeMongos {
+			count++
+		}
+	}
+
+	return count, nil
+}
diff --git a/src/go/mongolib/util/util_test.go b/src/go/mongolib/util/util_test.go
index 0af6cf1..c8d62b3 100644
--- a/src/go/mongolib/util/util_test.go
+++ b/src/go/mongolib/util/util_test.go
@@ -8,6 +8,7 @@ import (
 	"time"
 
 	tu "github.com/percona/percona-toolkit/src/go/internal/testutils"
+	"github.com/stretchr/testify/assert"
 	"go.mongodb.org/mongo-driver/mongo"
 	"go.mongodb.org/mongo-driver/mongo/options"
 )
@@ -20,34 +21,58 @@ func TestGetHostnames(t *testing.T) {
 		wantError bool
 	}{
 		{
-			name:      "from_mongos",
-			uri:       fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBMongosPort),
+			name: "from_mongos",
+			uri: fmt.Sprintf("mongodb://%s:%s@%s:%s",
+				tu.MongoDBUser,
+				tu.MongoDBPassword,
+				tu.MongoDBHost,
+				tu.MongoDBMongosPort,
+			),
 			want:      []string{"127.0.0.1:17001", "127.0.0.1:17002", "127.0.0.1:17004", "127.0.0.1:17005", "127.0.0.1:17007"},
 			wantError: false,
 		},
 		{
-			name:      "from_mongod",
-			uri:       fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard1PrimaryPort),
+			name: "from_mongod",
+			uri: fmt.Sprintf("mongodb://%s:%s@%s:%s",
+				tu.MongoDBUser,
+				tu.MongoDBPassword,
+				tu.MongoDBHost,
+				tu.MongoDBShard1PrimaryPort,
+			),
 			want:      []string{"127.0.0.1:17001", "127.0.0.1:17002", "127.0.0.1:17003"},
 			wantError: false,
 		},
 		{
-			name:      "from_non_sharded",
-			uri:       fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBShard3PrimaryPort),
+			name: "from_non_sharded",
+			uri: fmt.Sprintf("mongodb://%s:%s@%s:%s",
+				tu.MongoDBUser,
+				tu.MongoDBPassword,
+				tu.MongoDBHost,
+				tu.MongoDBShard3PrimaryPort,
+			),
 			want:      []string{"127.0.0.1:17021", "127.0.0.1:17022", "127.0.0.1:17023"},
 			wantError: false,
 		},
 		{
-			name:      "from_standalone",
-			uri:       fmt.Sprintf("mongodb://%s:%s@%s:%s", tu.MongoDBUser, tu.MongoDBPassword, tu.MongoDBHost, tu.MongoDBStandalonePort),
+			name: "from_standalone",
+			uri: fmt.Sprintf("mongodb://%s:%s@%s:%s",
+				tu.MongoDBUser,
+				tu.MongoDBPassword,
+				tu.MongoDBHost,
+				tu.MongoDBStandalonePort,
+			),
 			want:      nil,
 			wantError: true,
 		},
 	}
 
 	for _, test := range testCases {
+		uri := test.uri
+		want := test.want
+		wantError := test.wantError
+
 		t.Run(test.name, func(t *testing.T) {
-			client, err := mongo.NewClient(options.Client().ApplyURI(test.uri))
+			client, err := mongo.NewClient(options.Client().ApplyURI(uri))
 			if err != nil {
 				t.Fatalf("cannot get a new MongoDB client: %s", err)
 			}
@@ -59,12 +84,12 @@ func TestGetHostnames(t *testing.T) {
 			}
 
 			hostnames, err := GetHostnames(ctx, client)
-			if err != nil && !test.wantError {
+			if err != nil && !wantError {
 				t.Errorf("Expecting error=nil, got: %v", err)
 			}
 
-			if !reflect.DeepEqual(hostnames, test.want) {
-				t.Errorf("Invalid hostnames. Got: %+v, want %+v", hostnames, test.want)
+			if !reflect.DeepEqual(hostnames, want) {
+				t.Errorf("Invalid hostnames. Got: %+v, want %+v", hostnames, want)
 			}
 		})
 	}
@@ -194,3 +219,139 @@ func TestGetShardedHosts(t *testing.T) {
 		})
 	}
 }
+
+func TestReplicasetConfig(t *testing.T) {
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+	defer cancel()
+
+	tcs := []struct {
+		port             string
+		wantID           string
+		wantConfigServer bool
+		wantError        error
+	}{
+		{
+			port:             tu.MongoDBStandalonePort,
+			wantID:           "",
+			wantConfigServer: false,
+			wantError: mongo.CommandError{
+				Code:    76,
+				Message: "not running with --replSet",
+				Labels:  []string(nil),
+				Name:    "NoReplicationEnabled",
+			},
+		},
+		{
+			port:             tu.MongoDBMongosPort,
+			wantID:           "",
+			wantConfigServer: false,
+			wantError: mongo.CommandError{
+				Code:    59,
+				Message: "no such cmd: replSetGetConfig",
+				Labels:  []string(nil),
+				Name:    "CommandNotFound",
+			},
+		},
+		{
+			port:             tu.MongoDBShard1PrimaryPort,
+			wantID:           "rs1",
+			wantConfigServer: false,
+		},
+		{
+			port:             tu.MongoDBConfigsvr1Port,
+			wantID:           "csReplSet",
+			wantConfigServer: true,
+		},
+	}
+
+	for _, tc := range tcs {
+		client, err := tu.TestClient(ctx, tc.port)
+		assert.NoError(t, err)
+
+		rs, err := ReplicasetConfig(ctx, client)
+		assert.Equal(t, tc.wantError, err, fmt.Sprintf("%v", tc.port))
+
+		if tc.wantError != nil {
+			continue
+		}
+
+		assert.Equal(t, tc.wantID, rs.Config.ID)
+		assert.Equal(t, tc.wantConfigServer, rs.Config.ConfigServer)
+		assert.NotEmpty(t, rs.Config.Settings.ReplicaSetID.Hex())
+	}
+}
+
+func TestClusterID(t *testing.T) {
+	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+	defer cancel()
+
+	tcs := []struct {
+		port    string
+		emptyID bool
+	}{
+		{
+			port:    tu.MongoDBMongosPort,
+			emptyID: false,
+		},
+		{
+			port:    tu.MongoDBShard1PrimaryPort,
+			emptyID: false,
+		},
+		{
+			port:    tu.MongoDBShard1Secondary1Port,
+			emptyID: false,
+		},
+		{
+			port:    tu.MongoDBConfigsvr1Port,
+			emptyID: false,
+		},
+		{
+			port:    tu.MongoDBStandalonePort,
+			emptyID: true,
+		},
+	}
+
+	for _, tc := range tcs {
+		client, err := tu.TestClient(ctx, tc.port)
+		assert.NoError(t, err)
+		cid, err := ClusterID(ctx, client)
+		assert.NoError(t, err, fmt.Sprintf("port: %v", tc.port))
+		assert.Equal(t, cid == "", tc.emptyID)
+	}
+}
+
+func TestMyState(t *testing.T) {
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+	defer cancel()
+
+	tcs := []struct {
+		port string
+		want int
+	}{
+		{
+			port: tu.MongoDBShard1PrimaryPort,
+			want: 1,
+		},
+		{
+			port: tu.MongoDBShard1Secondary1Port,
+			want: 2,
+		},
+		{
+			port: tu.MongoDBMongosPort,
+			want: 0,
+		},
+		{
+			port: tu.MongoDBStandalonePort,
+			want: 0,
+		},
+	}
+
+	for _, tc := range tcs {
+		client, err := tu.TestClient(ctx, tc.port)
+		assert.NoError(t, err)
+
+		state, err := MyState(ctx, client)
+		assert.NoError(t, err)
+		assert.Equal(t, tc.want, state, fmt.Sprintf("port: %v", tc.port))
+	}
+}
diff --git a/src/go/pt-k8s-debug-collector/README.md b/src/go/pt-k8s-debug-collector/README.md
new file mode 100644
index 0000000..d39d8da
--- /dev/null
+++ b/src/go/pt-k8s-debug-collector/README.md
@@ -0,0 +1,51 @@
+# Debug collector tool
+
+Collects debug data (logs, resource statuses etc.) from a k8s/OpenShift cluster. Data is packed into the `cluster-dump.tar.gz` archive in the current working directory. 
+
+## Data that will be collected
+
+```
+"pods",
+"replicasets",
+"deployments",
+"statefulsets",
+"replicationcontrollers",
+"events",
+"configmaps",
+"secrets",
+"cronjobs",
+"jobs",
+"podsecuritypolicies",
+"poddisruptionbudgets",
+"perconaxtradbbackups",
+"perconaxtradbclusterbackups",
+"perconaxtradbclusterrestores",
+"perconaxtradbclusters",
+"clusterrolebindings",
+"clusterroles",
+"rolebindings",
+"roles",
+"storageclasses",
+"persistentvolumeclaims",
+"persistentvolumes",
+"modes",
+"your-custom-resource" (depends on 'resource' flag)
+
+## Usage 
+
+`pt-k8s-debug-collector <flags>`
+
+Flags:
+
+`--resource` targeted custom resource name (default "pxc")
+
+`--namespace` targeted namespace. By default data will be collected from all namespaces
+
+`--cluster` targeted pxc/psmdb cluster. By default data from all available clusters to be collected 
+
+## Requirements
+
+- Installed and configured 'kubectl'
+- Installed and configured 'pt-mysql-summary'
+- Installed and configured 'pt-mongodb-summary' 
+
diff --git a/src/go/pt-k8s-debug-collector/dumper/dumper.go b/src/go/pt-k8s-debug-collector/dumper/dumper.go
new file mode 100644
index 0000000..2c2bd68
--- /dev/null
+++ b/src/go/pt-k8s-debug-collector/dumper/dumper.go
@@ -0,0 +1,355 @@
+package dumper
+
+import (
+	"archive/tar"
+	"bytes"
+	"compress/gzip"
+	"encoding/base64"
+	"encoding/json"
+	"fmt"
+	"log"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"strings"
+	"time"
+
+	"github.com/pkg/errors"
+	corev1 "k8s.io/api/core/v1"
+)
+
+// Dumper struct is for dumping cluster
+type Dumper struct {
+	cmd       string
+	resources []string
+	namespace string
+	location  string
+	errors    string
+	mode      int64
+	crType    string
+}
+
+// New return new Dumper object
+func New(location, namespace, resource string) Dumper {
+	resources := []string{
+		"pods",
+		"replicasets",
+		"deployments",
+		"statefulsets",
+		"replicationcontrollers",
+		"events",
+		"configmaps",
+		"secrets",
+		"cronjobs",
+		"jobs",
+		"podsecuritypolicies",
+		"poddisruptionbudgets",
+		"perconaxtradbbackups",
+		"perconaxtradbclusterbackups",
+		"perconaxtradbclusterrestores",
+		"perconaxtradbclusters",
+		"clusterrolebindings",
+		"clusterroles",
+		"rolebindings",
+		"roles",
+		"storageclasses",
+		"persistentvolumeclaims",
+		"persistentvolumes",
+	}
+	if len(resource) > 0 {
+		resources = append(resources, resource)
+	}
+	return Dumper{
+		cmd:       "kubectl",
+		resources: resources,
+		location:  "cluster-dump",
+		mode:      int64(0777),
+		namespace: namespace,
+		crType:    resource,
+	}
+}
+
+type k8sPods struct {
+	Items []corev1.Pod `json:"items"`
+}
+
+type namespaces struct {
+	Items []corev1.Namespace `json:"items"`
+}
+
+// DumpCluster create dump of a cluster in Dumper.location
+func (d *Dumper) DumpCluster() error {
+	file, err := os.Create(d.location + ".tar.gz")
+	if err != nil {
+		return errors.Wrap(err, "create tar file")
+	}
+
+	zr := gzip.NewWriter(file)
+	tw := tar.NewWriter(zr)
+	defer func() {
+		err = addToArchive(d.location+"/errors.txt", d.mode, []byte(d.errors), tw)
+		if err != nil {
+			log.Println("Error: add errors.txt to archive:", err)
+		}
+
+		err = tw.Close()
+		if err != nil {
+			log.Println("close tar writer", err)
+			return
+		}
+		err = zr.Close()
+		if err != nil {
+			log.Println("close gzip writer", err)
+			return
+		}
+		err = file.Close()
+		if err != nil {
+			log.Println("close file", err)
+			return
+		}
+	}()
+
+	var nss namespaces
+
+	if len(d.namespace) > 0 {
+		ns := corev1.Namespace{}
+		ns.Name = d.namespace
+		nss.Items = append(nss.Items, ns)
+	} else {
+		args := []string{"get", "namespaces", "-o", "json"}
+		output, err := d.runCmd(args...)
+		if err != nil {
+			d.logError(err.Error(), args...)
+			return errors.Wrap(err, "get namespaces")
+		}
+
+		err = json.Unmarshal(output, &nss)
+		if err != nil {
+			d.logError(err.Error(), "unmarshal namespaces")
+			return errors.Wrap(err, "unmarshal namespaces")
+		}
+	}
+
+	for _, ns := range nss.Items {
+		args := []string{"get", "pods", "-o", "json", "--namespace", ns.Name}
+		output, err := d.runCmd(args...)
+		if err != nil {
+			d.logError(err.Error(), args...)
+			continue
+		}
+
+		var pods k8sPods
+		err = json.Unmarshal(output, &pods)
+		if err != nil {
+			d.logError(err.Error(), "unmarshal pods from namespace", ns.Name)
+			log.Printf("Error: unmarshal pods in namespace %s: %v", ns.Name, err)
+		}
+
+		for _, pod := range pods.Items {
+			location := filepath.Join(d.location, ns.Name, pod.Name, "logs.txt")
+			args := []string{"logs", pod.Name, "--namespace", ns.Name, "--all-containers"}
+			output, err = d.runCmd(args...)
+			if err != nil {
+				d.logError(err.Error(), args...)
+				err = addToArchive(location, d.mode, []byte(err.Error()), tw)
+				if err != nil {
+					log.Printf("Error: create archive with logs for pod %s in namespace %s: %v", pod.Name, ns.Name, err)
+				}
+				continue
+			}
+			err = addToArchive(location, d.mode, output, tw)
+			if err != nil {
+				d.logError(err.Error(), "create archive for pod "+pod.Name)
+				log.Printf("Error: create archive for pod %s: %v", pod.Name, err)
+			}
+			if len(pod.Labels) == 0 {
+				continue
+			}
+			location = filepath.Join(d.location, ns.Name, pod.Name, "/pt-summary.txt")
+			component := d.crType
+			if d.crType == "psmdb" {
+				component = "mongod"
+			}
+			if pod.Labels["app.kubernetes.io/component"] == component {
+				output, err = d.getPodSummary(d.crType, pod.Name, pod.Labels["app.kubernetes.io/instance"], tw)
+				if err != nil {
+					d.logError(err.Error(), d.crType, pod.Name)
+					err = addToArchive(location, d.mode, []byte(err.Error()), tw)
+					if err != nil {
+						log.Printf("Error: create pt-summary errors archive for pod %s in namespace %s: %v", pod.Name, ns.Name, err)
+					}
+					continue
+				}
+				err = addToArchive(location, d.mode, output, tw)
+				if err != nil {
+					d.logError(err.Error(), "create pt-summary archive for pod "+pod.Name)
+					log.Printf("Error: create pt-summary  archive for pod %s: %v", pod.Name, err)
+				}
+			}
+		}
+
+		for _, resource := range d.resources {
+			err = d.getResource(resource, ns.Name, tw)
+			if err != nil {
+				log.Printf("Error: get %s resource: %v", resource, err)
+			}
+		}
+	}
+
+	err = d.getResource("nodes", "", tw)
+	if err != nil {
+		return errors.Wrapf(err, "get nodes")
+	}
+
+	return nil
+}
+
+// runCmd run command (Dumper.cmd) with given args, return it output
+func (d *Dumper) runCmd(args ...string) ([]byte, error) {
+	var outb, errb bytes.Buffer
+	cmd := exec.Command(d.cmd, args...)
+	cmd.Stdout = &outb
+	cmd.Stderr = &errb
+	err := cmd.Run()
+	if err != nil || errb.Len() > 0 {
+		return nil, errors.Errorf("error: %v, stderr: %s, stdout: %s", err, errb.String(), outb.String())
+	}
+
+	return outb.Bytes(), nil
+}
+
+func (d *Dumper) getResource(name, namespace string, tw *tar.Writer) error {
+	location := d.location
+	args := []string{"get", name, "-o", "yaml"}
+	if len(namespace) > 0 {
+		args = append(args, "--namespace", namespace)
+		location = filepath.Join(d.location, namespace)
+	}
+	location = filepath.Join(location, name+".yaml")
+	output, err := d.runCmd(args...)
+	if err != nil {
+		d.logError(err.Error(), args...)
+		log.Printf("Error: get resource %s in namespace %s: %v", name, namespace, err)
+		return addToArchive(location, d.mode, []byte(err.Error()), tw)
+	}
+
+	return addToArchive(location, d.mode, output, tw)
+}
+
+func (d *Dumper) logError(err string, args ...string) {
+	d.errors += d.cmd + " " + strings.Join(args, " ") + ": " + err + "\n"
+}
+
+func addToArchive(location string, mode int64, content []byte, tw *tar.Writer) error {
+	hdr := &tar.Header{
+		Name: location,
+		Mode: mode,
+		Size: int64(len(content)),
+	}
+	if err := tw.WriteHeader(hdr); err != nil {
+		return errors.Wrapf(err, "write header to %s", location)
+	}
+	if _, err := tw.Write(content); err != nil {
+		return errors.Wrapf(err, "write content to %s", location)
+	}
+
+	return nil
+}
+
+type crSecrets struct {
+	Spec struct {
+		SecretName string `json:"secretsName,omitempty"`
+		Secrets    struct {
+			Users string `json:"users,omitempty"`
+		} `json:"secrets,omitempty"`
+	} `json:"spec"`
+}
+
+func (d *Dumper) getPodSummary(resource, podName, crName string, tw *tar.Writer) ([]byte, error) {
+	var (
+		summCmdName string
+		ports       string
+		summCmdArgs []string
+	)
+
+	switch resource {
+	case "pxc":
+		cr, err := d.getCR("pxc/" + crName)
+		if err != nil {
+			return nil, errors.Wrap(err, "get cr")
+		}
+		pass, err := d.getDataFromSecret(cr.Spec.SecretName, "root")
+		if err != nil {
+			return nil, errors.Wrap(err, "get password from pxc users secret")
+		}
+		ports = "3306:3306"
+		summCmdName = "pt-mysql-summary"
+		summCmdArgs = []string{"--host=127.0.0.1", "--port=3306", "--user=root", "--password=" + string(pass)}
+	case "psmdb":
+		cr, err := d.getCR("psmdb/" + crName)
+		if err != nil {
+			return nil, errors.Wrap(err, "get cr")
+		}
+		pass, err := d.getDataFromSecret(cr.Spec.Secrets.Users, "MONGODB_CLUSTER_ADMIN_PASSWORD")
+		if err != nil {
+			return nil, errors.Wrap(err, "get password from psmdb users secret")
+		}
+		ports = "27017:27017"
+		summCmdName = "pt-mongodb-summary"
+		summCmdArgs = []string{"--username=clusterAdmin", "--password=" + pass, "--authenticationDatabase=admin", "127.0.0.1:27017"}
+	}
+
+	cmdPortFwd := exec.Command(d.cmd, "port-forward", "pod/"+podName, ports)
+	go func() {
+		err := cmdPortFwd.Run()
+		if err != nil {
+			d.logError(err.Error(), "port-forward")
+		}
+	}()
+	defer func() {
+		err := cmdPortFwd.Process.Kill()
+		if err != nil {
+			d.logError(err.Error(), "kill port-forward")
+		}
+	}()
+
+	time.Sleep(3 * time.Second) // wait for port-forward command
+
+	var outb, errb bytes.Buffer
+	cmd := exec.Command(summCmdName, summCmdArgs...)
+	cmd.Stdout = &outb
+	cmd.Stderr = &errb
+	err := cmd.Run()
+	if err != nil {
+		return nil, errors.Errorf("error: %v, stderr: %s, stdout: %s", err, errb.String(), outb.String())
+	}
+
+	return []byte(fmt.Sprintf("stderr: %s, stdout: %s", errb.String(), outb.String())), nil
+}
+
+func (d *Dumper) getCR(crName string) (crSecrets, error) {
+	var cr crSecrets
+	output, err := d.runCmd("get", crName, "-o", "json")
+	if err != nil {
+		return cr, errors.Wrap(err, "get "+crName)
+	}
+	err = json.Unmarshal(output, &cr)
+	if err != nil {
+		return cr, errors.Wrap(err, "unmarshal psmdb cr")
+	}
+
+	return cr, nil
+}
+
+func (d *Dumper) getDataFromSecret(secretName, dataName string) (string, error) {
+	passEncoded, err := d.runCmd("get", "secrets/"+secretName, "--template={{.data."+dataName+"}}")
+	if err != nil {
+		return "", errors.Wrap(err, "run get secret cmd")
+	}
+	pass, err := base64.StdEncoding.DecodeString(string(passEncoded))
+	if err != nil {
+		return "", errors.Wrap(err, "decode data")
+	}
+
+	return string(pass), nil
+}
diff --git a/src/go/pt-k8s-debug-collector/main.go b/src/go/pt-k8s-debug-collector/main.go
new file mode 100644
index 0000000..39e692f
--- /dev/null
+++ b/src/go/pt-k8s-debug-collector/main.go
@@ -0,0 +1,35 @@
+package main
+
+import (
+	"flag"
+	"log"
+	"os"
+
+	"github.com/percona/percona-toolkit/src/go/pt-k8s-debug-collector/dumper"
+)
+
+func main() {
+	namespace := ""
+	resource := ""
+	clusterName := ""
+
+	flag.StringVar(&namespace, "namespace", "", "Namespace for collecting data. If empty data will be collected from all namespaces")
+	flag.StringVar(&resource, "resource", "pxc", "Resource name. Default value - 'pxc'")
+	flag.StringVar(&clusterName, "cluster", "", "Cluster name")
+	flag.Parse()
+
+	if len(clusterName) > 0 {
+		resource += "/" + clusterName
+	}
+
+	d := dumper.New("", namespace, resource)
+	log.Println("Start collecting cluster data")
+
+	err := d.DumpCluster()
+	if err != nil {
+		log.Println("Error:", err)
+		os.Exit(1)
+	}
+
+	log.Println("Done")
+}
diff --git a/src/go/pt-mongodb-query-digest/main.go b/src/go/pt-mongodb-query-digest/main.go
index 09dbcf8..a2c193f 100644
--- a/src/go/pt-mongodb-query-digest/main.go
+++ b/src/go/pt-mongodb-query-digest/main.go
@@ -40,7 +40,7 @@ const (
 var (
 	Build     string = "2020-04-23" //nolint
 	GoVersion string = "1.14.1"     //nolint
-	Version   string = "3.2.0"      //nolint
+	Version   string = "3.3.1"      //nolint
 	Commit    string                //nolint
 )
 
@@ -70,7 +70,6 @@ type report struct {
 }
 
 func main() {
-
 	opts, err := getOptions()
 	if err != nil {
 		log.Errorf("error processing command line arguments: %s", err)
@@ -193,7 +192,6 @@ func main() {
 	}
 
 	fmt.Println(string(out))
-
 }
 
 func formatResults(rep report, outputFormat string) ([]byte, error) {
@@ -368,7 +366,6 @@ func getHeaders(opts *cliOptions) []string {
 }
 
 func getQueryTemplate() string {
-
 	t := `
 # Query {{.Rank}}: {{printf "% 0.2f" .QPS}} QPS, ID {{.ID}}
 # Ratio {{Format .Ratio 7.2}} (docs scanned/returned)
@@ -522,7 +519,6 @@ func sortQueries(queries []stats.QueryStats, orderby []string) []stats.QueryStat
 
 	OrderedBy(sortFuncs...).Sort(queries)
 	return queries
-
 }
 
 func isProfilerEnabled(ctx context.Context, clientOptions *options.ClientOptions) (bool, error) {
diff --git a/src/go/pt-mongodb-query-digest/main_test.go b/src/go/pt-mongodb-query-digest/main_test.go
index 3c69317..18b0cd4 100644
--- a/src/go/pt-mongodb-query-digest/main_test.go
+++ b/src/go/pt-mongodb-query-digest/main_test.go
@@ -1,6 +1,6 @@
 package main
 
-//TODO: Rewrite tests to use the new sandbox
+// TODO: Rewrite tests to use the new sandbox
 
 // const (
 // 	samples = "/src/go/tests/"
diff --git a/src/go/pt-mongodb-summary/.gitignore b/src/go/pt-mongodb-summary/.gitignore
new file mode 100644
index 0000000..32341ff
--- /dev/null
+++ b/src/go/pt-mongodb-summary/.gitignore
@@ -0,0 +1,12 @@
+pt-mongodb-summary
+pt-mongodb-summary_darwin_amd64
+pt-mongodb-summary_freebsd_386
+pt-mongodb-summary_freebsd_amd64
+pt-mongodb-summary_linux_386
+pt-mongodb-summary_linux_amd64
+pt-mongodb-summary_linux_arm
+pt-mongodb-summary_windows_386.exe
+pt-mongodb-summary_windows_amd64.exe
+coverage.out
+vendor/*
+!vendor/vendor.json
diff --git a/src/go/pt-mongodb-summary/main.go b/src/go/pt-mongodb-summary/main.go
index 1c443d6..d1bb0c3 100644
--- a/src/go/pt-mongodb-summary/main.go
+++ b/src/go/pt-mongodb-summary/main.go
@@ -3,11 +3,16 @@ package main
 import (
 	"bytes"
 	"context"
+	"crypto/tls"
+	"crypto/x509"
 	"encoding/json"
 	"fmt"
 	"html/template"
+	"io/ioutil"
 	"net"
 	"os"
+	"os/user"
+	"path/filepath"
 	"strings"
 	"time"
 
@@ -39,18 +44,23 @@ const (
 	DefaultOutputFormat       = "text"
 	typeMongos                = "mongos"
 
-	// Exit Codes
+	// Exit Codes.
 	cannotFormatResults              = 1
 	cannotParseCommandLineParameters = 2
 	cannotGetHostInfo                = 3
-	cannotGetReplicasetMembers       = 4
+	cannotGetClientOptions           = 4
+	cannotConnectToMongoDB           = 5
 )
 
+//nolint:gochecknoglobals
 var (
-	Build     string = "2020-04-23" // nolint
-	GoVersion string = "1.14.1"     // nolint
-	Version   string = "3.2.0"
+	Build     string = "2020-04-23"
+	GoVersion string = "1.14.1"
+	Version   string = "3.3.1"
 	Commit    string
+
+	defaultConnectionTimeout = 3 * time.Second
+	directConnection         = true
 )
 
 type TimedStats struct {
@@ -69,6 +79,7 @@ type opCounters struct {
 	Command    TimedStats
 	SampleRate time.Duration
 }
+
 type hostInfo struct {
 	Hostname          string
 	HostOsType        string
@@ -164,14 +175,11 @@ func main() {
 	opts, err := parseFlags()
 	if err != nil {
 		log.Errorf("cannot get parameters: %s", err.Error())
+
 		os.Exit(cannotParseCommandLineParameters)
 	}
-	if opts == nil && err == nil {
-		return
-	}
 
-	if opts.Help {
-		getopt.Usage()
+	if opts == nil && err == nil {
 		return
 	}
 
@@ -187,6 +195,7 @@ func main() {
 		fmt.Printf("Version %s\n", Version)
 		fmt.Printf("Build: %s using %s\n", Build, GoVersion)
 		fmt.Printf("Commit: %s\n", Commit)
+
 		return
 	}
 
@@ -201,34 +210,46 @@ func main() {
 	}
 
 	ctx := context.Background()
-	clientOptions := getClientOptions(opts)
+	clientOptions, err := getClientOptions(opts)
+	if err != nil {
+		log.Error(err)
+
+		os.Exit(cannotGetClientOptions)
+	}
+
 	client, err := mongo.NewClient(clientOptions)
 	if err != nil {
-		log.Fatalf("Cannot get a MongoDB client: %s", err)
+		log.Errorf("Cannot get a MongoDB client: %s", err)
+
+		os.Exit(cannotConnectToMongoDB)
 	}
+
 	if err := client.Connect(ctx); err != nil {
-		log.Fatalf("Cannot connect to MongoDB: %s", err)
+		log.Errorf("Cannot connect to MongoDB: %s", err)
+		os.Exit(cannotConnectToMongoDB)
 	}
+
 	defer client.Disconnect(ctx) // nolint
 
 	hostnames, err := util.GetHostnames(ctx, client)
 	if err != nil && errors.Is(err, util.ShardingNotEnabledError) {
 		log.Errorf("Cannot get hostnames: %s", err)
 	}
+
 	log.Debugf("hostnames: %v", hostnames)
 
 	ci := &collectedInfo{}
 
 	ci.HostInfo, err = getHostInfo(ctx, client)
 	if err != nil {
-		message := fmt.Sprintf("Cannot get host info for %q: %s", opts.Host, err.Error())
-		log.Errorf(message)
-		os.Exit(cannotGetHostInfo)
+		log.Errorf("Cannot get host info for %q: %s", opts.Host, err)
+		os.Exit(cannotGetHostInfo) //nolint:gocritic
 	}
 
 	if ci.ReplicaMembers, err = util.GetReplicasetMembers(ctx, clientOptions); err != nil {
 		log.Warnf("[Error] cannot get replicaset members: %v\n", err)
 	}
+
 	log.Debugf("replicaMembers:\n%+v\n", ci.ReplicaMembers)
 
 	if opts.RunningOpsSamples > 0 && opts.RunningOpsInterval > 0 {
@@ -274,9 +295,10 @@ func main() {
 
 	out, err := formatResults(ci, opts.OutputFormat)
 	if err != nil {
-		log.Errorf("Cannot format the results: %s", err.Error())
+		log.Errorf("Cannot format the results: %s", err)
 		os.Exit(cannotFormatResults)
 	}
+
 	fmt.Println(string(out))
 }
 
@@ -287,8 +309,9 @@ func formatResults(ci *collectedInfo, format string) ([]byte, error) {
 	case "json":
 		b, err := json.MarshalIndent(ci, "", "    ")
 		if err != nil {
-			return nil, fmt.Errorf("[Error] Cannot convert results to json: %s", err.Error())
+			return nil, errors.Wrap(err, "Cannot convert results to json")
 		}
+
 		buf = bytes.NewBuffer(b)
 	default:
 		buf = new(bytes.Buffer)
@@ -338,6 +361,7 @@ func getHostInfo(ctx context.Context, client *mongo.Client) (*hostInfo, error) {
 	hi := proto.HostInfo{}
 	if err := client.Database("admin").RunCommand(ctx, primitive.M{"hostInfo": 1}).Decode(&hi); err != nil {
 		log.Debugf("run('hostInfo') error: %s", err)
+
 		return nil, errors.Wrap(err, "GetHostInfo.hostInfo")
 	}
 
@@ -393,12 +417,15 @@ func countMongodProcesses() (int, error) {
 	if err != nil {
 		return 0, err
 	}
+
 	count := 0
+
 	for _, pid := range pids {
 		p, err := process.NewProcess(pid)
 		if err != nil {
 			continue
 		}
+
 		if name, _ := p.Name(); name == "mongod" || name == typeMongos {
 			count++
 		}
@@ -440,6 +467,7 @@ func getClusterwideInfo(ctx context.Context, client *mongo.Client) (*clusterwide
 			if collStats.Sharded {
 				cwi.ShardedDataSize += collStats.Size
 				cwi.ShardedColsCount++
+
 				continue
 			}
 
@@ -464,11 +492,14 @@ func sizeAndUnit(size int64) (float64, string) {
 	unit := []string{"bytes", "KB", "MB", "GB", "TB"}
 	idx := 0
 	newSize := float64(size)
+
 	for newSize > 1024 {
 		newSize /= 1024
 		idx++
 	}
+
 	newSize = float64(int64(newSize*100)) / 100
+
 	return newSize, unit[idx]
 }
 
@@ -486,7 +517,10 @@ func getSecuritySettings(ctx context.Context, client *mongo.Client, ver string)
 	}
 
 	cmdOpts := proto.CommandLineOptions{}
-	err = client.Database("admin").RunCommand(ctx, primitive.D{{"getCmdLineOpts", 1}, {"recordStats", 1}}).Decode(&cmdOpts)
+	err = client.Database("admin").RunCommand(ctx, primitive.D{
+		{Key: "getCmdLineOpts", Value: 1},
+		{Key: "recordStats", Value: 1},
+	}).Decode(&cmdOpts)
 	if err != nil {
 		return nil, errors.Wrap(err, "cannot get command line options")
 	}
@@ -503,7 +537,7 @@ func getSecuritySettings(ctx context.Context, client *mongo.Client, ver string)
 	s.BindIP = cmdOpts.Parsed.Net.BindIP
 	s.Port = cmdOpts.Parsed.Net.Port
 
-	if cmdOpts.Parsed.Net.BindIP == "" {
+	if cmdOpts.Parsed.Net.BindIP == "" { //nolint:nestif
 		if prior26 {
 			s.WarningMsgs = append(s.WarningMsgs, "WARNING: You might be insecure. There is no IP binding")
 		}
@@ -586,7 +620,11 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int,
 	// count + 1 because we need 1st reading to stablish a base to measure variation
 	for i := 0; i < count+1; i++ {
 		<-ticker.C
-		err := client.Database("admin").RunCommand(ctx, primitive.D{{"serverStatus", 1}, {"recordStats", 1}}).Decode(&ss)
+
+		err := client.Database("admin").RunCommand(ctx, primitive.D{
+			{Key: "serverStatus", Value: 1},
+			{Key: "recordStats", Value: 1},
+		}).Decode(&ss)
 		if err != nil {
 			return nil, err
 		}
@@ -598,6 +636,7 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int,
 			prevOpCount.Insert.Total = ss.Opcounters.Insert
 			prevOpCount.Query.Total = ss.Opcounters.Query
 			prevOpCount.Update.Total = ss.Opcounters.Update
+
 			continue
 		}
 
@@ -631,57 +670,63 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int,
 		}
 
 		// Insert --------------------------------------
-		if delta.Opcounters.Insert > oc.Insert.Max {
+		switch {
+		case delta.Opcounters.Insert > oc.Insert.Max:
 			oc.Insert.Max = delta.Opcounters.Insert
-		}
-		if delta.Opcounters.Insert < oc.Insert.Min {
+		case delta.Opcounters.Insert < oc.Insert.Min:
 			oc.Insert.Min = delta.Opcounters.Insert
 		}
+
 		oc.Insert.Total += delta.Opcounters.Insert
 
 		// Query ---------------------------------------
-		if delta.Opcounters.Query > oc.Query.Max {
+		switch {
+		case delta.Opcounters.Query > oc.Query.Max:
 			oc.Query.Max = delta.Opcounters.Query
-		}
-		if delta.Opcounters.Query < oc.Query.Min {
+		case delta.Opcounters.Query < oc.Query.Min:
 			oc.Query.Min = delta.Opcounters.Query
 		}
+
 		oc.Query.Total += delta.Opcounters.Query
 
 		// Command -------------------------------------
-		if delta.Opcounters.Command > oc.Command.Max {
+		switch {
+		case delta.Opcounters.Command > oc.Command.Max:
 			oc.Command.Max = delta.Opcounters.Command
-		}
-		if delta.Opcounters.Command < oc.Command.Min {
+		case delta.Opcounters.Command < oc.Command.Min:
 			oc.Command.Min = delta.Opcounters.Command
 		}
+
 		oc.Command.Total += delta.Opcounters.Command
 
 		// Update --------------------------------------
-		if delta.Opcounters.Update > oc.Update.Max {
+		switch {
+		case delta.Opcounters.Update > oc.Update.Max:
 			oc.Update.Max = delta.Opcounters.Update
-		}
-		if delta.Opcounters.Update < oc.Update.Min {
+		case delta.Opcounters.Update < oc.Update.Min:
 			oc.Update.Min = delta.Opcounters.Update
 		}
+
 		oc.Update.Total += delta.Opcounters.Update
 
 		// Delete --------------------------------------
-		if delta.Opcounters.Delete > oc.Delete.Max {
+		switch {
+		case delta.Opcounters.Delete > oc.Delete.Max:
 			oc.Delete.Max = delta.Opcounters.Delete
-		}
-		if delta.Opcounters.Delete < oc.Delete.Min {
+		case delta.Opcounters.Delete < oc.Delete.Min:
 			oc.Delete.Min = delta.Opcounters.Delete
 		}
+
 		oc.Delete.Total += delta.Opcounters.Delete
 
 		// GetMore -------------------------------------
-		if delta.Opcounters.GetMore > oc.GetMore.Max {
+		switch {
+		case delta.Opcounters.GetMore > oc.GetMore.Max:
 			oc.GetMore.Max = delta.Opcounters.GetMore
-		}
-		if delta.Opcounters.GetMore < oc.GetMore.Min {
+		case delta.Opcounters.GetMore < oc.GetMore.Min:
 			oc.GetMore.Min = delta.Opcounters.GetMore
 		}
+
 		oc.GetMore.Total += delta.Opcounters.GetMore
 
 		prevOpCount.Insert.Total = ss.Opcounters.Insert
@@ -690,8 +735,8 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int,
 		prevOpCount.Update.Total = ss.Opcounters.Update
 		prevOpCount.Delete.Total = ss.Opcounters.Delete
 		prevOpCount.GetMore.Total = ss.Opcounters.GetMore
-
 	}
+
 	ticker.Stop()
 
 	oc.Insert.Avg = oc.Insert.Total
@@ -707,11 +752,12 @@ func getOpCountersStats(ctx context.Context, client *mongo.Client, count int,
 }
 
 func getProcInfo(pid int32, templateData *procInfo) error {
-	//proc, err := process.NewProcess(templateData.ServerStatus.Pid)
+	// proc, err := process.NewProcess(templateData.ServerStatus.Pid)
 	proc, err := process.NewProcess(pid)
 	if err != nil {
-		return fmt.Errorf("cannot get process %d", pid)
+		return errors.New(fmt.Sprintf("cannot get process %d", pid))
 	}
+
 	ct, err := proc.CreateTime()
 	if err != nil {
 		return err
@@ -742,6 +788,7 @@ func GetBalancerStats(ctx context.Context, client *mongo.Client) (*proto.Balance
 		event := item.Id.Event
 		note := item.Id.Note
 		count := item.Count
+
 		switch event {
 		case "moveChunk.to", "moveChunk.from", "moveChunk.commit":
 			if note == "success" || note == "" {
@@ -760,7 +807,7 @@ func GetBalancerStats(ctx context.Context, client *mongo.Client) (*proto.Balance
 }
 
 func GetShardingChangelogStatus(ctx context.Context, client *mongo.Client) (*proto.ShardingChangelogStats, error) {
-	var qresults []proto.ShardingChangelogSummary
+	qresults := []proto.ShardingChangelogSummary{}
 	coll := client.Database("config").Collection("changelog")
 	match := primitive.M{"time": primitive.M{"$gt": time.Now().Add(-240 * time.Hour)}}
 	group := primitive.M{"_id": primitive.M{"event": "$what", "note": "$details.note"}, "count": primitive.M{"$sum": 1}}
@@ -776,6 +823,7 @@ func GetShardingChangelogStatus(ctx context.Context, client *mongo.Client) (*pro
 		if err := cursor.Decode(&res); err != nil {
 			return nil, errors.Wrap(err, "cannot decode GetShardingChangelogStatus")
 		}
+
 		qresults = append(qresults, res)
 	}
 
@@ -796,6 +844,7 @@ func isPrivateNetwork(ip string) (bool, error) {
 		if err != nil {
 			return false, err
 		}
+
 		addr := net.ParseIP(ip)
 		if cidrnet.Contains(addr) {
 			return true, nil
@@ -803,7 +852,6 @@ func isPrivateNetwork(ip string) (bool, error) {
 	}
 
 	return false, nil
-
 }
 
 func externalIP() (string, error) {
@@ -811,17 +859,21 @@ func externalIP() (string, error) {
 	if err != nil {
 		return "", err
 	}
+
 	for _, iface := range ifaces {
 		if iface.Flags&net.FlagUp == 0 {
 			continue // interface down
 		}
+
 		if iface.Flags&net.FlagLoopback != 0 {
 			continue // loopback interface
 		}
+
 		addrs, err := iface.Addrs()
 		if err != nil {
 			return "", err
 		}
+
 		for _, addr := range addrs {
 			var ip net.IP
 			switch v := addr.(type) {
@@ -830,9 +882,11 @@ func externalIP() (string, error) {
 			case *net.IPAddr:
 				ip = v.IP
 			}
+
 			if ip == nil || ip.IsLoopback() {
 				continue
 			}
+
 			ip = ip.To4()
 			if ip == nil {
 				continue // not an ipv4 address
@@ -840,6 +894,7 @@ func externalIP() (string, error) {
 			return ip.String(), nil
 		}
 	}
+
 	return "", errors.New("are you connected to the network?")
 }
 
@@ -880,8 +935,8 @@ func parseFlags() (*cliOptions, error) {
 	gop.StringVarLong(&opts.SSLPEMKeyFile, "sslPEMKeyFile", 0, "SSL client PEM file used for authentication")
 
 	gop.SetParameters("host[:port]")
-
 	gop.Parse(os.Args)
+
 	if gop.NArgs() > 0 {
 		opts.Host = gop.Arg(0)
 		gop.Parse(gop.Args())
@@ -889,19 +944,25 @@ func parseFlags() (*cliOptions, error) {
 
 	if gop.IsSet("password") && opts.Password == "" {
 		print("Password: ")
+
 		pass, err := gopass.GetPasswd()
 		if err != nil {
 			return opts, err
 		}
+
 		opts.Password = string(pass)
 	}
+
 	if !strings.HasPrefix(opts.Host, "mongodb://") {
 		opts.Host = "mongodb://" + opts.Host
 	}
+
 	if opts.Help {
 		gop.PrintUsage(os.Stdout)
+
 		return nil, nil
 	}
+
 	if opts.OutputFormat != "json" && opts.OutputFormat != "text" {
 		log.Infof("Invalid output format '%s'. Using text format", opts.OutputFormat)
 	}
@@ -920,27 +981,93 @@ func getChunksCount(ctx context.Context, client *mongo.Client) ([]proto.ChunksBy
 	if err != nil {
 		return nil, err
 	}
+
 	for cursor.Next(ctx) {
 		res := proto.ChunksByCollection{}
 		if err := cursor.Decode(&res); err != nil {
 			return nil, errors.Wrap(err, "cannot decode chunks aggregation")
 		}
+
 		result = append(result, res)
 	}
+
 	return result, nil
 }
 
-func getClientOptions(opts *cliOptions) *options.ClientOptions {
+func getClientOptions(opts *cliOptions) (*options.ClientOptions, error) {
 	clientOptions := options.Client().ApplyURI(opts.Host)
+
+	clientOptions.ServerSelectionTimeout = &defaultConnectionTimeout
+	clientOptions.Direct = &directConnection
 	credential := options.Credential{}
 	if opts.User != "" {
 		credential.Username = opts.User
 		clientOptions.SetAuth(credential)
 	}
+
 	if opts.Password != "" {
 		credential.Password = opts.Password
 		credential.PasswordSet = true
 		clientOptions.SetAuth(credential)
 	}
-	return clientOptions
+
+	if opts.SSLPEMKeyFile != "" || opts.SSLCAFile != "" {
+		tlsConfig, err := getTLSConfig(opts.SSLPEMKeyFile, opts.SSLCAFile)
+		if err != nil {
+			return nil, errors.Wrap(err, "cannot read SSL certificate files")
+		}
+
+		clientOptions.TLSConfig = tlsConfig
+	}
+
+	return clientOptions, nil
+}
+
+func getTLSConfig(sslPEMKeyFile, sslCAFile string) (*tls.Config, error) {
+	tlsConfig := &tls.Config{
+		MinVersion:         tls.VersionTLS10,
+		InsecureSkipVerify: true,
+	}
+
+	roots := x509.NewCertPool()
+
+	if sslPEMKeyFile != "" {
+		crt, err := ioutil.ReadFile(filepath.Clean(expandHome(sslPEMKeyFile)))
+		if err != nil {
+			return nil, err
+		}
+
+		cert, err := tls.X509KeyPair(crt, crt)
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		tlsConfig.Certificates = []tls.Certificate{cert}
+	}
+
+	if sslCAFile != "" {
+		ca, err := ioutil.ReadFile(filepath.Clean(expandHome(sslCAFile)))
+		if err != nil {
+			return nil, err
+		}
+
+		roots.AppendCertsFromPEM(ca)
+		tlsConfig.RootCAs = roots
+	}
+
+	return tlsConfig, nil
+}
+
+func expandHome(path string) string {
+	usr, _ := user.Current()
+	dir := usr.HomeDir
+
+	switch {
+	case path == "~":
+		path = dir
+	case strings.HasPrefix(path, "~/"):
+		path = filepath.Join(dir, path[2:])
+	}
+
+	return path
 }
diff --git a/src/go/pt-mongodb-summary/main_test.go b/src/go/pt-mongodb-summary/main_test.go
index cb3cf3d..0b1af40 100644
--- a/src/go/pt-mongodb-summary/main_test.go
+++ b/src/go/pt-mongodb-summary/main_test.go
@@ -99,8 +99,8 @@ func TestClusterWideInfo(t *testing.T) {
 			}
 		})
 	}
-
 }
+
 func addToCounters(ss proto.ServerStatus, increment int64) proto.ServerStatus {
 	ss.Opcounters.Command += increment
 	ss.Opcounters.Delete += increment
diff --git a/src/go/pt-mongodb-summary/oplog/oplog.go b/src/go/pt-mongodb-summary/oplog/oplog.go
index 1f276d4..f8807c5 100644
--- a/src/go/pt-mongodb-summary/oplog/oplog.go
+++ b/src/go/pt-mongodb-summary/oplog/oplog.go
@@ -85,7 +85,6 @@ func GetOplogInfo(ctx context.Context, hostnames []string, co *options.ClientOpt
 
 	sort.Sort(results)
 	return results, nil
-
 }
 
 func getOplogCollection(ctx context.Context, client *mongo.Client) (string, error) {
diff --git a/src/go/pt-pg-summary/.gitignore b/src/go/pt-pg-summary/.gitignore
new file mode 100644
index 0000000..1521c8b
--- /dev/null
+++ b/src/go/pt-pg-summary/.gitignore
@@ -0,0 +1 @@
+dist
diff --git a/src/go/pt-pg-summary/main.go b/src/go/pt-pg-summary/main.go
index 7d21b59..ebfc5e8 100644
--- a/src/go/pt-pg-summary/main.go
+++ b/src/go/pt-pg-summary/main.go
@@ -21,7 +21,7 @@ var (
 	Build     string = "2020-04-23" //nolint
 	Commit    string                //nolint
 	GoVersion string = "1.14.1"     //nolint
-	Version   string = "3.2.0"      //nolint
+	Version   string = "3.3.1"      //nolint
 )
 
 type connOpts struct {
@@ -31,6 +31,7 @@ type connOpts struct {
 	Password   string
 	DisableSSL bool
 }
+
 type cliOptions struct {
 	app                 *kingpin.Application
 	connOpts            connOpts
@@ -110,7 +111,6 @@ func main() {
 	if err := masterTmpl.ExecuteTemplate(os.Stdout, "report", info); err != nil {
 		log.Fatal(err)
 	}
-
 }
 
 func connect(dsn string) (*sql.DB, error) {
@@ -131,29 +131,29 @@ func funcsMap() template.FuncMap {
 			if len(s) < size {
 				return s
 			}
-			return s[:size]+"..."
+			return s[:size] + "..."
+		},
+		"convertnullstring": func(s sql.NullString) string {
+			if s.Valid {
+				return s.String
+			} else {
+				return ""
+			}
+		},
+		"convertnullint64": func(s sql.NullInt64) int64 {
+			if s.Valid {
+				return s.Int64
+			} else {
+				return 0
+			}
+		},
+		"convertnullfloat64": func(s sql.NullFloat64) float64 {
+			if s.Valid {
+				return s.Float64
+			} else {
+				return 0.0
+			}
 		},
-        "convertnullstring": func(s sql.NullString) string {
-            if s.Valid {
-                return s.String
-            } else {
-                return ""
-            }
-        },
-        "convertnullint64": func(s sql.NullInt64) int64 {
-            if s.Valid {
-                return s.Int64
-            } else {
-                return 0
-            }
-        },
-        "convertnullfloat64": func(s sql.NullFloat64) float64 {
-            if s.Valid {
-                return s.Float64
-            } else {
-                return 0.0
-            }
-        },
 	}
 }
 
diff --git a/src/go/pt-pg-summary/main_test.go b/src/go/pt-pg-summary/main_test.go
index c2e8926..6afabbc 100644
--- a/src/go/pt-pg-summary/main_test.go
+++ b/src/go/pt-pg-summary/main_test.go
@@ -5,8 +5,8 @@ import (
 	"os"
 	"testing"
 
-	"github.com/percona/percona-toolkit/src/go/pt-pg-summary/internal/tu"
 	"github.com/percona/percona-toolkit/src/go/lib/pginfo"
+	"github.com/percona/percona-toolkit/src/go/pt-pg-summary/internal/tu"
 
 	"github.com/sirupsen/logrus"
 )
@@ -37,7 +37,7 @@ func TestConnection(t *testing.T) {
 	// use an "external" IP to simulate a remote host
 	tests := append(tests, Test{"remote_host", tu.PG9DockerIP, tu.DefaultPGPort, tu.Username, tu.Password})
 	// use IPV6 for PostgreSQL 9
-	//tests := append(tests, Test{"IPV6", tu.IPv6Host, tu.IPv6PG9Port, tu.Username, tu.Password})
+	// tests := append(tests, Test{"IPV6", tu.IPv6Host, tu.IPv6PG9Port, tu.Username, tu.Password})
 	for _, test := range tests {
 		test := test
 		t.Run(test.name, func(t *testing.T) {
@@ -48,16 +48,15 @@ func TestConnection(t *testing.T) {
 			}
 		})
 	}
-
 }
 
 func TestNewWithLogger(t *testing.T) {
-    for _, test := range tests {
+	for _, test := range tests {
 		test := test
 		t.Run(test.name, func(t *testing.T) {
 			dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s sslmode=disable dbname=%s",
 				test.host, test.port, test.username, test.password, "postgres")
-			db, err := connect(dsn);
+			db, err := connect(dsn)
 			if err != nil {
 				t.Errorf("Cannot connect to the db using %q: %s", dsn, err)
 			}
@@ -65,21 +64,20 @@ func TestNewWithLogger(t *testing.T) {
 				t.Errorf("Cannot run NewWithLogger using %q: %s", dsn, err)
 			}
 		})
-    }
+	}
 }
 
-
 func TestCollectGlobalInfo(t *testing.T) {
-    for _, test := range tests {
+	for _, test := range tests {
 		test := test
 		t.Run(test.name, func(t *testing.T) {
 			dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s sslmode=disable dbname=%s",
 				test.host, test.port, test.username, test.password, "postgres")
-			db, err := connect(dsn);
+			db, err := connect(dsn)
 			if err != nil {
 				t.Errorf("Cannot connect to the db using %q: %s", dsn, err)
 			}
-			info, err := pginfo.NewWithLogger(db, nil, 30, logger);
+			info, err := pginfo.NewWithLogger(db, nil, 30, logger)
 			if err != nil {
 				t.Errorf("Cannot run NewWithLogger using %q: %s", dsn, err)
 			}
@@ -92,27 +90,27 @@ func TestCollectGlobalInfo(t *testing.T) {
 				t.Errorf("Cannot collect global information using %q", dsn)
 			}
 		})
-    }
+	}
 }
 
 func TestCollectPerDatabaseInfo(t *testing.T) {
-    for _, test := range tests {
+	for _, test := range tests {
 		test := test
 		t.Run(test.name, func(t *testing.T) {
 			dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s sslmode=disable dbname=%s",
 				test.host, test.port, test.username, test.password, "postgres")
-			db, err := connect(dsn);
+			db, err := connect(dsn)
 			if err != nil {
 				t.Errorf("Cannot connect to the db using %q: %s", dsn, err)
 			}
-			info, err := pginfo.NewWithLogger(db, nil, 30, logger);
+			info, err := pginfo.NewWithLogger(db, nil, 30, logger)
 			if err != nil {
 				t.Errorf("Cannot run New using %q: %s", dsn, err)
 			}
 			for _, dbName := range info.DatabaseNames() {
 				dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s sslmode=disable dbname=%s",
 					test.host, test.port, test.username, test.password, dbName)
-				conn, err := connect(dsn);
+				conn, err := connect(dsn)
 				if err != nil {
 					t.Errorf("Cannot connect to the %s database using %q: %s", dbName, dsn, err)
 				}
@@ -122,5 +120,5 @@ func TestCollectPerDatabaseInfo(t *testing.T) {
 				conn.Close()
 			}
 		})
-    }
+	}
 }
diff --git a/src/go/pt-pg-summary/models/alldatabases.xo.go b/src/go/pt-pg-summary/models/alldatabases.xo.go
index 9069ef8..ba5c37f 100644
--- a/src/go/pt-pg-summary/models/alldatabases.xo.go
+++ b/src/go/pt-pg-summary/models/alldatabases.xo.go
@@ -13,7 +13,7 @@ func GetAllDatabases(db XODB) ([]*AllDatabases, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT datname ` +
+	sqlstr := `SELECT datname ` +
 		`FROM pg_database ` +
 		`WHERE datistemplate = false`
 
diff --git a/src/go/pt-pg-summary/models/clusterinfo.xo.go b/src/go/pt-pg-summary/models/clusterinfo.xo.go
index bfe6a3a..6a5d6e2 100644
--- a/src/go/pt-pg-summary/models/clusterinfo.xo.go
+++ b/src/go/pt-pg-summary/models/clusterinfo.xo.go
@@ -24,7 +24,7 @@ func GetClusterInfos(db XODB) ([]*ClusterInfo, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT usename, now() AS "Time", ` +
+	sqlstr := `SELECT usename, now() AS "Time", ` +
 		`client_addr, ` +
 		`client_hostname, ` +
 		`version() AS version, ` +
diff --git a/src/go/pt-pg-summary/models/connectedclients.xo.go b/src/go/pt-pg-summary/models/connectedclients.xo.go
index 9bed44a..8be319d 100644
--- a/src/go/pt-pg-summary/models/connectedclients.xo.go
+++ b/src/go/pt-pg-summary/models/connectedclients.xo.go
@@ -20,7 +20,7 @@ func GetConnectedClients(db XODB) ([]*ConnectedClients, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT usename, ` +
+	sqlstr := `SELECT usename, ` +
 		`CASE WHEN client_hostname IS NULL THEN client_addr::text ELSE client_hostname END AS client, ` +
 		`state, count(*) ` +
 		`FROM pg_stat_activity ` +
diff --git a/src/go/pt-pg-summary/models/connections.xo.go b/src/go/pt-pg-summary/models/connections.xo.go
index c7e56c4..4a49a59 100644
--- a/src/go/pt-pg-summary/models/connections.xo.go
+++ b/src/go/pt-pg-summary/models/connections.xo.go
@@ -14,7 +14,7 @@ func GetConnections(db XODB) ([]*Connections, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT state, count(*) ` +
+	sqlstr := `SELECT state, count(*) ` +
 		`FROM pg_stat_activity ` +
 		`GROUP BY 1`
 
diff --git a/src/go/pt-pg-summary/models/counters.xo.go b/src/go/pt-pg-summary/models/counters.xo.go
index 72a2950..791b65d 100644
--- a/src/go/pt-pg-summary/models/counters.xo.go
+++ b/src/go/pt-pg-summary/models/counters.xo.go
@@ -27,7 +27,7 @@ func GetCounters(db XODB) ([]*Counters, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT COALESCE(datname, '') datname, numbackends, xact_commit, xact_rollback, ` +
+	sqlstr := `SELECT COALESCE(datname, '') datname, numbackends, xact_commit, xact_rollback, ` +
 		`blks_read, blks_hit, tup_returned, tup_fetched, tup_inserted, ` +
 		`tup_updated, tup_deleted, conflicts, temp_files, ` +
 		`temp_bytes, deadlocks ` +
diff --git a/src/go/pt-pg-summary/models/databases.xo.go b/src/go/pt-pg-summary/models/databases.xo.go
index 1a27e99..3409fa4 100644
--- a/src/go/pt-pg-summary/models/databases.xo.go
+++ b/src/go/pt-pg-summary/models/databases.xo.go
@@ -14,7 +14,7 @@ func GetDatabases(db XODB) ([]*Databases, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT datname, pg_size_pretty(pg_database_size(datname)) ` +
+	sqlstr := `SELECT datname, pg_size_pretty(pg_database_size(datname)) ` +
 		`FROM pg_stat_database ` +
 		`WHERE datid <> 0`
 
diff --git a/src/go/pt-pg-summary/models/databasewaitevents.xo.go b/src/go/pt-pg-summary/models/databasewaitevents.xo.go
index 601a071..97e06e5 100644
--- a/src/go/pt-pg-summary/models/databasewaitevents.xo.go
+++ b/src/go/pt-pg-summary/models/databasewaitevents.xo.go
@@ -22,7 +22,7 @@ func GetDatabaseWaitEvents(db XODB) ([]*DatabaseWaitEvents, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT c.relname, c.relkind, d.wait_event_type, d.wait_event, b.datname, count(*) ` +
+	sqlstr := `SELECT c.relname, c.relkind, d.wait_event_type, d.wait_event, b.datname, count(*) ` +
 		`FROM pg_locks a ` +
 		`JOIN pg_stat_database b ON a.database=b.datid ` +
 		`JOIN pg_class c ON a.relation=c.oid ` +
diff --git a/src/go/pt-pg-summary/models/portanddatadir.xo.go b/src/go/pt-pg-summary/models/portanddatadir.xo.go
index 3862113..970fe37 100644
--- a/src/go/pt-pg-summary/models/portanddatadir.xo.go
+++ b/src/go/pt-pg-summary/models/portanddatadir.xo.go
@@ -14,7 +14,7 @@ func GetPortAndDatadir(db XODB) (*PortAndDatadir, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT name, ` +
+	sqlstr := `SELECT name, ` +
 		`setting ` +
 		`FROM pg_settings ` +
 		`WHERE name IN ('port','data_directory')`
diff --git a/src/go/pt-pg-summary/models/slavehosts10.xo.go b/src/go/pt-pg-summary/models/slavehosts10.xo.go
index 9d3dd37..1363b99 100644
--- a/src/go/pt-pg-summary/models/slavehosts10.xo.go
+++ b/src/go/pt-pg-summary/models/slavehosts10.xo.go
@@ -20,7 +20,7 @@ func GetSlaveHosts10s(db XODB) ([]*SlaveHosts10, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT application_name, client_addr, state, sent_offset - (replay_offset - (sent_lsn - replay_lsn) * 255 * 16 ^ 6 ) AS byte_lag ` +
+	sqlstr := `SELECT application_name, client_addr, state, sent_offset - (replay_offset - (sent_lsn - replay_lsn) * 255 * 16 ^ 6 ) AS byte_lag ` +
 		`FROM ( SELECT application_name, client_addr, client_hostname, state, ` +
 		`('x' || lpad(split_part(sent_lsn::TEXT,   '/', 1), 8, '0'))::bit(32)::bigint AS sent_lsn, ` +
 		`('x' || lpad(split_part(replay_lsn::TEXT, '/', 1), 8, '0'))::bit(32)::bigint AS replay_lsn, ` +
diff --git a/src/go/pt-pg-summary/models/slavehosts96.xo.go b/src/go/pt-pg-summary/models/slavehosts96.xo.go
index 83e6fce..14fed04 100644
--- a/src/go/pt-pg-summary/models/slavehosts96.xo.go
+++ b/src/go/pt-pg-summary/models/slavehosts96.xo.go
@@ -20,7 +20,7 @@ func GetSlaveHosts96s(db XODB) ([]*SlaveHosts96, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT application_name, client_addr, state, sent_offset - (replay_offset - (sent_xlog - replay_xlog) * 255 * 16 ^ 6 ) AS byte_lag ` +
+	sqlstr := `SELECT application_name, client_addr, state, sent_offset - (replay_offset - (sent_xlog - replay_xlog) * 255 * 16 ^ 6 ) AS byte_lag ` +
 		`FROM ( SELECT application_name, client_addr, client_hostname, state, ` +
 		`('x' || lpad(split_part(sent_location::TEXT,   '/', 1), 8, '0'))::bit(32)::bigint AS sent_xlog, ` +
 		`('x' || lpad(split_part(replay_location::TEXT, '/', 1), 8, '0'))::bit(32)::bigint AS replay_xlog, ` +
diff --git a/src/go/pt-pg-summary/models/tableaccess.xo.go b/src/go/pt-pg-summary/models/tableaccess.xo.go
index 87ca733..45b4ac4 100644
--- a/src/go/pt-pg-summary/models/tableaccess.xo.go
+++ b/src/go/pt-pg-summary/models/tableaccess.xo.go
@@ -20,7 +20,7 @@ func GetTableAccesses(db XODB) ([]*TableAccess, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT c.relname, c.relkind, b.datname datname, count(*) FROM pg_locks a ` +
+	sqlstr := `SELECT c.relname, c.relkind, b.datname datname, count(*) FROM pg_locks a ` +
 		`JOIN pg_stat_database b ` +
 		`ON a.database=b.datid ` +
 		`JOIN pg_class c ` +
diff --git a/src/go/pt-pg-summary/models/tablecachehitratio.xo.go b/src/go/pt-pg-summary/models/tablecachehitratio.xo.go
index 4eb624a..b833ac9 100644
--- a/src/go/pt-pg-summary/models/tablecachehitratio.xo.go
+++ b/src/go/pt-pg-summary/models/tablecachehitratio.xo.go
@@ -18,7 +18,7 @@ func GetTableCacheHitRatio(db XODB) (*TableCacheHitRatio, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT 'cache hit rate' AS name, ` +
+	sqlstr := `SELECT 'cache hit rate' AS name, ` +
 		`CASE WHEN (sum(heap_blks_read) + sum(idx_blks_hit)) > 0 ` +
 		`THEN ` +
 		`sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) ` +
diff --git a/src/go/pt-pg-summary/models/tablespaces.xo.go b/src/go/pt-pg-summary/models/tablespaces.xo.go
index 1553677..945ac1a 100644
--- a/src/go/pt-pg-summary/models/tablespaces.xo.go
+++ b/src/go/pt-pg-summary/models/tablespaces.xo.go
@@ -15,7 +15,7 @@ func GetTablespaces(db XODB) ([]*Tablespaces, error) {
 	var err error
 
 	// sql query
-	var sqlstr = `SELECT spcname AS Name, ` +
+	sqlstr := `SELECT spcname AS Name, ` +
 		`pg_catalog.pg_get_userbyid(spcowner) AS Owner, ` +
 		`pg_catalog.pg_tablespace_location(oid) AS Location ` +
 		`FROM pg_catalog.pg_tablespace ` +
diff --git a/src/go/pt-pg-summary/templates/templates.go b/src/go/pt-pg-summary/templates/templates.go
index ee5a291..350320e 100644
--- a/src/go/pt-pg-summary/templates/templates.go
+++ b/src/go/pt-pg-summary/templates/templates.go
@@ -57,7 +57,7 @@ var TPL = `{{define "report"}}
 +----------------------+----------------------+----------------------------------------------------+
 {{ end -}} {{/* end define */}}
 ` +
-    `{{- define "slaves_and_log_none" -}}
+	`{{- define "slaves_and_log_none" -}}
 ##### --- Slave and the lag with Master --- ####
 There are no slave hosts
 {{ end -}} {{/* end define */}}
diff --git a/src/go/pt-secure-collect/encrypt.go b/src/go/pt-secure-collect/encrypt.go
index 8327832..07c834d 100644
--- a/src/go/pt-secure-collect/encrypt.go
+++ b/src/go/pt-secure-collect/encrypt.go
@@ -50,7 +50,7 @@ func encrypt(infile, outfile string, pass [32]byte) error {
 	var iv [aes.BlockSize]byte
 	stream := cipher.NewOFB(block, iv[:])
 
-	outFile, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
+	outFile, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o600)
 	if err != nil {
 		return errors.Wrapf(err, "Cannot create output file %q", outfile)
 	}
@@ -81,7 +81,7 @@ func decrypt(infile, outfile string, pass [32]byte) error {
 	var iv [aes.BlockSize]byte
 	stream := cipher.NewOFB(block, iv[:])
 
-	outFile, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
+	outFile, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o600)
 	if err != nil {
 		return errors.Wrapf(err, "Cannot open %q for writing", outfile)
 	}
diff --git a/src/go/pt-secure-collect/main.go b/src/go/pt-secure-collect/main.go
index 431e616..d8a978e 100644
--- a/src/go/pt-secure-collect/main.go
+++ b/src/go/pt-secure-collect/main.go
@@ -86,7 +86,7 @@ var (
 
 	Build     string = "2020-04-23" //nolint
 	GoVersion string = "1.14.1"     //nolint
-	Version   string = "3.2.0"      //nolint
+	Version   string = "3.3.1"      //nolint
 	Commit    string                //nolint
 )
 
diff --git a/src/go/pt-secure-collect/main_test.go b/src/go/pt-secure-collect/main_test.go
index 0250105..77de95c 100644
--- a/src/go/pt-secure-collect/main_test.go
+++ b/src/go/pt-secure-collect/main_test.go
@@ -32,11 +32,9 @@ func TestProcessCliParams(t *testing.T) {
 			t.Errorf("Test #%d expected error, have nil", i)
 		}
 		if !reflect.DeepEqual(opts, test.WantOpts) {
-
 		}
 	}
 }
 
 func TestCollect(t *testing.T) {
-
 }
diff --git a/src/go/runtests.sh b/src/go/runtests.sh
index 9462326..6199976 100755
--- a/src/go/runtests.sh
+++ b/src/go/runtests.sh
@@ -6,12 +6,12 @@ cd $BASEDIR
 
 source ${BASEDIR}/src/go/setenv.sh
 
-for dir in $(ls -d ./src/go/pt-*)
+for dir in $(ls -d ./src/go/pt-* ) ./src/go/mongolib
 do 
   echo "Running tests at $BASEDIR/$dir"
   cd $BASEDIR/$dir
   go get ./...
-  go test -v -coverprofile=coverage.out
+  go test -v -coverprofile=coverage.out ./...
   if [ -f coverage.out ]
   then
       go tool cover -func=coverage.out
diff --git a/t/lib/TableParser.t b/t/lib/TableParser.t
index 57772ad..12f2de1 100644
--- a/t/lib/TableParser.t
+++ b/t/lib/TableParser.t
@@ -1267,6 +1267,68 @@ is_deeply(
    'Column having the word "generated" as part of the comment is OK',
 ) or diag Data::Dumper::Dumper($tbl);
 
+$tbl = $tp->parse( load_file('t/lib/samples/generated_cols_comments_2.sql') );
+is_deeply(
+    $tbl,
+    {
+        charset => 'latin1',
+        clustered_key => undef,
+        col_posn => {
+            c => 1,
+            id => 0,
+            v => 2
+        },
+        cols => [
+            'id',
+            'c',
+            'v'
+        ],
+        defs => {
+            c => ' `c` varchar(100) NOT NULL DEFAULT \'\' COMMENT \'Generated\'',
+            id => ' `id` int(11) NOT NULL',
+            v => ' `v` int(11) DEFAULT NULL'
+        },
+        engine => 'InnoDB',
+        is_autoinc => {
+            c => 0,
+            id => 0,
+            v => 0
+        },
+        is_col => {
+            c => 1,
+            id => 1,
+            v => 1
+        },
+        is_generated => {},
+        is_nullable => {
+            v => 1
+        },
+        is_numeric => {
+            id => 1,
+            v => 1
+        },
+        keys => {},
+        name => 't',
+        non_generated_cols => [
+            'id',
+            'c',
+            'v'
+        ],
+        null_cols => [
+            'v'
+        ],
+        numeric_cols => [
+            'id',
+            'v'
+        ],
+        type_for => {
+            c => 'varchar',
+            id => 'int',
+            v => 'int'
+        }
+    },
+    'Column having the word "generated" as part of the comment is OK',
+) or diag Data::Dumper::Dumper($tbl);
 # #############################################################################
 # Done.
 # #############################################################################
diff --git a/t/lib/samples/generated_cols_comments_2.sql b/t/lib/samples/generated_cols_comments_2.sql
new file mode 100644
index 0000000..aff69c8
--- /dev/null
+++ b/t/lib/samples/generated_cols_comments_2.sql
@@ -0,0 +1,6 @@
+Create Table: CREATE TABLE `t` (
+ `id` int(11) NOT NULL,
+ `c` varchar(100) NOT NULL DEFAULT '' COMMENT 'Generated',
+ `v` int(11) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/t/pt-archiver/pt-1898.t b/t/pt-archiver/pt-1898.t
new file mode 100644
index 0000000..bdf9b8f
--- /dev/null
+++ b/t/pt-archiver/pt-1898.t
@@ -0,0 +1,109 @@
+#!/usr/bin/env perl
+
+BEGIN {
+   die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
+      unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
+   unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
+};
+
+use strict;
+use warnings FATAL => 'all';
+use threads;
+
+use English qw(-no_match_vars);
+use Test::More;
+
+use Data::Dumper;
+use PerconaTest;
+use Sandbox;
+use SqlModes;
+use File::Temp qw/ tempdir tempfile /;
+
+if ($ENV{PERCONA_SLOW_BOX}) {
+    plan skip_all => 'This test needs a fast machine';
+} else {
+    plan tests => 6;
+    #plan skip_all => 'This test is taking too much time even in fast machines';
+}                                  
+
+our $delay = 15;
+
+my $tmp_file = File::Temp->new();
+my $tmp_file_name = $tmp_file->filename;
+unlink $tmp_file_name;
+
+require "$trunk/bin/pt-archiver";
+
+my $dp = new DSNParser(opts=>$dsn_opts);
+my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
+my $master_dbh = $sb->get_dbh_for('master');
+my $slave_dbh = $sb->get_dbh_for('slave1');
+my $master_dsn = 'h=127.0.0.1,P=12345,u=msandbox,p=msandbox';
+my $slave_dsn = 'h=127.0.0.1,P=12346,u=msandbox,p=msandbox';
+
+sub reset_query_cache {
+    my @dbhs = @_;
+    return if ($sandbox_version >= '8.0');
+    foreach my $dbh (@dbhs) {
+        $dbh->do('RESET QUERY CACHE');
+    }
+}
+
+# 1) Set the slave delay to 0 just in case we are re-running the tests without restarting the sandbox.
+# 2) Load sample data
+# 3) Set the slave delay to 30 seconds to be able to see the 'waiting' message.
+diag("Setting slave delay to 0 seconds");
+$slave_dbh->do('STOP SLAVE');
+$slave_dbh->do('RESET SLAVE');
+$slave_dbh->do('START SLAVE');
+
+diag('Loading test data');
+$sb->load_file('master', "t/pt-online-schema-change/samples/pt-1898.sql");
+
+my $num_rows = 5000;
+diag("Loading $num_rows into the table. This might take some time.");
+diag(`util/mysql_random_data_load --host=127.0.0.1 --port=12345 --user=msandbox --password=msandbox test pt178 $num_rows`);
+
+diag("Setting slave delay to $delay seconds");
+
+$slave_dbh->do('STOP SLAVE');
+$slave_dbh->do("CHANGE MASTER TO MASTER_DELAY=$delay");
+$slave_dbh->do('START SLAVE');
+
+# Run a full table scan query to ensure the slave is behind the master
+# There is no query cache in MySQL 8.0+
+reset_query_cache($master_dbh, $master_dbh);
+$master_dbh->do('UPDATE `test`.`joinit` SET g = g + 1 WHERE g <> 0');
+
+# This is the base test, ust to ensure that without using --check-slave-lag nor --skip-check-slave-lag
+# pt-online-schema-change will wait on the slave at port 12346
+
+my $max_lag = $delay / 2;
+my @args = ("--source",  "$master_dsn,D=test,t=joinit", "--purge", "--where", "'g < 45'",
+           "--commit-each", "--limit", "500", "--statistics", "--check-slave-lag", "h=127.0.0.1,P=12346,u=msandbox,p=msandbox",
+           "--max-lag", "1");
+diag("Starting base test. This is going to take some time due to the delay in the slave");
+diag("pid: $tmp_file_name");
+my $argstr = join(@args, " ");
+my $output = `$trunk/bin/pt-online-schema-change $argstr 2>&1`;
+
+like(
+      $output,
+      qr/Replica lag is \d+ seconds on .*  Waiting/s,
+      "Base test waits on the correct slave",
+);
+
+
+diag("Setting slave delay to 0 seconds");
+$slave_dbh->do('STOP SLAVE');
+$slave_dbh->do('RESET SLAVE');
+$slave_dbh->do('START SLAVE');
+
+$master_dbh->do("DROP DATABASE IF EXISTS test");
+
+# #############################################################################
+# Done.
+# #############################################################################
+$sb->wipe_clean($master_dbh);
+ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
+done_testing;
diff --git a/t/pt-heartbeat/pt-1857.t b/t/pt-heartbeat/pt-1857.t
new file mode 100644
index 0000000..a309df5
--- /dev/null
+++ b/t/pt-heartbeat/pt-1857.t
@@ -0,0 +1,95 @@
+#!/usr/bin/env perl
+
+BEGIN {
+   die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
+      unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
+   unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
+};
+
+use strict;
+use warnings FATAL => 'all';
+use threads ('yield');
+
+use English qw(-no_match_vars);
+use Test::More;
+
+use Data::Dumper;
+use PerconaTest;
+use Sandbox;
+use SqlModes;
+use File::Temp qw/ tempfile /;
+
+plan tests => 2;
+
+require "$trunk/bin/pt-heartbeat";
+
+my $dp = new DSNParser(opts=>$dsn_opts);
+my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
+my $master_dbh = $sb->get_dbh_for('master');
+my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
+
+my $slave1_dbh = $sb->get_dbh_for('slave1');
+my $slave1_dsn = 'h=127.1,P=12346,u=unprivileged,p=password';
+
+if ( !$master_dbh ) {
+   plan skip_all => 'Cannot connect to sandbox master';
+}
+
+sub start_thread {
+    my ($dsn_opts, $sleep) = @_;
+
+    my $dp = new DSNParser(opts=>$dsn_opts);
+    my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
+    my $dbh= $sb->get_dbh_for('slave1');
+    my $rows = $dbh->selectall_arrayref('SHOW PROCESSLIST', { Slice => {} });
+    for my $row (@$rows) {
+        if ($row->{user} eq 'unprivileged') {
+            $dbh->do("kill $row->{id}");
+        }
+    }
+}
+
+my $create_table_sql = <<__EOQ;
+  CREATE TABLE IF NOT EXISTS sakila.heartbeat (
+    ts                    varchar(26) NOT NULL,
+    server_id             int unsigned NOT NULL PRIMARY KEY,
+    file                  varchar(255) DEFAULT NULL,    -- SHOW MASTER STATUS
+    position              bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS
+    relay_master_log_file varchar(255) DEFAULT NULL,    -- SHOW SLAVE STATUS
+    exec_master_log_pos   bigint unsigned DEFAULT NULL  -- SHOW SLAVE STATUS
+  );
+__EOQ
+
+$sb->do_as_root('master', "$create_table_sql");
+if ($sandbox_version ge '8.0') {
+    $sb->do_as_root('slave1', 'CREATE USER "unprivileged"@"localhost" IDENTIFIED WITH mysql_native_password BY "password"');
+} else {
+    $sb->do_as_root('slave1', 'CREATE USER "unprivileged"@"localhost" IDENTIFIED BY "password"');
+}
+$sb->do_as_root('slave1', 'GRANT SELECT, INSERT, UPDATE, REPLICATION CLIENT ON *.* TO "unprivileged"@"localhost"');
+$sb->do_as_root('slave1', "FLUSH TABLES WITH READ LOCK;");
+$sb->do_as_root('slave1', "SET GLOBAL read_only = 1;");
+
+my $thread = threads->create('start_thread', $dsn_opts, 4);
+$thread->detach();
+threads->yield();
+
+my $output = `PTDEBUG=1 $trunk/bin/pt-heartbeat --database=sakila --table heartbeat --read-only-interval 2 --check-read-only --run-time 5 --update $slave1_dsn 2>&1`;
+
+unlike (
+    $output,
+    qr/Lost connection to MySQL/,
+    'PT-1508 --read-only-interval',
+);
+
+$master_dbh->do("DROP DATABASE IF EXISTS test");
+
+# #############################################################################
+# Done.
+# #############################################################################
+$sb->do_as_root('master', 'DROP TABLE IF EXISTS sakila.heartbeat');
+$sb->do_as_root('slave1', 'DROP USER "unprivileged"@"localhost"');
+
+$sb->wipe_clean($master_dbh);
+ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
+done_testing;
diff --git a/t/pt-online-schema-change/PT-1905_reverse_pt_osc_triggers.t b/t/pt-online-schema-change/PT-1905_reverse_pt_osc_triggers.t
new file mode 100644
index 0000000..4b3eb10
--- /dev/null
+++ b/t/pt-online-schema-change/PT-1905_reverse_pt_osc_triggers.t
@@ -0,0 +1,171 @@
+#!/usr/bin/env perl
+
+BEGIN {
+   die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
+      unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
+   unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
+};
+
+use strict;
+use warnings FATAL => 'all';
+use threads;
+
+use English qw(-no_match_vars);
+use Test::More;
+
+use Data::Dumper;
+use PerconaTest;
+use Sandbox;
+use SqlModes;
+use File::Temp qw/ tempdir /;
+use threads;
+use Time::HiRes qw( usleep );
+use constant PTDEBUG => $ENV{PTDEBUG} || 0;
+
+plan tests => 5;
+
+require "$trunk/bin/pt-online-schema-change";
+
+my $dp = new DSNParser(opts=>$dsn_opts);
+my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
+my $master_dbh = $sb->get_dbh_for('master');
+my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
+
+if ( !$master_dbh ) {
+   plan skip_all => 'Cannot connect to sandbox master';
+}
+
+$sb->load_file('master', "t/pt-online-schema-change/samples/pt-153.sql");
+
+sub start_thread {
+   my ($dsn_opts) = @_;
+   my $dp = new DSNParser(opts=>$dsn_opts);
+   my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
+   my $dbh = $sb->get_dbh_for('master');
+   PTDEBUG && diag("Thread started...");
+
+   local $SIG{KILL} = sub { 
+       PTDEBUG && diag("Exit thread");
+       threads->exit ;
+   };
+
+   for (my $i=0; $i < 1_000_000; $i++) {
+       eval {
+           $dbh->do("INSERT INTO test.t1 (f2,f4) VALUES (1,3)");
+       };
+   }
+}
+
+my $thr = threads->create('start_thread', $dsn_opts);
+threads->yield();
+
+# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
+# so we need to specify --set-vars innodb_lock_wait_timeout=3 else the
+# tool will die.
+my @args       = (qw(--set-vars innodb_lock_wait_timeout=3));
+my $output;
+my $exit_status;
+
+sleep(1); # Let is generate some rows. 
+
+($output, $exit_status) = full_output(
+   sub { pt_online_schema_change::main(@args, "$master_dsn,D=test,t=t1",
+         '--execute', 
+         '--alter', "DROP COLUMN f3", 
+         '--reverse-triggers', '--no-drop-old-table',
+         ),
+      },
+);
+
+is(
+      $exit_status,
+      0,
+      "Exit status is 0",
+);
+
+like(
+      $output,
+      qr/Successfully altered `test`.`t1`/s,
+      "Successfully altered `test`.`t1`",
+);
+
+my $triggers_sql = "SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE, ACTION_STATEMENT, SQL_MODE, "
+                 . "       CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING "
+                 . "  FROM INFORMATION_SCHEMA.TRIGGERS "
+                 . " WHERE TRIGGER_SCHEMA = 'test'";
+
+my $rows = $master_dbh->selectall_arrayref($triggers_sql, {Slice =>{}});
+
+is_deeply (
+    want_triggers(), 
+    $rows,
+    "Reverse triggers in place",
+);
+
+# Kill the thread otherwise the count will be different because we are running 2 separate queries.
+$thr->kill('KILL'); 
+$thr->join();
+
+my $new_count = $master_dbh->selectrow_hashref('SELECT COUNT(*) AS cnt FROM test.t1');
+my $old_count = $master_dbh->selectrow_hashref('SELECT COUNT(*) AS cnt FROM test._t1_old');
+
+is (
+    $old_count->{cnt},
+    $new_count->{cnt}, 
+    "Rows count is correct",
+);
+
+$master_dbh->do("DROP DATABASE IF EXISTS test");
+
+# #############################################################################
+# Done.
+# #############################################################################
+$sb->wipe_clean($master_dbh);
+ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
+done_testing;
+
+
+# Heres just to make the test more clear.
+sub want_triggers {
+    return [
+        {
+          action_statement => 'BEGIN DECLARE CONTINUE HANDLER FOR 1146 begin end; REPLACE INTO `test`.`_t1_old` (`id`, `f2`, `f4`) VALUES (NEW.`id`, NEW.`f2`, NEW.`f4`);END',
+          action_timing => 'AFTER',
+          character_set_client => 'latin1',
+          collation_connection => 'latin1_swedish_ci',
+          definer => 'msandbox@%',
+          event_manipulation => 'INSERT',
+          event_object_schema => 'test',
+          event_object_table => 't1',
+          sql_mode => 'ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION',
+          trigger_name => 'rt_pt_osc_test__t1_new_ins',
+          trigger_schema => 'test'
+        },
+        {
+          action_statement => 'BEGIN DECLARE CONTINUE HANDLER FOR 1146 begin end; DELETE IGNORE FROM `test`.`_t1_old` WHERE !(OLD.`id` <=> NEW.`id`) AND `test`.`_t1_old`.`id` <=> OLD.`id`; REPLACE INTO `test`.`_t1_old` (`id`, `f2`, `f4`) VALUES (NEW.`id`, NEW.`f2`, NEW.`f4`); END',
+          action_timing => 'AFTER',
+          character_set_client => 'latin1',
+          collation_connection => 'latin1_swedish_ci',
+          definer => 'msandbox@%',
+          event_manipulation => 'UPDATE',
+          event_object_schema => 'test',
+          event_object_table => 't1',
+          sql_mode => 'ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION',
+          trigger_name => 'rt_pt_osc_test__t1_new_upd',
+          trigger_schema => 'test'
+        },
+        {
+          action_statement => 'BEGIN DECLARE CONTINUE HANDLER FOR 1146 begin end; DELETE IGNORE FROM `test`.`_t1_old` WHERE `test`.`_t1_old`.`id` <=> OLD.`id`; END',
+          action_timing => 'AFTER',
+          character_set_client => 'latin1',
+          collation_connection => 'latin1_swedish_ci',
+          definer => 'msandbox@%',
+          event_manipulation => 'DELETE',
+          event_object_schema => 'test',
+          event_object_table => 't1',
+          sql_mode => 'ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION',
+          trigger_name => 'rt_pt_osc_test__t1_new_del',
+          trigger_schema => 'test'
+        },
+    ];
+}
diff --git a/t/pt-online-schema-change/pt-1528.t b/t/pt-online-schema-change/pt-1528.t
new file mode 100644
index 0000000..52cd3ee
--- /dev/null
+++ b/t/pt-online-schema-change/pt-1528.t
@@ -0,0 +1,70 @@
+#!/usr/bin/env perl
+
+BEGIN {
+    die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
+    unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
+    unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
+};
+
+use strict;
+use warnings FATAL => 'all';
+use threads;
+use threads::shared;
+use Thread::Semaphore;
+
+use English qw(-no_match_vars);
+use Test::More;
+
+use Data::Dumper;
+use PerconaTest;
+use Sandbox;
+use SqlModes;
+use File::Temp qw/ tempdir /;
+
+if ($sandbox_version lt '5.7') {
+    plan skip_all => 'This test needs MySQL 5.7+';
+} else {
+    plan tests => 2;
+}    
+
+require "$trunk/bin/pt-online-schema-change";
+
+my $dp = new DSNParser(opts=>$dsn_opts);
+my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
+
+my $dbh = $sb->get_dbh_for('master');
+my $dsn = $sb->dsn_for("master");
+
+# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
+# so we need to specify --set-vars innodb_lock_wait_timeout=3 else the
+# tool will die.
+my @args = (qw(--set-vars innodb_lock_wait_timeout=3));
+my $output;
+my $exit_status;
+
+$sb->load_file('master', "t/pt-online-schema-change/samples/pt-1528.sql");
+
+my $rows_before = $dbh->selectall_hashref("SELECT * FROM test.brokenutf8alter", "id");
+
+($output, $exit_status) = full_output(
+    sub { pt_online_schema_change::main(@args, "$dsn,D=test,t=brokenutf8alter",
+            '--execute', '--charset=utf8', '--chunk-size', '2', '--alter', 'engine=innodb',
+        ),
+    },
+    stderr => 1,
+);
+
+my $rows_after = $dbh->selectall_hashref("SELECT * FROM test.brokenutf8alter", "id");
+
+is_deeply(
+    $rows_before, 
+    $rows_after,
+    "Should be equal",
+);
+
+# #############################################################################
+# Done.
+# #############################################################################
+$sb->wipe_clean($dbh);
+ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
+done_testing;
diff --git a/t/pt-online-schema-change/pt-169.t b/t/pt-online-schema-change/pt-169.t
new file mode 100644
index 0000000..d89bdc3
--- /dev/null
+++ b/t/pt-online-schema-change/pt-169.t
@@ -0,0 +1,76 @@
+#!/usr/bin/env perl
+
+BEGIN {
+   die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
+      unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
+   unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
+};
+
+use strict;
+use warnings FATAL => 'all';
+use threads;
+
+use English qw(-no_match_vars);
+use Test::More;
+
+use Data::Dumper;
+use PerconaTest;
+use Sandbox;
+use SqlModes;
+use File::Temp qw/ tempdir /;
+
+plan tests => 3;
+
+require "$trunk/bin/pt-online-schema-change";
+
+my $dp = new DSNParser(opts=>$dsn_opts);
+my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
+my $master_dbh = $sb->get_dbh_for('master');
+my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
+
+if ( !$master_dbh ) {
+   plan skip_all => 'Cannot connect to sandbox master';
+}
+
+# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
+# so we need to specify --set-vars innodb_lock_wait_timeout=3 else the
+# tool will die.
+my @args       = (qw(--set-vars innodb_lock_wait_timeout=3));
+my $output;
+my $exit_status;
+my $sample  = "t/pt-online-schema-change/samples/";
+my $ERROR_UPDATING_FKS = 15; # from pt-online-schema-change line 8453
+
+$sb->load_file('master', "$sample/pt-169.sql");
+
+($output, $exit_status) = full_output(
+   sub { pt_online_schema_change::main(@args, "$master_dsn,D=test,t=users",
+         '--execute', '--alter', 'CHANGE COLUMN id id BIGINT UNSIGNED NOT NULL FIRST', 
+         '--set-vars', 'foreign_key_checks=0',
+         '--alter-foreign-keys-method', 'drop_swap',  '--no-check-alter')
+      },
+);
+
+is(
+      $exit_status,
+      $ERROR_UPDATING_FKS,
+      "--alter rename columns with uppercase names -> exit status 0",
+);
+
+# Since drop_swap has failed, the clueanup process should be skipped and the new table
+# shouldn't be deleted
+my $row = $master_dbh->selectrow_hashref("select count(*) AS how_many from test._users_new");
+is (
+    $row->{how_many},
+    1,
+    "Correct number of rows",
+);
+
+$master_dbh->do("DROP DATABASE IF EXISTS test");
+
+# #############################################################################
+# Done.
+# #############################################################################
+$sb->wipe_clean($master_dbh);
+ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
+done_testing;
diff --git a/t/pt-online-schema-change/pt-1914.t b/t/pt-online-schema-change/pt-1914.t
new file mode 100644
index 0000000..6d5b645
--- /dev/null
+++ b/t/pt-online-schema-change/pt-1914.t
@@ -0,0 +1,337 @@
+#!/usr/bin/env perl
+
+BEGIN {
+    die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
+    unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
+    unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
+};
+
+use strict;
+use warnings FATAL => 'all';
+use English qw(-no_match_vars);
+use Test::More;
+use Time::HiRes qw(sleep);
+
+$ENV{PTTEST_FAKE_TS} = 1;
+$ENV{PERCONA_TOOLKIT_TEST_USE_DSN_NAMES} = 1;
+
+use PerconaTest;
+use Sandbox;
+require "$trunk/bin/pt-online-schema-change";
+require VersionParser;
+
+use Data::Dumper;
+$Data::Dumper::Indent    = 1;
+$Data::Dumper::Sortkeys  = 1;
+$Data::Dumper::Quotekeys = 0;
+
+my $dp         = new DSNParser(opts=>$dsn_opts);
+my $sb         = new Sandbox(basedir => '/tmp', DSNParser => $dp);
+my $master_dbh = $sb->get_dbh_for('master');
+my $slave_dbh  = $sb->get_dbh_for('slave1');
+
+if ( !$master_dbh ) {
+    plan skip_all => 'Cannot connect to sandbox master';
+}
+elsif ( !$slave_dbh ) {
+    plan skip_all => 'Cannot connect to sandbox slave';
+}
+
+my $q      = new Quoter();
+my $tp     = new TableParser(Quoter => $q);
+my @args   = qw(--set-vars innodb_lock_wait_timeout=3);
+my $output = "";
+my $dsn    = "h=127.1,P=12345,u=msandbox,p=msandbox";
+my $exit   = 0;
+my $sample = "t/pt-online-schema-change/samples";
+my $rows;
+
+# #############################################################################
+# A helper sub to do the heavy lifting for us.
+# #############################################################################
+
+sub test_alter_table {
+    my (%args) = @_;
+    return if $args{skip};
+
+    my @required_args = qw(name table test_type cmds);
+    foreach my $arg ( @required_args ) {
+        die "I need a $arg argument" unless $args{$arg};
+    }
+    my ($name, $table, $test_type, $cmds) = @args{@required_args};
+
+    my ($db, $tbl) = $q->split_unquote($table);
+    my $table_name = $tbl;
+    my $pk_col     = $args{pk_col} || 'id';
+    my $delete_triggers = $args{delete_triggers} || '';
+
+    if ( my $file = $args{file} ) {
+        $sb->load_file('master', "$sample/$file");
+        $master_dbh->do("USE `$db`");
+        $slave_dbh->do("USE `$db`");
+    }
+
+    my $ddl        = $tp->get_create_table($master_dbh, $db, $tbl);
+    my $tbl_struct = $tp->parse($ddl);
+
+    my $cols = '*';
+    if ( $test_type =~ m/(?:add|drop)_col/  && !grep { $_ eq '--dry-run' } @$cmds ) {
+        # Don't select the column being dropped.
+        my $col = $args{drop_col} || $args{new_col};
+        die "I need a drop_col argument" unless $col;
+        $cols = join(', ', grep { $_ ne $col } @{$tbl_struct->{cols}});
+    }
+    my $orig_rows = $master_dbh->selectall_arrayref(
+        "SELECT $cols FROM $table ORDER BY `$pk_col`");
+
+    my $orig_tbls = $master_dbh->selectall_arrayref(
+        "SHOW TABLES FROM `$db`");
+
+    my $orig_max_id = $master_dbh->selectall_arrayref(
+        "SELECT MAX(`$pk_col`) FROM `$db`.`$tbl`");
+
+    my $triggers_sql = "SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER, ACTION_STATEMENT, SQL_MODE, "
+    . "       CHARACTER_SET_CLIENT, COLLATION_CONNECTION, EVENT_MANIPULATION, ACTION_TIMING "
+    . "  FROM INFORMATION_SCHEMA.TRIGGERS "
+    . " WHERE TRIGGER_SCHEMA = '$db' " 
+    .  "  AND EVENT_OBJECT_TABLE = '$tbl'";
+
+
+    my $orig_triggers = $master_dbh->selectall_arrayref($triggers_sql);
+
+    my ($orig_auto_inc) = $ddl =~ m/\s+AUTO_INCREMENT=(\d+)\s+/;
+
+    my $fk_method = $args{check_fks};
+    my @orig_fks;
+    if ( $fk_method ) {
+        foreach my $tbl ( @$orig_tbls ) {
+            my $fks = $tp->get_fks(
+                $tp->get_create_table($master_dbh, $db, $tbl->[0]));
+            push @orig_fks, $fks;
+        }
+    }
+
+    # If --no-drop-new-table is given, then the new, altered table
+    # should still exist, but not yet, so add it to the list so
+    # is_deeply() against $new_tbls passes.  This only works for
+    # single-table tests.
+    my $new_tbl = $args{new_table} || "_${tbl}_new";
+    if ( grep { $_ eq '--no-drop-new-table' } @$cmds ) {
+        unshift @$orig_tbls, [$new_tbl];
+    }
+
+    ($output, $exit) = full_output(
+        sub { pt_online_schema_change::main(
+                @args,
+                '--print',
+                "$dsn,D=$db,t=$tbl",
+                @$cmds,
+            )},
+        stderr => 1,
+    );
+
+    my $new_ddl = $tp->get_create_table($master_dbh, $db, $tbl);
+    my $new_tbl_struct = $tp->parse($new_ddl);
+    my $fail    = 0;
+
+    is(
+        $exit,
+        0,
+        "$name exit 0"
+    ) or $fail = 1;
+
+    # There should be no new or missing tables.
+    my $new_tbls = $master_dbh->selectall_arrayref("SHOW TABLES FROM `$db`");
+    is_deeply(
+        $new_tbls,
+        $orig_tbls,
+        "$name tables"
+    ) or $fail = 1;
+
+    # Rows in the original and new table should be identical.
+    my $new_rows = $master_dbh->selectall_arrayref("SELECT $cols FROM $table ORDER BY `$pk_col`");
+    is_deeply(
+        $new_rows,
+        $orig_rows,
+        "$name rows"
+    ) or $fail = 1;
+
+    if ( grep { $_ eq '--preserve-triggers' } @$cmds && !$delete_triggers) {
+        my $new_triggers = $master_dbh->selectall_arrayref($triggers_sql);
+        is_deeply(
+            $new_triggers,
+            $orig_triggers,
+            "$name triggers still exist"
+        ) or $fail = 1;
+    }
+
+    if ( grep { $_ eq '--no-drop-new-table' } @$cmds ) {
+        $new_rows = $master_dbh->selectall_arrayref(
+            "SELECT $cols FROM `$db`.`$new_tbl` ORDER BY `$pk_col`");
+        is_deeply(
+            $new_rows,
+            $orig_rows,
+            "$name new table rows"
+        ) or $fail = 1;
+    }
+
+    my $new_max_id = $master_dbh->selectall_arrayref(
+        "SELECT MAX(`$pk_col`) FROM `$db`.`$tbl`");
+    is(
+        $orig_max_id->[0]->[0],
+        $new_max_id->[0]->[0],
+        "$name MAX(pk_col)"
+    ) or $fail = 1;
+
+    my ($new_auto_inc) = $new_ddl =~ m/\s+AUTO_INCREMENT=(\d+)\s+/;
+    is(
+        $orig_auto_inc,
+        $new_auto_inc,
+        "$name AUTO_INCREMENT=" . ($orig_auto_inc || '<unknown>')
+    ) or $fail = 1;
+
+    # Check if the ALTER was actually done.
+    if ( $test_type eq 'drop_col' ) {
+        my $col = $q->quote($args{drop_col});
+
+        if ( grep { $_ eq '--dry-run' } @$cmds ) {
+            like(
+                $new_ddl,
+                qr/^\s+$col\s+/m,
+                "$name ALTER DROP COLUMN=$args{drop_col} (dry run)"
+            ) or $fail = 1;
+        }
+        else {
+            unlike(
+                $new_ddl,
+                qr/^\s+$col\s+/m,
+                "$name ALTER DROP COLUMN=$args{drop_col}"
+            ) or $fail = 1;
+        }
+    }
+    elsif ( $test_type eq 'add_col' ) {
+        if ( $args{no_change} ) {
+            ok(
+                !$new_tbl_struct->{is_col}->{$args{new_col}},
+                "$name $args{new_col} not added"
+            );
+        }
+        else {
+            ok(
+                $new_tbl_struct->{is_col}->{$args{new_col}},
+                "$name $args{new_col} added"
+            );
+        }
+    }
+    elsif ( $test_type eq 'new_engine' ) {
+        my $new_engine = lc($args{new_engine});
+        die "I need a new_engine argument" unless $new_engine;
+        my $rows = $master_dbh->selectall_hashref(
+            "SHOW TABLE STATUS FROM `$db`", "name");
+        is(
+            lc($rows->{$tbl}->{engine}),
+            $new_engine,
+            "$name ALTER ENGINE=$args{new_engine}"
+        ) or $fail = 1;
+
+    }
+
+    if ( $fk_method ) {
+        my @new_fks;
+        my $rebuild_method = 0;
+
+        foreach my $tbl ( @$orig_tbls ) {
+            my $fks = $tp->get_fks(
+                $tp->get_create_table($master_dbh, $db, $tbl->[0]));
+
+            # The tool does not use the same/original fk name,
+            # it appends a single _.  So we need to strip this
+            # to compare the original fks to the new fks.
+            # if ( $fk_method eq 'rebuild_constraints' ) {
+            if ( $fk_method eq 'rebuild_constraints'
+                || $table_name eq $tbl->[0] ) {
+                my %new_fks = map {
+                    my $real_fk_name = $_;
+                    my $fk_name      = $_;
+                    if ( $fk_name =~ s/^_// && $table_name ne $tbl->[0] ) {
+                        $rebuild_method = 1;
+                    }
+                    $fks->{$real_fk_name}->{name} =~ s/^_//;
+                    $fks->{$real_fk_name}->{ddl}  =~ s/`$real_fk_name`/`$fk_name`/;
+                    $fk_name => $fks->{$real_fk_name};
+                } keys %$fks;
+                push @new_fks, \%new_fks;
+            }
+            else {
+                # drop_swap
+                push @new_fks, $fks;
+            }
+        }
+
+        if ( grep { $_ eq '--execute' } @$cmds ) {
+            ok(
+                $fk_method eq 'rebuild_constraints' &&  $rebuild_method ? 1
+                : $fk_method eq 'drop_swap'           && !$rebuild_method ? 1
+                :                                                           0,
+                "$name FK $fk_method method"
+            );
+        }
+    }
+
+    if ( $fail ) {
+        diag("Output from failed test:\n$output");
+    }
+    elsif ( $args{output} ) {
+        warn $output;
+    }
+
+    my $new_triggers = $master_dbh->selectall_arrayref($triggers_sql);
+    is_deeply(
+        $orig_triggers,
+        $new_triggers,
+        'Triggers should remain in place',
+    );
+
+    return;
+}
+
+test_alter_table(
+    name        => "Basic FK auto --execute",
+    table       => "test.aaa",
+    pk_col      => "id",
+    file        => "pt-1914.sql",
+    test_type   => "add_col",
+    new_col     => "last_update",
+    check_fks   => "drop_swap",
+    cmds        => [
+        qw(
+        --execute --statistics --print
+        --alter-foreign-keys-method drop_swap 
+        --preserve-triggers
+        ),
+        '--alter', 'ADD COLUMN last_update DATE',
+    ],
+);
+
+$rows = $master_dbh->selectall_arrayref( "SELECT * FROM test.aaa");
+my $want = [
+    [ 1, 'a', 1, undef ],
+    [ 2, 'b', 2, undef ],
+    [ 3, 'c', undef, undef ],
+    [ 4, 'd', 4, undef ],
+    [ 5, 'e', undef, undef ],
+    [ 6, 'f', 6, undef ]
+];
+
+is_deeply(
+    $rows,
+    $want,
+    'Row values in generated column remain intact',
+);
+
+# #############################################################################
+# Done.
+# #############################################################################
+$sb->wipe_clean($master_dbh);
+ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
+done_testing;
diff --git a/t/pt-online-schema-change/preserve_triggers.t b/t/pt-online-schema-change/pt-1919.t
similarity index 64%
rename from t/pt-online-schema-change/preserve_triggers.t
rename to t/pt-online-schema-change/pt-1919.t
index d3c9797..ecd0cbd 100644
--- a/t/pt-online-schema-change/preserve_triggers.t
+++ b/t/pt-online-schema-change/pt-1919.t
@@ -95,6 +95,8 @@ sub test_alter_table {
                     . "  FROM INFORMATION_SCHEMA.TRIGGERS "
                     . " WHERE TRIGGER_SCHEMA = '$db' " 
                     .  "  AND EVENT_OBJECT_TABLE = '$tbl'";
+
+
    my $orig_triggers = $master_dbh->selectall_arrayref($triggers_sql);
 
    my ($orig_auto_inc) = $ddl =~ m/\s+AUTO_INCREMENT=(\d+)\s+/;
@@ -302,178 +304,45 @@ sub test_alter_table {
       warn $output;
    }
 
+   my $new_triggers = $master_dbh->selectall_arrayref($triggers_sql);
+   is_deeply(
+       $orig_triggers,
+       $new_triggers,
+       'Triggers should remain in place',
+   );
+
    return;
 }
-# #############################################################################
-# Tests for --preserve-triggers option
-# #############################################################################
 
 SKIP: {
-   skip 'Sandbox MySQL version should be >= 5.7' unless $sandbox_version ge '5.7';
+    skip 'Sandbox MySQL version should be >= 5.7' unless $sandbox_version ge '5.7';
 
-    test_alter_table(
-       name       => 'Basic --preserve-triggers',
-       table      => "pt_osc.account",
-       pk_col     => "id",
-       file       => "triggers.sql",
-       test_type  => "add_col",
-       new_col    => "foo",
-       cmds       => [
-          qw(--execute --preserve-triggers), '--alter', 'ADD COLUMN foo INT',
-       ],
-    );
-    
-    test_alter_table(
-       name       => "--preserve-triggers: after triggers",
-       table      => "test.t1",
-       pk_col     => "id",
-       file       => "after_triggers.sql",
-       test_type  => "add_col",
-       new_col    => "foo3",
-       cmds       => [
-          qw(--execute --preserve-triggers --alter-foreign-keys-method rebuild_constraints), '--alter', 'ADD COLUMN foo3 INT',
-       ],
-    );
-    
-    
-    $sb->load_file('master', "$sample/after_triggers.sql");
-
-    ($output, $exit) = full_output(
-       sub { pt_online_schema_change::main(@args,
-          "$dsn,D=test,t=t1", 
-          qw(--execute --preserve-triggers), '--alter', 'DROP COLUMN f1')
-       },
-       stderr => 1,
-    );
-    
-    isnt(
-          $exit,
-          0,
-          "--preserve-triggers cannot drop column used by trigger",
-    );
-
-    like( 
-          $output,
-          qr/Check if all fields referenced by the trigger still exists after the operation you are trying to apply/,
-          "--preserve-triggers: message if try to drop a field used by triggers",
-    );
-
-    ($output, $exit) = full_output(
-       sub { pt_online_schema_change::main(@args,
-          "$dsn,D=test,t=t1", 
-          qw(--execute --no-swap-tables --preserve-triggers), '--alter', 'ADD COLUMN foo INT')
-       },
-       stderr => 1,
-    );
-    
-    is(
-       $exit,
-       0,
-       "--preserve-triggers --no-swap-tables exit status",
-    );
-    
-    $sb->load_file('master', "$sample/after_triggers.sql");
-
-    ($output, $exit) = full_output(
-       sub { pt_online_schema_change::main(@args,
-          "$dsn,D=test,t=t1", 
-          qw(--execute --no-drop-old-table --preserve-triggers), '--alter', 'ADD COLUMN foo INT')
-       },
-       stderr => 1,
-    );
-    
-    is(
-          $exit,
-          0,
-          "--preserve-triggers --no-drop-old-table exit status",
-    );
-
-    my $rows = $master_dbh->selectall_arrayref("SHOW TABLES LIKE '%t1%'");
-    is_deeply(
-          $rows,
-          [ [ '_t1_old' ], [ 't1' ] ],
-          "--preserve-triggers --no-drop-old-table original & new tables still exists",
-    );
-
-    ($output, $exit) = full_output(
-       sub { pt_online_schema_change::main(@args,
-          "$dsn,D=pt_osc,t=t", 
-          qw(--execute --no-drop-triggers --preserve-triggers), '--alter', 'ADD COLUMN foo INT')
-       },
-       stderr => 1,
-    );
-    
-    isnt(
-          $exit,
-          0,
-          "--preserve-triggers cannot be used --no-drop-triggers",
-    );
+    $sb->load_file('master', "$sample/pt-1919.sql");
 
     test_alter_table(
-       name        => "Basic FK auto --execute",
-       table       => "pt_osc.country",
-       pk_col      => "country_id",
-       file        => "basic_with_fks.sql",
-       test_type   => "drop_col",
-       drop_col    => "last_update",
-       check_fks   => "rebuild_constraints",
-       cmds        => [
-       qw(
-          --execute
-          --alter-foreign-keys-method rebuild_constraints
-          --preserve-triggers
-       ),
-          '--alter', 'DROP COLUMN last_update',
-       ],
+        name        => "Basic FK auto --execute",
+        table       => "test.aaa",
+        pk_col      => "id",
+        file        => "pt-1919.sql",
+        test_type   => "add_col",
+        new_col     => "last_update",
+        check_fks   => "drop_swap",
+        cmds        => [
+            qw(
+            --execute --statistics --print
+            --alter-foreign-keys-method drop_swap 
+            --preserve-triggers
+            ),
+            '--alter', 'ADD COLUMN last_update DATE',
+        ],
     );
 
-    test_alter_table(
-       name            => "--preserve-triggers: --no-swap-tables --drop-new-table",
-       table           => "test.t1",
-       pk_col          => "id",
-       file            => "after_triggers.sql",
-       test_type       => "add_col",
-       new_col         => "foo4",
-       no_change       => 1,
-       delete_triggers => 1,
-       cmds            => [
-                             qw(--execute --preserve-triggers --no-swap-tables --drop-new-table 
-                                --alter-foreign-keys-method rebuild_constraints),
-                             '--alter', 'ADD COLUMN foo4 INT',
-                          ],
-    );
-    
 }
 
-diag("Reloading sakila");
-my $master_port = $sb->port_for('master');
-system "$trunk/sandbox/load-sakila-db $master_port &";
-
-if ($sandbox_version ge '8.0') {
-    $sb->do_as_root("master", q/CREATE USER 'slave_user'@'%' IDENTIFIED WITH mysql_native_password BY 'slave_password'/);
-} else {
-    $sb->do_as_root("master", q/CREATE USER 'slave_user'@'%' IDENTIFIED BY 'slave_password'/);
-}
-$sb->do_as_root("master", q/GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%'/);
-$sb->do_as_root("master", q/set sql_log_bin=0/);
-$sb->do_as_root("master", q/DROP USER 'slave_user'/);
-$sb->do_as_root("master", q/set sql_log_bin=1/);
-
-test_alter_table(
-   name       => "--slave-user --slave-password",
-   file       => "basic_no_fks_innodb.sql",
-   table      => "pt_osc.t",
-   test_type  => "add_col",
-   new_col    => "bar",
-   cmds       => [
-         qw(--execute --slave-user slave_user --slave-password slave_password), '--alter', 'ADD COLUMN bar INT',
-   ],
-);
 # #############################################################################
 # Done.
 # #############################################################################
 $sb->wipe_clean($master_dbh);
-$sb->wait_for_slaves();
 ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
 #
 done_testing;
diff --git a/t/pt-online-schema-change/samples/pt-1528.sql b/t/pt-online-schema-change/samples/pt-1528.sql
new file mode 100644
index 0000000..91c4bfc
--- /dev/null
+++ b/t/pt-online-schema-change/samples/pt-1528.sql
@@ -0,0 +1,68 @@
+-- MySQL dump 10.13  Distrib 5.7.19-17, for debian-linux-gnu (x86_64)
+--
+-- Host: localhost    Database: test
+-- ------------------------------------------------------
+-- Server version	5.7.19-17-log
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+/*!50717 SELECT COUNT(*) INTO @rocksdb_has_p_s_session_variables FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'session_variables' */;
+/*!50717 SET @rocksdb_get_is_supported = IF (@rocksdb_has_p_s_session_variables, 'SELECT COUNT(*) INTO @rocksdb_is_supported FROM performance_schema.session_variables WHERE VARIABLE_NAME=\'rocksdb_bulk_load\'', 'SELECT 0') */;
+/*!50717 PREPARE s FROM @rocksdb_get_is_supported */;
+/*!50717 EXECUTE s */;
+/*!50717 DEALLOCATE PREPARE s */;
+/*!50717 SET @rocksdb_enable_bulk_load = IF (@rocksdb_is_supported, 'SET SESSION rocksdb_bulk_load = 1', 'SET @rocksdb_dummy_bulk_load = 0') */;
+/*!50717 PREPARE s FROM @rocksdb_enable_bulk_load */;
+/*!50717 EXECUTE s */;
+/*!50717 DEALLOCATE PREPARE s */;
+
+--
+-- Table structure for table `brokenutf8alter`
+--
+
+DROP DATABASE IF EXISTS test;
+CREATE DATABASE test;
+
+USE test;
+
+DROP TABLE IF EXISTS `brokenutf8alter`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `brokenutf8alter` (
+  `ID` binary(16) NOT NULL,
+  PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `brokenutf8alter`
+--
+
+LOCK TABLES `brokenutf8alter` WRITE;
+/*!40000 ALTER TABLE `brokenutf8alter` DISABLE KEYS */;
+INSERT INTO `brokenutf8alter` VALUES ('.SG�:\�\�B�\0'),('.SK,:\�\�B�\0'),('.SL_:\�\�B�\0'),('.SL\�:\�\�B�\0'),('.SMB:\�\�B�\0'),('.SM�:\�\�B�\0'),('.SM�:\�\�B�\0'),('.SOE:\�\�B�\0'),('.SO�:\�\�B�\0'),('.SP:\�\�B�\0'),('.SPZ:\�\�B�\0'),('.SP�:\�\�B�\0'),('.SQ:\�\�B�\0'),('.SQX:\�\�B�\0'),('.SQ�:\�\�B�\0'),('.SQ�:\�\�B�\0'),('.SRK:\�\�B�\0'),('.ST4:\�\�B�\0'),('.SU=:\�\�B�\0'),('.SU�:\�\�B�\0'),('.SU�:\�\�B�\0'),('.SVC:\�\�B�\0'),('.SV�:\�\�B�\0'),('.SV\�:\�\�B�\0'),('.SW8:\�\�B�\0'),('.SW�:\�\�B�\0'),('.SX\�:\�\�B�\0'),('.SY\":\�\�B�\0'),('.SYr:\�\�B�\0'),('.SY\�:\�\�B�\0'),('.SZ:\�\�B�\0'),('.SZ�:\�\�B�\0'),('.S[):\�\�B�\0'),('.S[�:\�\�B�\0'),('.S\\N:\�\�B�\0'),('.S\\\�:\�\�B�\0'),('.S]>:\�\�B�\0'),('.S]�:\�\�B�\0'),('.S]\�:\�\�B�\0'),('.S^.:\�\�B�\0'),('.S^:\�\�B�\0'),('.S^\�:\�\�B�\0'),('.S_8:\�\�B�\0'),('.S_�:\�\�B�\0'),('.S`W:\�\�B�\0'),('.S`�:\�\�B�\0'),('.Sa~:\�\�B�\0'),('.Sb:\�\�B�\0'),('.Sb�:\�\�B�\0'),('.Sc>:\�\�B�\0'),('.Sc\�:\�\�B�\0'),('.Sd:\�\�B�\0'),('.Sdv:\�\�B�\0'),('.Sd\�:\�\�B�\0'),('.Se:\�\�B�\0'),('.Seb:\�\�B�\0'),('.Se�:\�\�B�\0'),('.Sf:\�\�B�\0'),('.SfP:\�\�B�\0'),('.Sf�:\�\�B�\0'),('.Sf�:\�\�B�\0'),('.Sg?:\�\�B�\0'),('.Sg�:\�\�B�\0'),('.Sh:\�\�B�\0'),('.Sh�:\�\�B�\0'),('.Si7:\�\�B�\0'),('.Si\�:\�\�B�\0'),('.Sji:\�\�B�\0'),('.Sk:\�\�B�\0'),('.Sk�:\�\�B�\0'),('.Sk\�:\�\�B�\0'),('.Sl(:\�\�B�\0'),('.Sl{:\�\�B�\0'),('.Sl\�:\�\�B�\0'),('.Sm\Z:\�\�B�\0'),('.Smh:\�\�B�\0'),('.Sm�:\�\�B�\0'),('.Sn:\�\�B�\0'),('.So:\�\�B�\0'),('.Sob:\�\�B�\0'),('.So�:\�\�B�\0'),('.Sp:\�\�B�\0'),('.SpQ:\�\�B�\0'),('.Sp�:\�\�B�\0'),('.Sp�:\�\�B�\0'),('.SqA:\�\�B�\0'),('.Sq�:\�\�B�\0'),('.Sq\�:\�\�B�\0'),('.Sr+:\�\�B�\0'),('.Srv:\�\�B�\0'),('.Sr�:\�\�B�\0'),('.Ss:\�\�B�\0'),('.Ss_:\�\�B�\0'),('.St:\�\�B�\0'),('.St :\�\�B�\0'),('.St5:\�\�B�\0'),('.StI:\�\�B�\0'),('.St^:\�\�B�\0'),('.Str:\�\�B�\0'),('.St�:\�\�B�\0'),('.St�:\�\�B�\0');
+/*!40000 ALTER TABLE `brokenutf8alter` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!50112 SET @disable_bulk_load = IF (@is_rocksdb_supported, 'SET SESSION rocksdb_bulk_load = @old_rocksdb_bulk_load', 'SET @dummy_rocksdb_bulk_load = 0') */;
+/*!50112 PREPARE s FROM @disable_bulk_load */;
+/*!50112 EXECUTE s */;
+/*!50112 DEALLOCATE PREPARE s */;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2018-04-07  3:48:50
diff --git a/t/pt-online-schema-change/samples/pt-153.sql b/t/pt-online-schema-change/samples/pt-153.sql
index 47b5035..cae106a 100644
--- a/t/pt-online-schema-change/samples/pt-153.sql
+++ b/t/pt-online-schema-change/samples/pt-153.sql
@@ -2,11 +2,10 @@ DROP DATABASE IF EXISTS test;
 CREATE DATABASE test;
 USE test;
 CREATE TABLE test.t1 (
-id int,
+id int AUTO_INCREMENT PRIMARY KEY,
 f2 int, 
 f3 int NULL,
-f4 int,
-PRIMARY KEY (id)
+f4 int
 );
 
 INSERT INTO test.t1 VALUES
diff --git a/t/pt-online-schema-change/samples/pt-169.sql b/t/pt-online-schema-change/samples/pt-169.sql
new file mode 100644
index 0000000..39e63cf
--- /dev/null
+++ b/t/pt-online-schema-change/samples/pt-169.sql
@@ -0,0 +1,40 @@
+DROP DATABASE IF EXISTS `test`;
+CREATE DATABASE test;
+USE test;
+
+CREATE TABLE `users` (
+  `id` int(10) unsigned NOT NULL,
+  `username` varchar(255) NOT NULL,
+  `full_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL,
+  `is_verified` tinyint(1) NOT NULL DEFAULT '0',
+  `is_private` tinyint(1) NOT NULL DEFAULT '0',
+  `profile_pic_url` varchar(255) DEFAULT NULL,
+  `follower_count` int(11) NOT NULL DEFAULT '0',
+  `following_count` int(11) NOT NULL DEFAULT '0',
+  `media_count` int(11) NOT NULL DEFAULT '0',
+  `biography` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
+  `user_active` tinyint(1) NOT NULL DEFAULT '1',
+  PRIMARY KEY (`id`),
+  KEY `username` (`username`),
+  KEY `follower_count` (`follower_count`),
+  KEY `following_count` (`following_count`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE `user_comments` (
+  `id_user_comments` int(11) NOT NULL AUTO_INCREMENT,
+  `msg` varchar(255) DEFAULT NULL,
+  `user_id` int(10) unsigned DEFAULT NULL,
+  PRIMARY KEY (`id_user_comments`),
+  KEY `fk1_idx` (`user_id`),
+  CONSTRAINT `fk1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
+
+
+INSERT INTO `test`.`users` (`id`, `username`, `full_name`, `is_verified`, `is_private`, `profile_pic_url`,
+`follower_count`, `following_count`, `media_count`, `biography`, `user_active`)
+VALUES
+(1, "zappb", "zapp brannigan", 1, 1, "https://pbs.twimg.com/profile_images/447660347273408512/NdZEGKvr.jpeg", 0, 0, 0, "", 1);
+ 
+INSERT INTO `test`.`user_comments` (`id_user_comments`, `msg`, `user_id`)
+VALUES
+(1, "I am the man with no name. Zapp Brannigan, at your service.", 1);
diff --git a/t/pt-online-schema-change/samples/pt-1898.sql b/t/pt-online-schema-change/samples/pt-1898.sql
new file mode 100644
index 0000000..3f7be4d
--- /dev/null
+++ b/t/pt-online-schema-change/samples/pt-1898.sql
@@ -0,0 +1,36 @@
+-- give master some advantage on performance
+SET GLOBAL innodb_flush_log_at_trx_commit=2;
+SET GLOBAL sync_binlog=1000000;
+SET GLOBAL innodb_buffer_pool_size=2*1024*1024*1024;
+
+DROP DATABASE IF EXISTS test;
+CREATE DATABASE test;.
+USE test;
+ 
+DROP TABLE IF EXISTS `joinit`;
+ 
+CREATE TABLE `joinit` (
+ `i` int(11) NOT NULL AUTO_INCREMENT,
+ `s` varchar(64) DEFAULT NULL,
+ `t` time NOT NULL,
+ `g` int(11) NOT NULL,
+ PRIMARY KEY (`i`),
+ KEY g_idx (g)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+INSERT INTO joinit VALUES (NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )));
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit; -- +256 rows
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit; -- +512 rows
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit; -- +1024 rows
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit; 
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit; 
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit; 
+INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;
diff --git a/t/pt-online-schema-change/samples/pt-1914.sql b/t/pt-online-schema-change/samples/pt-1914.sql
new file mode 100644
index 0000000..45437c0
--- /dev/null
+++ b/t/pt-online-schema-change/samples/pt-1914.sql
@@ -0,0 +1,18 @@
+DROP DATABASE IF EXISTS test;
+CREATE DATABASE test;
+USE test;
+
+CREATE TABLE `aaa` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `Password` varchar(100) NOT NULL DEFAULT '' COMMENT 'Generated',
+ `v` int(11) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
+
+INSERT INTO test.aaa VALUES 
+(1, "a", 1), 
+(2, "b", 2), 
+(3, "c", NULL),
+(4, "d", 4),
+(5, "e", NULL), 
+(6, "f", 6);
diff --git a/t/pt-online-schema-change/samples/pt-1919.sql b/t/pt-online-schema-change/samples/pt-1919.sql
new file mode 100644
index 0000000..2872044
--- /dev/null
+++ b/t/pt-online-schema-change/samples/pt-1919.sql
@@ -0,0 +1,39 @@
+DROP DATABASE IF EXISTS test;
+CREATE DATABASE test;
+USE test;
+
+CREATE TABLE aaa (
+  id int NOT NULL AUTO_INCREMENT,
+  a int DEFAULT 0,
+  b int DEFAULT 0,
+  x int DEFAULT 0,
+  z int DEFAULT NULL,
+  PRIMARY KEY (`id`)
+);
+
+CREATE TABLE bbb (
+  id int NOT NULL AUTO_INCREMENT,
+  aaa_id int DEFAULT NULL,
+  c int DEFAULT 0,
+  d int DEFAULT 0,
+  x int DEFAULT 0,
+  modification_date datetime(3),
+  PRIMARY KEY (`id`),
+  CONSTRAINT `FK_aaa_id` FOREIGN KEY (`aaa_id`) REFERENCES aaa (`id`) 
+);
+
+CREATE TRIGGER before_aaa_upd1 BEFORE UPDATE ON aaa FOR EACH ROW set new.a = old.a+1;
+CREATE TRIGGER before_aaa_upd2 BEFORE UPDATE ON aaa FOR EACH ROW set new.b = old.b+1;
+CREATE TRIGGER after_aaa_upd3 AFTER UPDATE ON aaa FOR EACH ROW update bbb set c = c+1 WHERE aaa_id = NEW.id;
+CREATE TRIGGER after_aaa_upd4 AFTER UPDATE ON aaa FOR EACH ROW update bbb set d = d+1 WHERE aaa_id = NEW.id;
+
+DELIMITER $$
+CREATE TRIGGER before_aaa_upd5 BEFORE UPDATE ON aaa FOR EACH ROW 	BEGIN UPDATE bbb SET modification_date = UTC_TIMESTAMP(3) WHERE aaa_id = NEW.id; END;
+$$
+CREATE TRIGGER after_aaa_upd6 AFTER UPDATE ON aaa FOR EACH ROW 	BEGIN UPDATE bbb SET x = x+1 WHERE aaa_id = NEW.id; END;
+$$
+DELIMITER ;
+
+INSERT INTO aaa (x) VALUES (10),(20),(30),(40),(50);
+INSERT INTO bbb (aaa_id) VALUES (1), (2), (3), (3);
+-- UPDATE aaa SET z=id-1 WHERE id=2;
diff --git a/t/pt-online-schema-change/slave_lag.t_ b/t/pt-online-schema-change/slave_lag.t
similarity index 96%
rename from t/pt-online-schema-change/slave_lag.t_
rename to t/pt-online-schema-change/slave_lag.t
index 0fe9781..30f0fb9 100644
--- a/t/pt-online-schema-change/slave_lag.t_
+++ b/t/pt-online-schema-change/slave_lag.t
@@ -22,8 +22,10 @@ use File::Temp qw/ tempdir tempfile /;
 if ($ENV{PERCONA_SLOW_BOX}) {
     plan skip_all => 'This test needs a fast machine';
 } else {
-    plan tests => 6;
-}
+    #plan tests => 6;
+    plan skip_all => 'This test is taking too much time even in fast machines';
+}                                  
+
 our $delay = 30;
 
 my $tmp_file = File::Temp->new();
@@ -39,10 +41,6 @@ my $slave_dbh = $sb->get_dbh_for('slave1');
 my $master_dsn = 'h=127.0.0.1,P=12345,u=msandbox,p=msandbox';
 my $slave_dsn = 'h=127.0.0.1,P=12346,u=msandbox,p=msandbox';
 
-if ( !$master_dbh ) {
-   plan skip_all => 'Cannot connect to sandbox master';
-}
-
 sub reset_query_cache {
     my @dbhs = @_;
     return if ($sandbox_version >= '8.0');
@@ -64,7 +62,7 @@ $sb->load_file('master', "t/pt-online-schema-change/samples/slave_lag.sql");
 
 my $num_rows = 5000;
 diag("Loading $num_rows into the table. This might take some time.");
-diag(`util/mysql_random_data_load --host=127.0.0.1 --port=12345 --user=msandbox --password=msandbox test pt178 --bulk-size=1 --max-threads=1 $num_rows`);
+diag(`util/mysql_random_data_load --host=127.0.0.1 --port=12345 --user=msandbox --password=msandbox test pt178 $num_rows`);
 
 diag("Setting slave delay to $delay seconds");
 
diff --git a/t/pt-query-digest/samples/binlog001.txt b/t/pt-query-digest/samples/binlog001.txt
index 24eded0..026d3c7 100644
--- a/t/pt-query-digest/samples/binlog001.txt
+++ b/t/pt-query-digest/samples/binlog001.txt
@@ -216,11 +216,11 @@ insert into test1.tbl6
          metric12 = metric12 + values(metric12), secs = secs + values(secs)\G
 
 # Profile
-# Rank Query ID                           Response time    Calls R/Call   
-# ==== ================================== ================ ===== =========
-#    1 0xE82A828B855B8A64CD948EAF18BC614E 20704.0000 16.7%     1 20704.0000  0.00 REPLACE SELECT test?.tbl? test?.tblo test?.tbl?
-#    2 0xF16F3C71626070A8C356FD9EFD7D799E 20675.0000 16.7%     1 20675.0000  0.00 UPDATE test?.tblo test?.tbl?
-#    3 0xD2CB5CE49F609121B5E55291C7DE1096 20664.0000 16.7%     1 20664.0000  0.00 UPDATE test?.tblo test?.tbl?
-#    4 0x8D589AFA4DFAEEED85FFF5AA78E5FF6A 20664.0000 16.7%     1 20664.0000  0.00 BEGIN
-#    5 0xCCEBC6F06883270EED69B13F3D0161D0 20661.0000 16.7%     1 20661.0000  0.00 UPDATE test?.tbl?
-#    6 0xB80726C1C01E650979BFEA84D0CED05F 20661.0000 16.7%     1 20661.0000  0.00 INSERT UPDATE test?.tbl?
+# Rank Query ID                            Response time    Calls R/Call  
+# ==== =================================== ================ ===== ========
+#    1 0xE82A828B855B8A64CD948EAF18BC614E  20704.0000 16.7%     1 20704.0000  0.00 REPLACE SELECT test?.tbl? test?.tblo test?.tbl?
+#    2 0xF16F3C71626070A8C356FD9EFD7D799E  20675.0000 16.7%     1 20675.0000  0.00 UPDATE test?.tblo test?.tbl?
+#    3 0xD2CB5CE49F609121B5E55291C7DE1096  20664.0000 16.7%     1 20664.0000  0.00 UPDATE test?.tblo test?.tbl?
+#    4 0x8D589AFA4DFAEEED85FFF5AA78E5FF6A  20664.0000 16.7%     1 20664.0000  0.00 BEGIN
+#    5 0xCCEBC6F06883270EED69B13F3D0161D0  20661.0000 16.7%     1 20661.0000  0.00 UPDATE test?.tbl?
+#    6 0xB80726C1C01E650979BFEA84D0CED05F  20661.0000 16.7%     1 20661.0000  0.00 INSERT UPDATE test?.tbl?
diff --git a/t/pt-query-digest/samples/binlog002.txt b/t/pt-query-digest/samples/binlog002.txt
index a3fb805..dfe6860 100644
--- a/t/pt-query-digest/samples/binlog002.txt
+++ b/t/pt-query-digest/samples/binlog002.txt
@@ -95,8 +95,8 @@ create table foo (i int)\G
 create database d\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x184C72455CBE7450F579EC4A9633EEA0  0.0000  0.0%     1 0.0000  0.00 INSERT foo
-#    2 0x4C73A3608535A07A03409022EB8A4AE7  0.0000  0.0%     1 0.0000  0.00 CREATE TABLE foo
-#    3 0x3EDE13F29C785C9EF25D6D5AC7C18FF3  0.0000  0.0%     1 0.0000  0.00 CREATE DATABASE d
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x184C72455CBE7450F579EC4A9633EEA0   0.0000  0.0%     1 0.0000  0.00 INSERT foo
+#    2 0x4C73A3608535A07A03409022EB8A4AE7   0.0000  0.0%     1 0.0000  0.00 CREATE TABLE foo
+#    3 0x3EDE13F29C785C9EF25D6D5AC7C18FF3   0.0000  0.0%     1 0.0000  0.00 CREATE DATABASE d
diff --git a/t/pt-query-digest/samples/binlog011.txt b/t/pt-query-digest/samples/binlog011.txt
index 069f97b..7126a36 100644
--- a/t/pt-query-digest/samples/binlog011.txt
+++ b/t/pt-query-digest/samples/binlog011.txt
@@ -680,26 +680,26 @@ ORDER BY cy.country, c.city\G
 INSERT INTO `address` VALUES (1,'47 MySakila Drive',NULL,'Alberta',300,'','','2006-02-15 11:45:30') /*... omitted ...*/\G
 
 # Profile
-# Rank Query ID                         Response time Calls R/Call V/M   I
-# ==== ================================ ============= ===== ====== ===== =
-#    1 0x8D589AFA4DFAEEED85FFF5AA78E... 19.0000 33.3%    22 0.8636  3.67 BEGIN
-#    2 0xD1D19A39A5189A3A693F5F4CA1A...  7.0000 12.3%     2 3.5000  7.00 INSERT rental
-#    3 0x6692BFEDE6AB56814677E4CEDF8...  5.0000  8.8%     2 2.5000  5.00 INSERT payment
-#    4 0x266D117CFD8ED7C1AAECC8184D1...  3.0000  5.3%     1 3.0000  0.00 INSERT film
-#    5 0x5D2F650658D1B9C51A3BF395BD4...  2.0000  3.5%     1 2.0000  0.00 CREATE TABLE store `store`
-#    6 0xCBD4B02B76FCD5BCD8657A03D07...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE payment `payment`
-#    7 0x1B49B966156BD5391405E69931A...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE language `language`
-#    8 0x0DE767BB5A2112B83B0263BE336...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE actor `actor`
-#    9 0xC7D5A4E49E422A5209482CA2620...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE city `city`
-#   10 0x06B95BC192D493BF80F6ECA81D5...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE category `category`
-#   11 0x2191F33283A3743FAE6D99E149C...  1.0000  1.8%     1 1.0000  0.00 INSERT inventory
-#   12 0xFFDE0605772D1BD0E771A1D1EAD...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE inventory `inventory`
-#   13 0x1161695D97D5E56D8A380065832...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE film_text `film_text`
-#   14 0xE9F9A7EE464D666B0FD12A9C9BF...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE film_category `film_category`
-#   15 0x28F5E254B8810D1293E5C17055D...  1.0000  1.8%     1 1.0000  0.00 INSERT film_actor
-#   16 0xB25BC072BED6DE4E7677746C22C...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE film_actor `film_actor`
-#   17 0x45781B86D83AE665EE462EEBC76...  1.0000  1.8%     1 1.0000  0.00 CREATE TABLE percona_test.checksums
-#   18 0x2F981A9FC6992839C5F99E5B57D...  1.0000  1.8%     1 1.0000  0.00 
-#   19 0xC16F5DCD62BA36A15C6D8C73D42...  1.0000  1.8%     1 1.0000  0.00 CREATE payment rental inventory store address city country staff
-#   20 0x6846663BC60B4FF9D62F1A6D5A6...  1.0000  1.8%     1 1.0000  0.00 INSERT address
-# MISC 0xMISC                            6.0000 10.5%    95 0.0632   0.0 <72 ITEMS>
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x8D589AFA4DFAEEED85FFF5AA78E5FF6A  19.0000 33.3%    22 0.8636  3.67 BEGIN
+#    2 0xD1D19A39A5189A3A693F5F4CA1A936BA   7.0000 12.3%     2 3.5000  7.00 INSERT rental
+#    3 0x6692BFEDE6AB56814677E4CEDF8EA4E2   5.0000  8.8%     2 2.5000  5.00 INSERT payment
+#    4 0x266D117CFD8ED7C1AAECC8184D17D799   3.0000  5.3%     1 3.0000  0.00 INSERT film
+#    5 0x5D2F650658D1B9C51A3BF395BD4C2AC5   2.0000  3.5%     1 2.0000  0.00 CREATE TABLE store `store`
+#    6 0xCBD4B02B76FCD5BCD8657A03D0724524   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE payment `payment`
+#    7 0x1B49B966156BD5391405E69931A1FC8D   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE language `language`
+#    8 0x0DE767BB5A2112B83B0263BE3363F7DF   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE actor `actor`
+#    9 0xC7D5A4E49E422A5209482CA2620152A7   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE city `city`
+#   10 0x06B95BC192D493BF80F6ECA81D5F0D25   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE category `category`
+#   11 0x2191F33283A3743FAE6D99E149CE09C6   1.0000  1.8%     1 1.0000  0.00 INSERT inventory
+#   12 0xFFDE0605772D1BD0E771A1D1EAD499BA   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE inventory `inventory`
+#   13 0x1161695D97D5E56D8A38006583244505   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE film_text `film_text`
+#   14 0xE9F9A7EE464D666B0FD12A9C9BF3E41F   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE film_category `film_category`
+#   15 0x28F5E254B8810D1293E5C17055D970BE   1.0000  1.8%     1 1.0000  0.00 INSERT film_actor
+#   16 0xB25BC072BED6DE4E7677746C22CD9F16   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE film_actor `film_actor`
+#   17 0x45781B86D83AE665EE462EEBC76A46F2   1.0000  1.8%     1 1.0000  0.00 CREATE TABLE percona_test.checksums
+#   18 0x2F981A9FC6992839C5F99E5B57D2D6DB   1.0000  1.8%     1 1.0000  0.00 
+#   19 0xC16F5DCD62BA36A15C6D8C73D42AE624   1.0000  1.8%     1 1.0000  0.00 CREATE payment rental inventory store address city country staff
+#   20 0x6846663BC60B4FF9D62F1A6D5A67AFA8   1.0000  1.8%     1 1.0000  0.00 INSERT address
+# MISC 0xMISC                               6.0000 10.5%    95 0.0632   0.0 <72 ITEMS>
diff --git a/t/pt-query-digest/samples/cannot-distill-profile.txt b/t/pt-query-digest/samples/cannot-distill-profile.txt
index 15f7c3e..01ebc8b 100644
--- a/t/pt-query-digest/samples/cannot-distill-profile.txt
+++ b/t/pt-query-digest/samples/cannot-distill-profile.txt
@@ -1,6 +1,6 @@
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x480546EB8B8460BD5B721CAE3EDDB56B  0.0900 69.1%     1 0.0900  0.00 
-#    2 0x3309663231C2F066BE90A42C0FB7E89E  0.0403 30.9%     1 0.0403  0.00 
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x480546EB8B8460BD5B721CAE3EDDB56B   0.0900 69.1%     1 0.0900  0.00 
+#    2 0x3309663231C2F066BE90A42C0FB7E89E   0.0403 30.9%     1 0.0403  0.00 
diff --git a/t/pt-query-digest/samples/genlog001.txt b/t/pt-query-digest/samples/genlog001.txt
index dc4d3f7..af87bc0 100644
--- a/t/pt-query-digest/samples/genlog001.txt
+++ b/t/pt-query-digest/samples/genlog001.txt
@@ -125,10 +125,10 @@ SELECT DISTINCT col FROM tbl WHERE foo=20061219\G
 administrator command: Init DB\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xEDBC971AEC392917AA353644DE4C4CB4  0.0000  0.0%     2 0.0000  0.00 ADMIN QUIT
-#    2 0x7417646A9FE969365D51E5F01B88B79E  0.0000  0.0%     2 0.0000  0.00 ADMIN CONNECT
-#    3 0x373CEA028C0EA95444AAC79F41BCF692  0.0000  0.0%     1 0.0000  0.00 SELECT tbl
-#    4 0x30388146EA1DA5814D096479916B0F45  0.0000  0.0%     1 0.0000  0.00 SELECT tbl
-#    5 0x898255B1BE4F8C3044AE35A182869033  0.0000  0.0%     1 0.0000  0.00 ADMIN INIT DB
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xEDBC971AEC392917AA353644DE4C4CB4   0.0000  0.0%     2 0.0000  0.00 ADMIN QUIT
+#    2 0x7417646A9FE969365D51E5F01B88B79E   0.0000  0.0%     2 0.0000  0.00 ADMIN CONNECT
+#    3 0x373CEA028C0EA95444AAC79F41BCF692   0.0000  0.0%     1 0.0000  0.00 SELECT tbl
+#    4 0x30388146EA1DA5814D096479916B0F45   0.0000  0.0%     1 0.0000  0.00 SELECT tbl
+#    5 0x898255B1BE4F8C3044AE35A182869033   0.0000  0.0%     1 0.0000  0.00 ADMIN INIT DB
diff --git a/t/pt-query-digest/samples/genlog002.txt b/t/pt-query-digest/samples/genlog002.txt
index c12e2cf..03f8e4e 100644
--- a/t/pt-query-digest/samples/genlog002.txt
+++ b/t/pt-query-digest/samples/genlog002.txt
@@ -69,7 +69,7 @@ SELECT category_id
                 WHERE auction_id = '3015563'\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xC6637FEB865265BA0A3E6DCD23F3445A  0.0000  0.0%     1 0.0000  0.00 SELECT auction_search
-#    2 0xB42FB5382732CE142361B36A4AEB397B  0.0000  0.0%     1 0.0000  0.00 SELECT auction_category_map
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xC6637FEB865265BA0A3E6DCD23F3445A   0.0000  0.0%     1 0.0000  0.00 SELECT auction_search
+#    2 0xB42FB5382732CE142361B36A4AEB397B   0.0000  0.0%     1 0.0000  0.00 SELECT auction_category_map
diff --git a/t/pt-query-digest/samples/genlog003.txt b/t/pt-query-digest/samples/genlog003.txt
index 601674a..2a9c757 100644
--- a/t/pt-query-digest/samples/genlog003.txt
+++ b/t/pt-query-digest/samples/genlog003.txt
@@ -125,10 +125,10 @@ SELECT DISTINCT col FROM tbl WHERE foo=20061219\G
 administrator command: Init DB\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xEDBC971AEC392917AA353644DE4C4CB4  0.0000  0.0%     2 0.0000  0.00 ADMIN QUIT
-#    2 0x7417646A9FE969365D51E5F01B88B79E  0.0000  0.0%     2 0.0000  0.00 ADMIN CONNECT
-#    3 0x373CEA028C0EA95444AAC79F41BCF692  0.0000  0.0%     1 0.0000  0.00 SELECT tbl
-#    4 0x30388146EA1DA5814D096479916B0F45  0.0000  0.0%     1 0.0000  0.00 SELECT tbl
-#    5 0x898255B1BE4F8C3044AE35A182869033  0.0000  0.0%     1 0.0000  0.00 ADMIN INIT DB
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xEDBC971AEC392917AA353644DE4C4CB4   0.0000  0.0%     2 0.0000  0.00 ADMIN QUIT
+#    2 0x7417646A9FE969365D51E5F01B88B79E   0.0000  0.0%     2 0.0000  0.00 ADMIN CONNECT
+#    3 0x373CEA028C0EA95444AAC79F41BCF692   0.0000  0.0%     1 0.0000  0.00 SELECT tbl
+#    4 0x30388146EA1DA5814D096479916B0F45   0.0000  0.0%     1 0.0000  0.00 SELECT tbl
+#    5 0x898255B1BE4F8C3044AE35A182869033   0.0000  0.0%     1 0.0000  0.00 ADMIN INIT DB
diff --git a/t/pt-query-digest/samples/genlog005.txt b/t/pt-query-digest/samples/genlog005.txt
index e3c48ef..9e7f7aa 100644
--- a/t/pt-query-digest/samples/genlog005.txt
+++ b/t/pt-query-digest/samples/genlog005.txt
@@ -290,17 +290,17 @@ SELECT USER()\G
 SELECT 1 FROM (SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`COLUMN_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`TABLE_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`SCHEMA_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`) t WHERE `IS_GRANTABLE` = 'YES' AND '''root''@''localhost''' LIKE `GRANTEE` LIMIT 1\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7417646A9FE969365D51E5F01B88B79E  0.0000  0.0%     2 0.0000  0.00 ADMIN CONNECT
-#    2 0x68C6B480CBDB8159E2F7D83651089289  0.0000  0.0%     1 0.0000  0.00 SELECT
-#    3 0xC4AB84B66A4FBA135A2F00AA08F7A560  0.0000  0.0%     1 0.0000  0.00 SELECT mysql.user
-#    4 0xAB58F0EB775FA5FBF2E9C9BDE150321B  0.0000  0.0%     1 0.0000  0.00 SET
-#    5 0x1E5B97E780818DDB3B9AD583C3AFC61D  0.0000  0.0%     1 0.0000  0.00 SET
-#    6 0xF0A406222CD7B02708E4BF21400A779E  0.0000  0.0%     1 0.0000  0.00 SELECT phpmyadmin.pma__usergroups phpmyadmin.pma__users
-#    7 0x1A47B347E419B05A62642FD655801FC1  0.0000  0.0%     1 0.0000  0.00 SELECT phpmyadmin.pma__bookmark
-#    8 0x4C1AABB35EA40368289CE0B9F6EA151D  0.0000  0.0%     1 0.0000  0.00 SELECT INFORMATION_SCHEMA.SCHEMATA
-#    9 0xDDABDE67AC3044CAED549F59FFFA541B  0.0000  0.0%     1 0.0000  0.00 SELECT phpmyadmin.pma__navigationhiding
-#   10 0x35CCC630581DCD5AA46100310F18DEB9  0.0000  0.0%     1 0.0000  0.00 SELECT INFORMATION_SCHEMA.SCHEMATA
-#   11 0x7B48FAA9C951DD8A389FF9DA2DF3DF62  0.0000  0.0%     1 0.0000  0.00 SELECT
-#   12 0x75A885FE43F31908754B91A2F3BD1E20  0.0000  0.0%     1 0.0000  0.00 SELECT UNION INFORMATION_SCHEMA.COLUMN_PRIVILEGES INFORMATION_SCHEMA.TABLE_PRIVILEGES INFORMATION_SCHEMA.SCHEMA_PRIVILEGES INFORMATION_SCHEMA.USER_PRIVILEGES
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7417646A9FE969365D51E5F01B88B79E   0.0000  0.0%     2 0.0000  0.00 ADMIN CONNECT
+#    2 0x68C6B480CBDB8159E2F7D83651089289   0.0000  0.0%     1 0.0000  0.00 SELECT
+#    3 0xC4AB84B66A4FBA135A2F00AA08F7A560   0.0000  0.0%     1 0.0000  0.00 SELECT mysql.user
+#    4 0xAB58F0EB775FA5FBF2E9C9BDE150321B   0.0000  0.0%     1 0.0000  0.00 SET
+#    5 0x1E5B97E780818DDB3B9AD583C3AFC61D   0.0000  0.0%     1 0.0000  0.00 SET
+#    6 0xF0A406222CD7B02708E4BF21400A779E   0.0000  0.0%     1 0.0000  0.00 SELECT phpmyadmin.pma__usergroups phpmyadmin.pma__users
+#    7 0x1A47B347E419B05A62642FD655801FC1   0.0000  0.0%     1 0.0000  0.00 SELECT phpmyadmin.pma__bookmark
+#    8 0x4C1AABB35EA40368289CE0B9F6EA151D   0.0000  0.0%     1 0.0000  0.00 SELECT INFORMATION_SCHEMA.SCHEMATA
+#    9 0xDDABDE67AC3044CAED549F59FFFA541B   0.0000  0.0%     1 0.0000  0.00 SELECT phpmyadmin.pma__navigationhiding
+#   10 0x35CCC630581DCD5AA46100310F18DEB9   0.0000  0.0%     1 0.0000  0.00 SELECT INFORMATION_SCHEMA.SCHEMATA
+#   11 0x7B48FAA9C951DD8A389FF9DA2DF3DF62   0.0000  0.0%     1 0.0000  0.00 SELECT
+#   12 0x75A885FE43F31908754B91A2F3BD1E20   0.0000  0.0%     1 0.0000  0.00 SELECT UNION INFORMATION_SCHEMA.COLUMN_PRIVILEGES INFORMATION_SCHEMA.TABLE_PRIVILEGES INFORMATION_SCHEMA.SCHEMA_PRIVILEGES INFORMATION_SCHEMA.USER_PRIVILEGES
diff --git a/t/pt-query-digest/samples/issue_1196-output-5.7.txt b/t/pt-query-digest/samples/issue_1196-output-5.7.txt
index fa997c3..63ce8e2 100644
--- a/t/pt-query-digest/samples/issue_1196-output-5.7.txt
+++ b/t/pt-query-digest/samples/issue_1196-output-5.7.txt
@@ -1,8 +1,8 @@
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x867E8F0D95B72228D4B6A5CD2F2F485C 0.2148 100.0%     1 0.2148  0.00 SELECT t
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x867E8F0D95B72228D4B6A5CD2F2F485C  0.2148 100.0%     1 0.2148  0.00 SELECT t
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x867E8F0D95B72228D4B6A5CD2F2F485C at byte 0
 # This item is included in the report because it matches --limit.
diff --git a/t/pt-query-digest/samples/issue_1604834-1.txt b/t/pt-query-digest/samples/issue_1604834-1.txt
index 298666e..6c77a17 100644
--- a/t/pt-query-digest/samples/issue_1604834-1.txt
+++ b/t/pt-query-digest/samples/issue_1604834-1.txt
@@ -1,5 +1,5 @@
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xC17ACBB2A781EF953D120517D93D7104 0.4296 100.0%     2 0.2148  0.00 SELECT t
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xC17ACBB2A781EF953D120517D93D7104  0.4296 100.0%     2 0.2148  0.00 SELECT t
diff --git a/t/pt-query-digest/samples/issue_1604834-2.txt b/t/pt-query-digest/samples/issue_1604834-2.txt
index d26f84e..7fb4ac3 100644
--- a/t/pt-query-digest/samples/issue_1604834-2.txt
+++ b/t/pt-query-digest/samples/issue_1604834-2.txt
@@ -1,6 +1,6 @@
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x8F45041D3231A430A6FCCF25435B296C  0.2148 50.0%     1 0.2148  0.00 SELECT t
-#    2 0xC845F0936D35B0C1EC1B54C188363AAD  0.2148 50.0%     1 0.2148  0.00 SELECT t
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x8F45041D3231A430A6FCCF25435B296C   0.2148 50.0%     1 0.2148  0.00 SELECT t
+#    2 0xC845F0936D35B0C1EC1B54C188363AAD   0.2148 50.0%     1 0.2148  0.00 SELECT t
diff --git a/t/pt-query-digest/samples/proclist001.txt b/t/pt-query-digest/samples/proclist001.txt
index a7f838b..c40cf63 100644
--- a/t/pt-query-digest/samples/proclist001.txt
+++ b/t/pt-query-digest/samples/proclist001.txt
@@ -1 +1 @@
-# Exec time    100      9s      2s      4s      3s      4s   786ms      3s
\ No newline at end of file
+# Exec time    100     10s      1s      3s      2s      3s   896ms      2s
\ No newline at end of file
diff --git a/t/pt-query-digest/samples/pt-234.log b/t/pt-query-digest/samples/pt-234.log
index b1fe18b..40b51bc 100644
--- a/t/pt-query-digest/samples/pt-234.log
+++ b/t/pt-query-digest/samples/pt-234.log
@@ -90,9 +90,9 @@ administrator command: Execute\G
 BEGIN\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xBA7E77F4CCD756FC9617DE062D3FFA8D  0.0000  0.0%     2 0.0000  0.00 COMMIT Xid_log_event
-#    2 0x44B4197B8790DED42342554AF88317C9  0.0000  0.0%     2 0.0000  0.00 BEGIN
-#    3 0x2A89113BB920BA301228F184663C8627  0.0000  0.0%     2 0.0000  0.00 ADMIN EXECUTE
-#    4 0x8D589AFA4DFAEEED85FFF5AA78E5FF6A  0.0000  0.0%     1 0.0000  0.00 BEGIN
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xBA7E77F4CCD756FC9617DE062D3FFA8D   0.0000  0.0%     2 0.0000  0.00 COMMIT Xid_log_event
+#    2 0x44B4197B8790DED42342554AF88317C9   0.0000  0.0%     2 0.0000  0.00 BEGIN
+#    3 0x2A89113BB920BA301228F184663C8627   0.0000  0.0%     2 0.0000  0.00 ADMIN EXECUTE
+#    4 0x8D589AFA4DFAEEED85FFF5AA78E5FF6A   0.0000  0.0%     1 0.0000  0.00 BEGIN
diff --git a/t/pt-query-digest/samples/rawlog001.txt b/t/pt-query-digest/samples/rawlog001.txt
index ce4452a..3671521 100644
--- a/t/pt-query-digest/samples/rawlog001.txt
+++ b/t/pt-query-digest/samples/rawlog001.txt
@@ -52,7 +52,7 @@
 SELECT c FROM t WHERE id=1\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x813FE962AFBBC891774B2B0B59EBAC2C  0.0000  0.0%     1 0.0000  0.00 SELECT t?
-#    2 0x5F47280C0D7DCF5CCB5621E548E5497F  0.0000  0.0%     1 0.0000  0.00 SELECT t
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x813FE962AFBBC891774B2B0B59EBAC2C   0.0000  0.0%     1 0.0000  0.00 SELECT t?
+#    2 0x5F47280C0D7DCF5CCB5621E548E5497F   0.0000  0.0%     1 0.0000  0.00 SELECT t
diff --git a/t/pt-query-digest/samples/slow002_iters_2.txt b/t/pt-query-digest/samples/slow002_iters_2.txt
index a1dd324..b9781a8 100644
--- a/t/pt-query-digest/samples/slow002_iters_2.txt
+++ b/t/pt-query-digest/samples/slow002_iters_2.txt
@@ -41,7 +41,7 @@ select  n.column1 = a.column1, n.word3 = a.word3 from db2.tuningdetail_21_265507
       inner join db1.gonzo a using(gonzo) \G
 
 # Profile
-# Rank Query ID                          Response time Calls R/Call V/M   
-# ==== ================================= ============= ===== ====== ===== 
-#    1 0x45FE45AEC222350466825DDC008F...  0.7261 95.3%     1 0.7261  0.00 UPDATE db?.tuningdetail_?_? db?.gonzo
-# MISC 0xMISC                             0.0360  4.7%     7 0.0051   0.0 <6 ITEMS>
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x45FE45AEC222350466825DDC008FFA89   0.7261 95.3%     1 0.7261  0.00 UPDATE db?.tuningdetail_?_? db?.gonzo
+# MISC 0xMISC                               0.0360  4.7%     7 0.0051   0.0 <6 ITEMS>
diff --git a/t/pt-query-digest/samples/slow007_explain_3.txt b/t/pt-query-digest/samples/slow007_explain_3.txt
index 1556a02..486126c 100644
--- a/t/pt-query-digest/samples/slow007_explain_3.txt
+++ b/t/pt-query-digest/samples/slow007_explain_3.txt
@@ -33,6 +33,6 @@ SELECT fruit FROM trees\G
 # EXPLAIN failed: DBD::mysql::st execute failed: Table 'food.trees' doesn't exist [for Statement "EXPLAIN SELECT fruit FROM trees"] at line ?.
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x88F3D65BE48113F18E306CDB7A800841 0.0000 100.0%     1 0.0000  0.00 SELECT trees
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x88F3D65BE48113F18E306CDB7A800841  0.0000 100.0%     1 0.0000  0.00 SELECT trees
diff --git a/t/pt-query-digest/samples/slow007_explain_4.txt b/t/pt-query-digest/samples/slow007_explain_4.txt
index 99fb2ac..2306481 100644
--- a/t/pt-query-digest/samples/slow007_explain_4.txt
+++ b/t/pt-query-digest/samples/slow007_explain_4.txt
@@ -1,5 +1,5 @@
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x88F3D65BE48113F18E306CDB7A800841 0.0000 100.0%     1 0.0000  0.00 SELECT trees
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x88F3D65BE48113F18E306CDB7A800841  0.0000 100.0%     1 0.0000  0.00 SELECT trees
diff --git a/t/pt-query-digest/samples/slow013_report_profile.txt b/t/pt-query-digest/samples/slow013_report_profile.txt
index de1113a..9423ae9 100644
--- a/t/pt-query-digest/samples/slow013_report_profile.txt
+++ b/t/pt-query-digest/samples/slow013_report_profile.txt
@@ -1,8 +1,8 @@
 
 # Profile
-# Rank Query ID                          Response time Calls R/Call V/M   
-# ==== ================================= ============= ===== ====== ===== 
-#    1 0xF9734574CDDDC5D231DA25F95494...  0.1494 99.9%     1 0.1494  0.00 SHOW STATUS
-#    2 0x80AEBDBE9DD8458C3AEAAD0E15D7...  0.0001  0.1%     2 0.0000  0.00 SET
-#    3 0xFFFCA4D67EA0A788813031B8BBC3...  0.0000  0.0%     1 0.0000  0.00 COMMIT
-# MISC 0xMISC                             0.0000  0.0%     1 0.0000   0.0 <1 ITEMS>
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xF9734574CDDDC5D231DA25F95494CA95   0.1494 99.9%     1 0.1494  0.00 SHOW STATUS
+#    2 0x80AEBDBE9DD8458C3AEAAD0E15D725B5   0.0001  0.1%     2 0.0000  0.00 SET
+#    3 0xFFFCA4D67EA0A788813031B8BBC3B329   0.0000  0.0%     1 0.0000  0.00 COMMIT
+# MISC 0xMISC                               0.0000  0.0%     1 0.0000   0.0 <1 ITEMS>
diff --git a/t/pt-query-digest/samples/slow033-rtm-event-1h.txt b/t/pt-query-digest/samples/slow033-rtm-event-1h.txt
index 16e4497..0724e04 100644
--- a/t/pt-query-digest/samples/slow033-rtm-event-1h.txt
+++ b/t/pt-query-digest/samples/slow033-rtm-event-1h.txt
@@ -31,6 +31,6 @@
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
diff --git a/t/pt-query-digest/samples/slow033-rtm-event-25h.txt b/t/pt-query-digest/samples/slow033-rtm-event-25h.txt
index 398896c..4a02d5f 100644
--- a/t/pt-query-digest/samples/slow033-rtm-event-25h.txt
+++ b/t/pt-query-digest/samples/slow033-rtm-event-25h.txt
@@ -31,6 +31,6 @@
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     2 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     2 0.0000  0.00 SELECT foo
diff --git a/t/pt-query-digest/samples/slow033-rtm-interval-1d.txt b/t/pt-query-digest/samples/slow033-rtm-interval-1d.txt
index 531b159..16e73c3 100644
--- a/t/pt-query-digest/samples/slow033-rtm-interval-1d.txt
+++ b/t/pt-query-digest/samples/slow033-rtm-interval-1d.txt
@@ -31,9 +31,9 @@
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 179
 # This item is included in the report because it matches --limit.
@@ -67,9 +67,9 @@ SELECT * FROM foo\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 2 QPS, 0.00x concurrency, ID 0xF1711862B758491C07AEF8EFAB3FA3CE at byte 509
 # This item is included in the report because it matches --limit.
@@ -134,10 +134,10 @@ SELECT * FROM bar\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xF1711862B758491C07AEF8EFAB3FA3CE  0.0000 66.7%     2 0.0000  0.00 SELECT bar
-#    2 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 33.3%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xF1711862B758491C07AEF8EFAB3FA3CE   0.0000 66.7%     2 0.0000  0.00 SELECT bar
+#    2 0x7023AEC64FE3598DAC1BF726F2AB10C5   0.0000 33.3%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 861
 # This item is included in the report because it matches --limit.
@@ -171,6 +171,6 @@ SELECT * FROM foo\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
diff --git a/t/pt-query-digest/samples/slow033-rtm-interval-30m.txt b/t/pt-query-digest/samples/slow033-rtm-interval-30m.txt
index 87f8150..b309883 100644
--- a/t/pt-query-digest/samples/slow033-rtm-interval-30m.txt
+++ b/t/pt-query-digest/samples/slow033-rtm-interval-30m.txt
@@ -31,9 +31,9 @@
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 179
 # This item is included in the report because it matches --limit.
@@ -67,9 +67,9 @@ SELECT * FROM foo\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 2 QPS, 0.00x concurrency, ID 0xF1711862B758491C07AEF8EFAB3FA3CE at byte 509
 # This item is included in the report because it matches --limit.
@@ -103,9 +103,9 @@ SELECT * FROM foo\G
 SELECT * FROM bar\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xF1711862B758491C07AEF8EFAB3FA3CE 0.0000 100.0%     2 0.0000  0.00 SELECT bar
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xF1711862B758491C07AEF8EFAB3FA3CE  0.0000 100.0%     2 0.0000  0.00 SELECT bar
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 683
 # This item is included in the report because it matches --limit.
@@ -139,9 +139,9 @@ SELECT * FROM bar\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 861
 # This item is included in the report because it matches --limit.
@@ -175,6 +175,6 @@ SELECT * FROM foo\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
diff --git a/t/pt-query-digest/samples/slow033-rtm-interval-30s-3iter.txt b/t/pt-query-digest/samples/slow033-rtm-interval-30s-3iter.txt
index 6b8adbf..feb4e04 100644
--- a/t/pt-query-digest/samples/slow033-rtm-interval-30s-3iter.txt
+++ b/t/pt-query-digest/samples/slow033-rtm-interval-30s-3iter.txt
@@ -31,9 +31,9 @@
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 179
 # This item is included in the report because it matches --limit.
@@ -67,9 +67,9 @@ SELECT * FROM foo\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0xF1711862B758491C07AEF8EFAB3FA3CE at byte 344
 # This item is included in the report because it matches --limit.
@@ -103,6 +103,6 @@ SELECT * FROM foo\G
 SELECT * FROM bar\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xF1711862B758491C07AEF8EFAB3FA3CE 0.0000 100.0%     1 0.0000  0.00 SELECT bar
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xF1711862B758491C07AEF8EFAB3FA3CE  0.0000 100.0%     1 0.0000  0.00 SELECT bar
diff --git a/t/pt-query-digest/samples/slow033-rtm-interval-30s.txt b/t/pt-query-digest/samples/slow033-rtm-interval-30s.txt
index 83dae09..9c6eaa3 100644
--- a/t/pt-query-digest/samples/slow033-rtm-interval-30s.txt
+++ b/t/pt-query-digest/samples/slow033-rtm-interval-30s.txt
@@ -31,9 +31,9 @@
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 179
 # This item is included in the report because it matches --limit.
@@ -67,9 +67,9 @@ SELECT * FROM foo\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0xF1711862B758491C07AEF8EFAB3FA3CE at byte 344
 # This item is included in the report because it matches --limit.
@@ -103,9 +103,9 @@ SELECT * FROM foo\G
 SELECT * FROM bar\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xF1711862B758491C07AEF8EFAB3FA3CE 0.0000 100.0%     1 0.0000  0.00 SELECT bar
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xF1711862B758491C07AEF8EFAB3FA3CE  0.0000 100.0%     1 0.0000  0.00 SELECT bar
 
 # Query 1: 0 QPS, 0x concurrency, ID 0xF1711862B758491C07AEF8EFAB3FA3CE at byte 509
 # This item is included in the report because it matches --limit.
@@ -139,9 +139,9 @@ SELECT * FROM bar\G
 SELECT * FROM bar\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xF1711862B758491C07AEF8EFAB3FA3CE 0.0000 100.0%     1 0.0000  0.00 SELECT bar
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xF1711862B758491C07AEF8EFAB3FA3CE  0.0000 100.0%     1 0.0000  0.00 SELECT bar
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 683
 # This item is included in the report because it matches --limit.
@@ -175,9 +175,9 @@ SELECT * FROM bar\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
 
 # Query 1: 0 QPS, 0x concurrency, ID 0x7023AEC64FE3598DAC1BF726F2AB10C5 at byte 861
 # This item is included in the report because it matches --limit.
@@ -211,6 +211,6 @@ SELECT * FROM foo\G
 SELECT * FROM foo\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5 0.0000 100.0%     1 0.0000  0.00 SELECT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7023AEC64FE3598DAC1BF726F2AB10C5  0.0000 100.0%     1 0.0000  0.00 SELECT foo
diff --git a/t/pt-query-digest/samples/slow034-order-by-Locktime-sum-with-Locktime-distro.txt b/t/pt-query-digest/samples/slow034-order-by-Locktime-sum-with-Locktime-distro.txt
index a63f9c4..2b5caab 100644
--- a/t/pt-query-digest/samples/slow034-order-by-Locktime-sum-with-Locktime-distro.txt
+++ b/t/pt-query-digest/samples/slow034-order-by-Locktime-sum-with-Locktime-distro.txt
@@ -161,10 +161,10 @@ SELECT id FROM tbl WHERE id = 1\G
 SELECT COUNT(*) FROM blah WHERE col > 2\G
 
 # Profile
-# Rank Query ID                           Response time   Calls R/Call    
-# ==== ================================== =============== ===== ========= 
-#    1 0xA5C90AEFB6734628ABE9508269335CD1 1349.0001 98.9%     1 1349.0001  0.00 DELETE forest
-#    2 0x7023AEC64FE3598DAC1BF726F2AB10C5    2.9042  0.2%     4    0.7261  0.03 SELECT foo
-#    3 0x937677F741B37EAFB79802214165F670    0.7261  0.1%     2    0.3631  0.73 INSERT tbl
-#    4 0x181E5BEE0A9CD8C01F9B2F47A843D460    1.7261  0.1%     1    1.7261  0.00 SELECT tbl
-#    5 0xFBC6FB7F8360D37D3F1024B96D9D469E    9.0001  0.7%     1    9.0001  0.00 SELECT blah
+# Rank Query ID                            Response time   Calls R/Call   
+# ==== =================================== =============== ===== =========
+#    1 0xA5C90AEFB6734628ABE9508269335CD1  1349.0001 98.9%     1 1349.0001  0.00 DELETE forest
+#    2 0x7023AEC64FE3598DAC1BF726F2AB10C5     2.9042  0.2%     4    0.7261  0.03 SELECT foo
+#    3 0x937677F741B37EAFB79802214165F670     0.7261  0.1%     2    0.3631  0.73 INSERT tbl
+#    4 0x181E5BEE0A9CD8C01F9B2F47A843D460     1.7261  0.1%     1    1.7261  0.00 SELECT tbl
+#    5 0xFBC6FB7F8360D37D3F1024B96D9D469E     9.0001  0.7%     1    9.0001  0.00 SELECT blah
diff --git a/t/pt-query-digest/samples/slow034-order-by-Locktime-sum.txt b/t/pt-query-digest/samples/slow034-order-by-Locktime-sum.txt
index e185ccd..53c12f9 100644
--- a/t/pt-query-digest/samples/slow034-order-by-Locktime-sum.txt
+++ b/t/pt-query-digest/samples/slow034-order-by-Locktime-sum.txt
@@ -161,10 +161,10 @@ SELECT id FROM tbl WHERE id = 1\G
 SELECT COUNT(*) FROM blah WHERE col > 2\G
 
 # Profile
-# Rank Query ID                           Response time   Calls R/Call    
-# ==== ================================== =============== ===== ========= 
-#    1 0xA5C90AEFB6734628ABE9508269335CD1 1349.0001 98.9%     1 1349.0001  0.00 DELETE forest
-#    2 0x7023AEC64FE3598DAC1BF726F2AB10C5    2.9042  0.2%     4    0.7261  0.03 SELECT foo
-#    3 0x937677F741B37EAFB79802214165F670    0.7261  0.1%     2    0.3631  0.73 INSERT tbl
-#    4 0x181E5BEE0A9CD8C01F9B2F47A843D460    1.7261  0.1%     1    1.7261  0.00 SELECT tbl
-#    5 0xFBC6FB7F8360D37D3F1024B96D9D469E    9.0001  0.7%     1    9.0001  0.00 SELECT blah
+# Rank Query ID                            Response time   Calls R/Call   
+# ==== =================================== =============== ===== =========
+#    1 0xA5C90AEFB6734628ABE9508269335CD1  1349.0001 98.9%     1 1349.0001  0.00 DELETE forest
+#    2 0x7023AEC64FE3598DAC1BF726F2AB10C5     2.9042  0.2%     4    0.7261  0.03 SELECT foo
+#    3 0x937677F741B37EAFB79802214165F670     0.7261  0.1%     2    0.3631  0.73 INSERT tbl
+#    4 0x181E5BEE0A9CD8C01F9B2F47A843D460     1.7261  0.1%     1    1.7261  0.00 SELECT tbl
+#    5 0xFBC6FB7F8360D37D3F1024B96D9D469E     9.0001  0.7%     1    9.0001  0.00 SELECT blah
diff --git a/t/pt-query-digest/samples/slow035.txt b/t/pt-query-digest/samples/slow035.txt
index 0e67121..834dee9 100644
--- a/t/pt-query-digest/samples/slow035.txt
+++ b/t/pt-query-digest/samples/slow035.txt
@@ -85,7 +85,7 @@ SELECT * FROM blah WHERE something = 'important'\G
 INSERT INTO db.v (m, b) VALUES ('', 'Exact')\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x01C11894F289821F9E892D4B16D7BFC2  0.0000  0.0%     1 0.0000  0.00 SELECT blah
-#    2 0x53AFEEC4943ACB06727841EC88423713  0.0000  0.0%     1 0.0000  0.00 INSERT db.v
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x01C11894F289821F9E892D4B16D7BFC2   0.0000  0.0%     1 0.0000  0.00 SELECT blah
+#    2 0x53AFEEC4943ACB06727841EC88423713   0.0000  0.0%     1 0.0000  0.00 INSERT db.v
diff --git a/t/pt-query-digest/samples/slow037_report.txt b/t/pt-query-digest/samples/slow037_report.txt
index 8ae128d..684bc45 100644
--- a/t/pt-query-digest/samples/slow037_report.txt
+++ b/t/pt-query-digest/samples/slow037_report.txt
@@ -27,6 +27,6 @@
 LOCK foo bar
 
 # Profile
-# Rank Query ID Response time Calls R/Call V/M   Item
-# ==== ======== ============= ===== ====== ===== ============
-#    1 0x       0.0010 100.0%     1 0.0010  0.00 LOCK foo bar
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x                                  0.0010 100.0%     1 0.0010  0.00 LOCK foo bar
diff --git a/t/pt-query-digest/samples/slow048.txt b/t/pt-query-digest/samples/slow048.txt
index b0fa478..1f6a3e0 100644
--- a/t/pt-query-digest/samples/slow048.txt
+++ b/t/pt-query-digest/samples/slow048.txt
@@ -27,6 +27,6 @@
 SELECT * FROM `products` ORDER BY name, shape asc\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xF26B49DB07BBD0EE208AC308FD716D83 0.0001 100.0%     4 0.0000  0.00 SELECT products
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xF26B49DB07BBD0EE208AC308FD716D83  0.0001 100.0%     4 0.0000  0.00 SELECT products
diff --git a/t/pt-query-digest/samples/slow049.txt b/t/pt-query-digest/samples/slow049.txt
index 7f9645a..9a18c43 100644
--- a/t/pt-query-digest/samples/slow049.txt
+++ b/t/pt-query-digest/samples/slow049.txt
@@ -10,12 +10,12 @@
 # Query size           308      30      34   30.80   31.70    1.64   28.75
 
 # Profile
-# Rank Query ID                        Response time   Calls R/Call   V/M 
-# ==== =============================== =============== ===== ======== ====
-#    1 0x95FD3A847023D37C95AADD230F... 1000.0000 53.8%     2 500.0000  0.00 SELECT two
-#    2 0xBB15BFCE4C9727175081E1858C...  500.0000 26.9%     1 500.0000  0.00 SELECT three
-#    4 0x66112E536C54CE7170E215C4BF...   50.0000  2.7%     5  10.0000  0.00 SELECT one
-# MISC 0xMISC                           310.0000 16.7%     2 155.0000   0.0 <2 ITEMS>
+# Rank Query ID                            Response time   Calls R/Call   
+# ==== =================================== =============== ===== ======== 
+#    1 0x95FD3A847023D37C95AADD230F4EB56A  1000.0000 53.8%     2 500.0000  0.00 SELECT two
+#    2 0xBB15BFCE4C9727175081E1858C60FD05   500.0000 26.9%     1 500.0000  0.00 SELECT three
+#    4 0x66112E536C54CE7170E215C4BFED0080    50.0000  2.7%     5  10.0000  0.00 SELECT one
+# MISC 0xMISC                               310.0000 16.7%     2 155.0000   0.0 <2 ITEMS>
 
 # Query 1: 2 QPS, 1.00kx concurrency, ID 0x95FD3A847023D37C95AADD230F4EB56A at byte 886
 # This item is included in the report because it matches --limit.
diff --git a/t/pt-query-digest/samples/slow050.txt b/t/pt-query-digest/samples/slow050.txt
index c3e187f..97c555f 100644
--- a/t/pt-query-digest/samples/slow050.txt
+++ b/t/pt-query-digest/samples/slow050.txt
@@ -28,6 +28,6 @@
 UPDATE mybbl_MBMessage SET groupId = (select groupId from Group_ where name = 'Guest')\G
 
 # Profile
-# Rank Query ID                           Response time  Calls R/Call  V/M
-# ==== ================================== ============== ===== ======= ===
-#    1 0x854B57896A3E0670305E73C51188758F 10.0000 100.0%     1 10.0000  0.00 UPDATE SELECT mybbl_MBMessage Group_
+# Rank Query ID                            Response time  Calls R/Call  V/
+# ==== =================================== ============== ===== ======= ==
+#    1 0x854B57896A3E0670305E73C51188758F  10.0000 100.0%     1 10.0000  0.00 UPDATE SELECT mybbl_MBMessage Group_
diff --git a/t/pt-query-digest/samples/slow051.txt b/t/pt-query-digest/samples/slow051.txt
index 306cdaf..c6ef34c 100644
--- a/t/pt-query-digest/samples/slow051.txt
+++ b/t/pt-query-digest/samples/slow051.txt
@@ -26,6 +26,6 @@
 LOAD DATA INFILE '/tmp/bar.txt' INTO TABLE db.tbl\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xE248F647EF2C6F1414354E1D979884B4 0.0000 100.0%     2 0.0000  0.00 LOAD DATA db.tbl
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xE248F647EF2C6F1414354E1D979884B4  0.0000 100.0%     2 0.0000  0.00 LOAD DATA db.tbl
diff --git a/t/pt-query-digest/samples/slow052.txt b/t/pt-query-digest/samples/slow052.txt
index c08c7a3..ec33951 100644
--- a/t/pt-query-digest/samples/slow052.txt
+++ b/t/pt-query-digest/samples/slow052.txt
@@ -58,7 +58,7 @@ select very_variable_column from unsteady_table\G
 select less_variable_column from steady_table\G
 
 # Profile
-# Rank Query ID                           Response time  Calls R/Call V/M 
-# ==== ================================== ============== ===== ====== ====
-#    1 0x3ACFE4E81547889E32B0659E6D13E5A2 308.4675 74.6%   100 3.0847  0.48 SELECT unsteady_table
-#    2 0x07BD39112F052FC12F621C2B0611518C 104.9344 25.4%   100 1.0493  0.00 SELECT steady_table
+# Rank Query ID                            Response time  Calls R/Call V/M
+# ==== =================================== ============== ===== ====== ===
+#    1 0x3ACFE4E81547889E32B0659E6D13E5A2  308.4675 74.6%   100 3.0847  0.48 SELECT unsteady_table
+#    2 0x07BD39112F052FC12F621C2B0611518C  104.9344 25.4%   100 1.0493  0.00 SELECT steady_table
diff --git a/t/pt-query-digest/samples/slow058.txt b/t/pt-query-digest/samples/slow058.txt
index 8f3ab39..6bb030d 100644
--- a/t/pt-query-digest/samples/slow058.txt
+++ b/t/pt-query-digest/samples/slow058.txt
@@ -87,8 +87,8 @@ insert `foo` values("bar")\G
 load data local infile '/tmp/foo.txt' into table `foo`\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xC6846BD8C9A8209BF33473286088142B  0.0376 50.0%     2 0.0188  0.00 REPLACE foo
-#    2 0xD2FAEB9897F588D8471A0C4BD7A4EE34  0.0376 50.0%     2 0.0188  0.00 INSERT foo
-#    3 0x86FDEB668430A493EBAC9C76529E62CE  0.0000  0.0%     2 0.0000  0.00 LOAD DATA foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xC6846BD8C9A8209BF33473286088142B   0.0376 50.0%     2 0.0188  0.00 REPLACE foo
+#    2 0xD2FAEB9897F588D8471A0C4BD7A4EE34   0.0376 50.0%     2 0.0188  0.00 INSERT foo
+#    3 0x86FDEB668430A493EBAC9C76529E62CE   0.0000  0.0%     2 0.0000  0.00 LOAD DATA foo
diff --git a/t/pt-query-digest/samples/slow059_report01.txt b/t/pt-query-digest/samples/slow059_report01.txt
index 9960bff..763db32 100644
--- a/t/pt-query-digest/samples/slow059_report01.txt
+++ b/t/pt-query-digest/samples/slow059_report01.txt
@@ -121,7 +121,7 @@ SELECT foo FROM bar WHERE id=2\G
 INSERT INTO foo VALUES (NULL, 3)\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x24BC7BB1422E14BA9EA505F4786E7F15  0.0005 73.8%     2 0.0002  0.00 SELECT bar
-#    2 0xF227C8FE1FC34645D2BA209E593ABAA7  0.0002 26.2%     1 0.0002  0.00 INSERT foo
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x24BC7BB1422E14BA9EA505F4786E7F15   0.0005 73.8%     2 0.0002  0.00 SELECT bar
+#    2 0xF227C8FE1FC34645D2BA209E593ABAA7   0.0002 26.2%     1 0.0002  0.00 INSERT foo
diff --git a/t/pt-query-digest/samples/tcpdump017_report.txt b/t/pt-query-digest/samples/tcpdump017_report.txt
index 46bcddb..87eef47 100644
--- a/t/pt-query-digest/samples/tcpdump017_report.txt
+++ b/t/pt-query-digest/samples/tcpdump017_report.txt
@@ -34,6 +34,6 @@
 select @@version_comment limit 1\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x0E7680C04FF2596BE3A3649C5FAC418D 0.6696 100.0%     4 0.1674  0.19 SELECT
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x0E7680C04FF2596BE3A3649C5FAC418D  0.6696 100.0%     4 0.1674  0.19 SELECT
diff --git a/t/pt-query-digest/samples/tcpdump033.txt b/t/pt-query-digest/samples/tcpdump033.txt
index 22800b1..fbbdb44 100644
--- a/t/pt-query-digest/samples/tcpdump033.txt
+++ b/t/pt-query-digest/samples/tcpdump033.txt
@@ -99,11 +99,11 @@ select * from d.t where name="daniel"\G
 DEALLOCATE PREPARE 4\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xE4695C206D6C7F946EE88728F6F29C72  0.0010 54.4%     7 0.0001  0.00 SELECT d.t
-#    2 0x84DDEEB20D115535ECBCD0412B5E497A  0.0008 45.6%     5 0.0002  0.00 SELECT d.t
-#    3 0xF35CCCED7D400036559914DA8A7B7F28  0.0000  0.0%     3 0.0000  0.00 
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xE4695C206D6C7F946EE88728F6F29C72   0.0010 54.4%     7 0.0001  0.00 SELECT d.t
+#    2 0x84DDEEB20D115535ECBCD0412B5E497A   0.0008 45.6%     5 0.0002  0.00 SELECT d.t
+#    3 0xF35CCCED7D400036559914DA8A7B7F28   0.0000  0.0%     3 0.0000  0.00 
 
 # Prepared statements
 # Rank Query ID                           PREP PREP Response EXEC EXEC Res
diff --git a/t/pt-query-digest/samples/tcpdump041.txt b/t/pt-query-digest/samples/tcpdump041.txt
index 601b2b6..0e9a91c 100644
--- a/t/pt-query-digest/samples/tcpdump041.txt
+++ b/t/pt-query-digest/samples/tcpdump041.txt
@@ -40,9 +40,9 @@ PREPARE SELECT i FROM d.t WHERE i=?\G
 SELECT i FROM d.t WHERE i=?\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0xC29D79D8CB57E235AA8E9FA785927259 0.0003 100.0%     1 0.0003  0.00 SELECT d.t
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0xC29D79D8CB57E235AA8E9FA785927259  0.0003 100.0%     1 0.0003  0.00 SELECT d.t
 
 # Prepared statements
 # Rank Query ID                           PREP PREP Response EXEC EXEC Res
diff --git a/t/pt-query-digest/samples/tcpdump043_report.txt b/t/pt-query-digest/samples/tcpdump043_report.txt
index d831e73..452907f 100644
--- a/t/pt-query-digest/samples/tcpdump043_report.txt
+++ b/t/pt-query-digest/samples/tcpdump043_report.txt
@@ -35,6 +35,6 @@
 administrator command: Connect\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7417646A9FE969365D51E5F01B88B79E 3.5363 100.0%     1 3.5363  0.00 ADMIN CONNECT
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7417646A9FE969365D51E5F01B88B79E  3.5363 100.0%     1 3.5363  0.00 ADMIN CONNECT
diff --git a/t/pt-query-digest/samples/tcpdump044_report.txt b/t/pt-query-digest/samples/tcpdump044_report.txt
index 73ab1b1..2b2d470 100644
--- a/t/pt-query-digest/samples/tcpdump044_report.txt
+++ b/t/pt-query-digest/samples/tcpdump044_report.txt
@@ -34,6 +34,6 @@
 administrator command: Connect\G
 
 # Profile
-# Rank Query ID                           Response time Calls R/Call V/M  
-# ==== ================================== ============= ===== ====== =====
-#    1 0x7417646A9FE969365D51E5F01B88B79E 3.8195 100.0%     1 3.8195  0.00 ADMIN CONNECT
+# Rank Query ID                            Response time Calls R/Call V/M 
+# ==== =================================== ============= ===== ====== ====
+#    1 0x7417646A9FE969365D51E5F01B88B79E  3.8195 100.0%     1 3.8195  0.00 ADMIN CONNECT
diff --git a/util/mysql_random_data_load b/util/mysql_random_data_load
new file mode 100755
index 0000000..eb1be65
Binary files /dev/null and b/util/mysql_random_data_load differ
diff --git a/util/version_cmp b/util/version_cmp
new file mode 100755
index 0000000..9e05e3d
Binary files /dev/null and b/util/version_cmp differ