diff --git a/LANGUAGES.md b/LANGUAGES.md index 36de5d40..0aa61e2b 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -169,7 +169,7 @@ Monkey C (mc) MQL Header (mqh) MQL4 (mq4) MQL5 (mq5) -MSBuild (csproj,vbproj,fsproj,vcproj,vcxproj,vcxproj.filters,myapp,props,rdlc,resx,settings,sln,targets) +MSBuild (csproj,vbproj,fsproj,vcproj,vcxproj,vcxproj.filters,ilproj,myapp,props,rdlc,resx,settings,sln,targets) MUMPS (mps) Mustache (mustache) Nial (ndf) diff --git a/SCC-OUTPUT-REPORT.html b/SCC-OUTPUT-REPORT.html index a3bd0f36..0ea8b0f6 100644 --- a/SCC-OUTPUT-REPORT.html +++ b/SCC-OUTPUT-REPORT.html @@ -12,12 +12,12 @@ Go 40 - 9829 - 1554 - 465 - 7810 - 1593 - 400883 + 9572 + 1509 + 451 + 7612 + 1546 + 397903 Java 24 @@ -39,12 +39,12 @@ Markdown 11 - 1492 + 1497 362 0 - 1130 + 1135 0 - 60283 + 60393 Python 11 @@ -56,13 +56,13 @@ 18844 YAML - 9 - 906 + 8 + 394 66 - 62 - 778 + 61 + 267 0 - 18672 + 12132 CSS 5 @@ -102,12 +102,12 @@ Shell 3 - 1176 - 156 + 1158 + 154 92 - 928 - 106 - 41877 + 912 + 104 + 41219 C# 2 @@ -126,24 +126,6 @@ 12 0 268 - - HTML - 2 - 1540 - 0 - 0 - 1540 - 0 - 22334 - - JSON - 2 - 8877 - 8 - 0 - 8869 - 0 - 136751 JavaServer Pages 2 @@ -207,6 +189,15 @@ 4 0 1238 + + Arturo + 1 + 417 + 66 + 89 + 262 + 20 + 9981 BASH 1 @@ -288,15 +279,6 @@ 3 0 76 - - CSV - 1 - 84 - 0 - 0 - 84 - 0 - 2224 Cairo 1 @@ -495,6 +477,15 @@ 10 0 245 + + HTML + 1 + 824 + 0 + 0 + 824 + 0 + 11947 Hare 1 @@ -513,6 +504,33 @@ 7 0 226 + + JSON + 1 + 9024 + 8 + 0 + 9016 + 0 + 126488 + + JSONC + 1 + 9 + 0 + 6 + 3 + 0 + 96 + + Jsonnet + 1 + 40 + 6 + 5 + 29 + 3 + 559 Korn Shell 1 @@ -639,15 +657,6 @@ 0 0 0 - - SQL - 1 - 225 - 0 - 0 - 225 - 0 - 26445 Sieve 1 @@ -657,15 +666,6 @@ 164 47 5941 - - TOML - 1 - 8 - 2 - 0 - 6 - 0 - 126 Teal 1 @@ -738,6 +738,15 @@ 1 0 19 + + Windows Resource-Definition Script + 1 + 51 + 6 + 6 + 39 + 0 + 1888 Wren 1 @@ -786,12 +795,12 @@ Total - 211 - 95558 - 4610 - 5860 - 85088 - 2958 - 3191023 + 209 + 94407 + 4639 + 5951 + 83817 + 2932 + 3144034 \ No newline at end of file diff --git a/go.mod b/go.mod index d90f0e81..1f8f9b32 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/boyter/scc/v3 go 1.20 require ( - github.com/dbaggerman/cuba v0.3.2 + github.com/boyter/gocodewalker v1.3.1 github.com/json-iterator/go v1.1.12 github.com/mattn/go-runewidth v0.0.14 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 @@ -14,6 +14,7 @@ require ( ) require ( + github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect @@ -21,5 +22,6 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/spf13/pflag v1.0.5 // indirect + golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.10.0 // indirect ) diff --git a/go.sum b/go.sum index b232292a..d60d6d4d 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,13 @@ +github.com/boyter/gocodewalker v1.2.1 h1:9hrgoPjJgM1D9rDtoJpYtD1vyUShibZ88jvSGv+OZl4= +github.com/boyter/gocodewalker v1.2.1/go.mod h1:5k2pF0g2D5U2D7DMhnHvKKf/76c1WfW38AEImdM1BQk= +github.com/boyter/gocodewalker v1.3.0 h1:s1m4C4M0CIWudTm0U3Tp9ruA/SAL2snN9ZgyURdjXXA= +github.com/boyter/gocodewalker v1.3.0/go.mod h1:hXG8xzR1uURS+99P5/3xh3uWHjaV2XfoMMmvPyhrCDg= +github.com/boyter/gocodewalker v1.3.1 h1:rMKM5OCdTdEbNwOTUyZcoaxkY6Menr+IUMuQhKZRFZU= +github.com/boyter/gocodewalker v1.3.1/go.mod h1:hXG8xzR1uURS+99P5/3xh3uWHjaV2XfoMMmvPyhrCDg= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= +github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= 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= @@ -47,6 +55,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/processor/constants.go b/processor/constants.go index b67c700d..2093639c 100644 --- a/processor/constants.go +++ b/processor/constants.go @@ -1,5 +1,5 @@ -package processor +package processor const ( -languages = `ewogICJBQkFQIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhYmFwIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIqIiwKICAgICAgIlxcXCIiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFQTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiOkZvciAiLAogICAgICAiOklmICIsCiAgICAgICI6Q2FzZSAiLAogICAgICAiOkNhc2VMaXN0ICIsCiAgICAgICI6V2hpbGUgIiwKICAgICAgIjpSZXBlYXQgIiwKICAgICAgIjpFbHNlICIsCiAgICAgICLiiKgiLAogICAgICAi4oinIiwKICAgICAgIuKJoCIsCiAgICAgICJ+IiwKICAgICAgIsKoIiwKICAgICAgIj0iLAogICAgICAiOiIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFwbCIsCiAgICAgICJhcGxmIiwKICAgICAgImFwbG4iLAogICAgICAiYXBsYyIsCiAgICAgICJkeWFsb2ciCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIuKNnSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJBcHBsZVNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiY29uc2lkZXJpbmcgIiwKICAgICAgImlnbm9yaW5nICIsCiAgICAgICJyZXBlYXQgIiwKICAgICAgIndoaWxlICIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZSAiLAogICAgICAiZWxzZSBpZiAiLAogICAgICAidHJ5ICIsCiAgICAgICJvbiBlcnJvciAiLAogICAgICAiYW5kICIsCiAgICAgICJvciAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhcHBsZXNjcmlwdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIsCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFtdCiAgfSwKICAiQXJ0dXJvIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJsb29wICIsCiAgICAgICJtYXAgIiwKICAgICAgInNlbGVjdCAiLAogICAgICAiaWYgIiwKICAgICAgImlmPyAiLAogICAgICAid2hpbGUgIiwKICAgICAgImZ1bmN0aW9uICIsCiAgICAgICJvcj8gIiwKICAgICAgImFuZD8gIiwKICAgICAgIm5vdD8gIiwKICAgICAgIjw+ICIsCiAgICAgICI9ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFydCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQVNQIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhc2EiLAogICAgICAiYXNwIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICInIiwKICAgICAgIlJFTSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQVNQLk5FVCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYXNheCIsCiAgICAgICJhc2N4IiwKICAgICAgImFzbXgiLAogICAgICAiYXNweCIsCiAgICAgICJtYXN0ZXIiLAogICAgICAic2l0ZW1hcCIsCiAgICAgICJ3ZWJpbmZvIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiPCUtLSIsCiAgICAgICAgIi0tPiIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFUUyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICIgdGhlbiAiLAogICAgICAiIGVsc2UgIiwKICAgICAgImNhc2UrICIsCiAgICAgICJpZmNhc2UiLAogICAgICAibGV0ICIsCiAgICAgICJhbmQgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZGF0cyIsCiAgICAgICJzYXRzIiwKICAgICAgImF0cyIsCiAgICAgICJoYXRzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdLAogICAgICBbCiAgICAgICAgIigqIiwKICAgICAgICAiKikiCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiLy8vLyIsCiAgICAgICAgIlRISVNTSE9VTERORVZFUkFQUEVBUldFSE9QRSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJBV0siOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhd2siCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJhd2siLAogICAgICAiZ2F3ayIsCiAgICAgICJtYXdrIgogICAgXQogIH0sCiAgIkFjdGlvblNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYXMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQWRhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhZGEiLAogICAgICAiYWRiIiwKICAgICAgImFkcyIsCiAgICAgICJwYWQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJBZ2RhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhZ2RhIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7LSIsCiAgICAgICAgIi19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQWxjaGVtaXN0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICIrIiwKICAgICAgIi0+IiwKICAgICAgIiEiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjcm4iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFsZXgiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ4IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJBbGxveSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaW1wbGllcyAiLAogICAgICAiZWxzZSAiLAogICAgICAiZm9yICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiLAogICAgICAiPD0gIiwKICAgICAgIj49ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFscyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iLAogICAgICAiLS0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFuZHJvaWQgSW50ZXJmYWNlIERlZmluaXRpb24gTGFuZ3VhZ2UiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFpZGwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qKiIsCiAgICAgICAgIiovIgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQXZybyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImF2ZGwiLAogICAgICAiYXZwciIsCiAgICAgICJhdnNjIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJBc2NpaURvYyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFkb2MiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFzc2VtYmx5IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzIiwKICAgICAgImFzbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQXV0b0hvdEtleSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYWhrIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI7IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJBdXRvY29uZiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaW4iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiLAogICAgICAiZG5sIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJiYWl0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImlmICIsCiAgICAgICJlbHNlICIsCiAgICAgICIgb3IgIiwKICAgICAgIiBhbmQgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJidCIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJhbmQiLAogICAgICAiYnJlYWsiLAogICAgICAiY29uc3QgIiwKICAgICAgImNvbnRpbnVlIiwKICAgICAgImVsc2UgIiwKICAgICAgImZ1biAiLAogICAgICAiaW1wb3J0ICIsCiAgICAgICJub3QgIiwKICAgICAgIm9yICIsCiAgICAgICJwYWNrYWdlICIsCiAgICAgICJyZXR1cm4iLAogICAgICAic3RydWN0ICIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImAiLAogICAgICAgICJzdGFydCI6ICJgIgogICAgICB9CiAgICBdCiAgfSwKICAiQkFTSCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYmFzaCIsCiAgICAgICJiYXNoX2xvZ2luIiwKICAgICAgImJhc2hfbG9nb3V0IiwKICAgICAgImJhc2hfcHJvZmlsZSIsCiAgICAgICJiYXNocmMiCiAgICBdLAogICAgImZpbGVuYW1lcyI6IFsKICAgICAgIi5iYXNoX2xvZ2luIiwKICAgICAgIi5iYXNoX2xvZ291dCIsCiAgICAgICIuYmFzaF9wcm9maWxlIiwKICAgICAgIi5iYXNocmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImJhc2giCiAgICBdCiAgfSwKICAiQmFzaWMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgImVsc2VpZiAiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYmFzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICInIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkJhdGNoIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJiYXQiLAogICAgICAiYnRtIiwKICAgICAgImNtZCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiUkVNIiwKICAgICAgIjo6IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJCYXplbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYnpsIiwKICAgICAgImJ1aWxkLmJhemVsIiwKICAgICAgImJ1aWxkIiwKICAgICAgIndvcmtzcGFjZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkJpY2VwIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJAbWluTGVuZ3RoKCIsCiAgICAgICJAbWF4TGVuZ3RoKCIsCiAgICAgICJAc2VjdXJlKCIsCiAgICAgICJbZm9yICIsCiAgICAgICJpZigiLAogICAgICAiaWYgKCIsCiAgICAgICIgPT0gIiwKICAgICAgIiAhPSAiLAogICAgICAiID8gIiwKICAgICAgInVzaW5nICIsCiAgICAgICJyYW5nZSgiLAogICAgICAidHlwZSAiLAogICAgICAiZnVuYyAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJiaWNlcCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQml0YmFrZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYmIiLAogICAgICAiYmJhcHBlbmQiLAogICAgICAiYmJjbGFzcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkJpdGJ1Y2tldCBQaXBlbGluZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImJpdGJ1Y2tldC1waXBlbGluZXMueW1sIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJCbGFkZSB0ZW1wbGF0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiQGZvciAiLAogICAgICAiQGZvcigiLAogICAgICAiQGZvcmVhY2ggIiwKICAgICAgIkBmb3JlYWNoKCIsCiAgICAgICJAZm9yZWxzZSAiLAogICAgICAiQGZvcmVsc2UoIiwKICAgICAgIkBlYWNoICIsCiAgICAgICJAZWFjaCAoIiwKICAgICAgIkB3aGlsZSAiLAogICAgICAiQHdoaWxlKCIsCiAgICAgICJAaWYgIiwKICAgICAgIkBpZigiLAogICAgICAiQHVubGVzcyAiLAogICAgICAiQHVubGVzcygiLAogICAgICAiQGlzc2V0ICIsCiAgICAgICJAaXNzZXQoIiwKICAgICAgIkBlbXB0eSAiLAogICAgICAiQGVtcHR5KCIsCiAgICAgICJAZWxzZSAiLAogICAgICAiQGVsc2VpZiAiLAogICAgICAiQGVsc2VpZigiLAogICAgICAiQHdoaWxlICIsCiAgICAgICJAd2hpbGUoIiwKICAgICAgIkBzd2l0Y2ggIiwKICAgICAgIkBzd2l0Y2ggKCIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJibGFkZS5waHAiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAie3stLSIsCiAgICAgICAgIi0tfX0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiPCEtLSIsCiAgICAgICAgIi0tPiIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkJvbyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAiZWxpZiAiLAogICAgICAidW5sZXNzICIsCiAgICAgICIgYW5kICIsCiAgICAgICJmb3IgIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJib28iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXCJcIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCJcIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQm9zcXVlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAibWF0Y2ggIiwKICAgICAgImNhc2UgIiwKICAgICAgInwgIiwKICAgICAgInx8ICIsCiAgICAgICImICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIiE9PSAiLAogICAgICAiPT0gIiwKICAgICAgIj09PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJic3EiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkJyYWluZnVjayI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiWyIsCiAgICAgICJdIiwKICAgICAgIjwiLAogICAgICAiPiIsCiAgICAgICIrIiwKICAgICAgIi0iLAogICAgICAiLiIsCiAgICAgICIsIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYmYiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkJ1aWxkU3RyZWFtIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYnN0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJDIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjIiwKICAgICAgImVjIiwKICAgICAgInBnYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDIEhlYWRlciI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDIFNoZWxsIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjc2giCiAgICBdLAogICAgImZpbGVuYW1lcyI6IFsKICAgICAgIi5jc2hyYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdLAogICAgInNoZWJhbmdzIjogWwogICAgICAiY3NoIiwKICAgICAgInRjc2giCiAgICBdCiAgfSwKICAiQyMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNzIiwKICAgICAgImNzeCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAiaWdub3JlRXNjYXBlIjogdHJ1ZSwKICAgICAgICAic3RhcnQiOiAiQFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQysrIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjYyIsCiAgICAgICJjcHAiLAogICAgICAiY3h4IiwKICAgICAgImMrKyIsCiAgICAgICJwY2MiLAogICAgICAiaW5vIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkMrKyBIZWFkZXIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImhoIiwKICAgICAgImhwcCIsCiAgICAgICJoeHgiLAogICAgICAiaW5sIiwKICAgICAgImlwcCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDdWRhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjdSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDTWFrZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY21ha2UiLAogICAgICAiY21ha2VsaXN0cy50eHQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ09CT0wiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNvYiIsCiAgICAgICJjYmwiLAogICAgICAiY2NwIiwKICAgICAgImNvYm9sIiwKICAgICAgImNweSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiKiIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQ29kZVFMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJhbmQgIiwKICAgICAgIm9yICIsCiAgICAgICJpbXBsaWVzICIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZSAiLAogICAgICAibm90ICIsCiAgICAgICJpbnN0YW5jZW9mICIsCiAgICAgICJpbiAiLAogICAgICAiZXhpc3RzKCIsCiAgICAgICJmb3JhbGwoICIsCiAgICAgICJhdmcoIiwKICAgICAgImNvbmNhdCgiLAogICAgICAiY291bnQoIiwKICAgICAgIm1heCgiLAogICAgICAibWluKCIsCiAgICAgICJyYW5rKCIsCiAgICAgICJzdHJpY3Rjb25jYXQoIiwKICAgICAgInN0cmljdGNvdW50KCIsCiAgICAgICJzdHJpY3RzdW0oIiwKICAgICAgInN1bSgiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJxbCIsCiAgICAgICJxbGwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ1NTIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjc3MiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ1NWIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY3N2IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJDYWJhbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY2FiYWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInstIiwKICAgICAgICAiLX0iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJDYWlybyI6IHsKICAgICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICAgImxvb3AgIiwKICAgICAgICAiaWYgIiwKICAgICAgICAiaWYoIiwKICAgICAgICAibWF0Y2ggIiwKICAgICAgICAibWF0Y2goIiwKICAgICAgICAiZWxzZSAiLAogICAgICAgICJ8fCAiLAogICAgICAgICImJiAiLAogICAgICAgICIhPSAiLAogICAgICAgICI9PSAiCiAgICAgIF0sCiAgICAgICJleHRlbnNpb25zIjogWwogICAgICAgICJjYWlybyIKICAgICAgXSwKICAgICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgICAiLy8iCiAgICAgIF0sCiAgICAgICJtdWx0aV9saW5lIjogW10sCiAgICAgICJxdW90ZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAgICJzdGFydCI6ICInIgogICAgICAgIH0KICAgICAgXQogIH0sCiAgIkNhc3NpdXMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNhc3NpdXMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ2V5bG9uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjZXlsb24iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ2xvanVyZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiKGZvciAiLAogICAgICAiKHdoZW4gIiwKICAgICAgIihsb29wICIsCiAgICAgICIoZG9zZXEgIiwKICAgICAgIihjb25kICIsCiAgICAgICIoaWYiLAogICAgICAiKGlmLW5vdCAiLAogICAgICAiKGFuZCAiLAogICAgICAiKG9yICIsCiAgICAgICIobm90ICIsCiAgICAgICIoPSAiLAogICAgICAiKG5vdD0gIiwKICAgICAgIihyZWN1ciAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjbGoiLAogICAgICAiY2xqYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQ2xvanVyZVNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY2xqcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQ2xvc3VyZSBUZW1wbGF0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgIj49ICIsCiAgICAgICI8PSAiLAogICAgICAiPzogIiwKICAgICAgIj8gOiAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzb3kiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qKiIsCiAgICAgICAgIiovIgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ29mZmVlU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjb2ZmZWUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiIyMjIiwKICAgICAgICAiIyMjIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQ29nZW50IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjb2dlbnQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJDb2xkRnVzaW9uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjZm0iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPCEtLS0iLAogICAgICAgICItLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQ29sZEZ1c2lvbiBDRlNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY2ZjIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkNvcSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidiIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJSZXF1aXJlIiwKICAgICAgIkh5cG90aGVzaXMiLAogICAgICAiSW5kdWN0aXZlIiwKICAgICAgIlJlbWFyayIsCiAgICAgICJMZW1tYSIsCiAgICAgICJQcm9vZiIsCiAgICAgICJEZWZpbml0aW9uIiwKICAgICAgIlRoZW9yZW0iLAogICAgICAiQ2xhc3MiLAogICAgICAiSW5zdGFuY2UiLAogICAgICAiTW9kdWxlIiwKICAgICAgIkNvbnRleHQiLAogICAgICAiU2VjdGlvbiIsCiAgICAgICJOb3RhdGlvbiIsCiAgICAgICJFbmQiLAogICAgICAiRml4cG9pbnQiLAogICAgICAiRnJvbSBDb3EiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDcmVvbGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjcmVvbGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkNyeXN0YWwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJDeXRob24iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgImFuZCAiLAogICAgICAib3IgIiwKICAgICAgIm5vdCAiLAogICAgICAiaW4gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHl4IiwKICAgICAgInB4aSIsCiAgICAgICJweGQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIlxcXCJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIlxcXCJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICInJyciCiAgICAgIH0KICAgIF0KICB9LAogICJEIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8rIiwKICAgICAgICAiKy8iCiAgICAgIF0KICAgIF0sCiAgICAibmVzdGVkbXVsdGlsaW5lIjogdHJ1ZSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAicmRtZCIKICAgIF0KICB9LAogICJEYXJ0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkYXJ0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkRldmljZSBUcmVlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkdHMiLAogICAgICAiZHRzaSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJEaGFsbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImRoYWxsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7LSIsCiAgICAgICAgIi19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkRNIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgInN3aXRjaCgiLAogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCIsCiAgICAgICImJiIsCiAgICAgICIhPSIsCiAgICAgICI8PiIsCiAgICAgICI9PSIsCiAgICAgICJpbiAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJEb2NrZXIgaWdub3JlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogW10sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAiLmRvY2tlcmlnbm9yZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIsCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiRG9ja2VyZmlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZG9ja2VyZmlsZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAiZG9ja2VyZmlsZSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZHRkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJFbGl4aXIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImV4IiwKICAgICAgImV4cyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIlxcXCJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIlxcXCJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJycnIiwKICAgICAgICAic3RhcnQiOiAiJycnIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkVsbSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAiY2FzZSAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImVsbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLS0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiey0iLAogICAgICAgICItfSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJFbWFjcyBEZXYgRW52IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJlZGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkVtYWNzIExpc3AiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImVsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI7IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJFcmxhbmciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImVybCIsCiAgICAgICJocmwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiUiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImVzY3JpcHQiCiAgICBdCiAgfSwKICAiRXhwZWN0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJleHAiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkV4dGVuc2libGUgU3R5bGVzaGVldCBMYW5ndWFnZSBUcmFuc2Zvcm1hdGlvbnMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ4c2x0IiwKICAgICAgInhzbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiRiMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgIm1hdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZnMiLAogICAgICAiZnNpIiwKICAgICAgImZzeCIsCiAgICAgICJmc3NjcmlwdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkZhY3RvciIgOnsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYiLAogICAgICAid2hlbiIsCiAgICAgICJ1bmxlc3MiLAogICAgICAiaWYqIiwKICAgICAgIndoZW4qIiwKICAgICAgInVubGVzcyoiLAogICAgICAiP2lmIiwKICAgICAgIj8iLAogICAgICAiY29uZCIsCiAgICAgICJjYXNlIiwKCiAgICAgICJjb25kPnF1b3QiLAogICAgICAiY2FzZT5xdW90IiwKICAgICAgImFsaXN0PnF1b3QiLAoKICAgICAgIndoaWxlIiwKICAgICAgInVudGlsIiwKICAgICAgImxvb3AiLAoKICAgICAgIjAmJiIsCiAgICAgICIxJiYiLAogICAgICAiMiYmIiwKICAgICAgIjMmJiIsCiAgICAgICJuJiYiLAogICAgICAiJiYiLAoKICAgICAgIjB8fCIsCiAgICAgICIxfHwiLAogICAgICAiMnx8IiwKICAgICAgIjN8fCIsCiAgICAgICJufHwiLAogICAgICAifHwiLAoKICAgICAgImFuZCIsCiAgICAgICJvciIsCiAgICAgICJ4b3IiLAoKICAgICAgImVxIiwKICAgICAgIj0iLAoKICAgICAgInNtYXJ0LWlmIiwKICAgICAgInNtYXJ0LWlmKiIsCiAgICAgICJzbWFydC13aGVuIiwKICAgICAgInNtYXJ0LXdoZW4qIiwKICAgICAgInNtYXJ0LXVubGVzcyIsCiAgICAgICJzbWFydC11bmxlc3MqIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZmFjdG9yIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIiFbWyIsCiAgICAgICAgIl1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiFbPVsiLAogICAgICAgICJdPV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiIVs9PVsiLAogICAgICAgICJdPT1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiFbPT09WyIsCiAgICAgICAgIl09PT1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiFbPT09PVsiLAogICAgICAgICJdPT09PV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiIVs9PT09PVsiLAogICAgICAgICJdPT09PT1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiFbPT09PT09WyIsCiAgICAgICAgIl09PT09PT1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiKCgiLAogICAgICAgICIpKSIKICAgICAgXQogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIhIgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiXCIiLAogICAgICAgICJlbmQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiU1RSSU5HOiIsCiAgICAgICAgImVuZCI6ICI7IgogICAgICB9LAogICAgICB7CiAgICAgICAgInN0YXJ0IjogIls9PT09PT1bIiwKICAgICAgICAiZW5kIjogIl09PT09PT1dIgogICAgICB9LAogICAgICB7CiAgICAgICAgInN0YXJ0IjogIls9PT09PVsiLAogICAgICAgICJlbmQiOiAiXT09PT1dIgogICAgICB9LAogICAgICB7CiAgICAgICAgInN0YXJ0IjogIls9PT09WyIsCiAgICAgICAgImVuZCI6ICJdPT09PV0iCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiWz09PVsiLAogICAgICAgICJlbmQiOiAiXT09PV0iCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiWz09WyIsCiAgICAgICAgImVuZCI6ICJdPT1dIgogICAgICB9LAogICAgICB7CiAgICAgICAgInN0YXJ0IjogIls9WyIsCiAgICAgICAgImVuZCI6ICJdPV0iCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiW1siLAogICAgICAgICJlbmQiOiAiXV0iCiAgICAgIH0KICAgIF0KICB9LAogICJGZW5uZWwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgIihmb3IiLAogICAgICAiKGVhY2giLAogICAgICAiKGlmIiwKICAgICAgIih3aGVuIiwKICAgICAgIih3aGlsZSIsCiAgICAgICIoc3dpdGNoIiwKICAgICAgIihkbyIsCiAgICAgICIoLi4iLAogICAgICAiKD0iLAogICAgICAiKGFuZCIsCiAgICAgICIob3IiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJmbmwiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI7IgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiXCIiLAogICAgICAgICJlbmQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiLCIsCiAgICAgICAgImVuZCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiRioiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZzdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkZJREwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZpZGwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiRk9SVFJBTiBMZWdhY3kiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImYiLAogICAgICAiZm9yIiwKICAgICAgImZ0biIsCiAgICAgICJmNzciLAogICAgICAicGZvIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICJjIiwKICAgICAgIkMiLAogICAgICAiISIsCiAgICAgICIqIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJGT1JUUkFOIE1vZGVybiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZjAzIiwKICAgICAgImYwOCIsCiAgICAgICJmOTAiLAogICAgICAiZjk1IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIhIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkZpc2giOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZpc2giCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImZpc2giCiAgICBdCiAgfSwKICAiRmxvdzkiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAiZWxzZSAiLAogICAgICAiZWxzZXsiLAogICAgICAiZm9yaSAiLAogICAgICAiZm9yaSgiLAogICAgICAic3dpdGNoICIsCiAgICAgICJzd2l0Y2goIiwKICAgICAgImZvbGQgIiwKICAgICAgImZvbGQoIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIsCiAgICAgICJ8PiAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJmbG93IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkZvcnRoIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICI0dGgiLAogICAgICAiZm9ydGgiLAogICAgICAiZnIiLAogICAgICAiZnJ0IiwKICAgICAgImZ0aCIsCiAgICAgICJmODMiLAogICAgICAiZmIiLAogICAgICAiZnBtIiwKICAgICAgImU0IiwKICAgICAgInJ4IiwKICAgICAgImZ0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICJcXFxcIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIiggIiwKICAgICAgICAiKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkZyYWdtZW50IFNoYWRlciBGaWxlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJmc2giCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiRnJlZW1hcmtlciBUZW1wbGF0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiPCNsaXN0ICIsCiAgICAgICI8I2Fzc2lnbiAiLAogICAgICAiPCNpZiAiLAogICAgICAiPCNlbHNlaWYgIiwKICAgICAgIjwjZWxzZT4iLAogICAgICAiPCNlbHNlPiAiLAogICAgICAiPCNzd2l0Y2ggICIsCiAgICAgICI8I2Nhc2UgIiwKICAgICAgIjwjZGVmYXVsdD4iLAogICAgICAiPCNkZWZhdWx0PiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZ0bCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8Iy0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiRlNMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICItPiIsCiAgICAgICI8LSIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZzbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkZ1dGhhcmsiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImlmICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ0aGVuICIsCiAgICAgICJmb3IgIiwKICAgICAgImxvb3AgIiwKICAgICAgIndoaWxlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI+PSAiLAogICAgICAiPD0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZnV0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiRlhNTCI6IHsKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZnhtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIklOSSI6IHsKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaW5pIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIiwKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkdEU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJnZCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiXFxcIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiXFxcIlxcXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJHTFNMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2ZXJ0IiwKICAgICAgInRlc2MiLAogICAgICAidGVzZSIsCiAgICAgICJnZW9tIiwKICAgICAgImZyYWciLAogICAgICAiY29tcCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJHTiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYoIiwKICAgICAgImlmICgiLAogICAgICAiZWxzZSBpZigiLAogICAgICAiZWxzZSBpZiAoIiwKICAgICAgImVsc2UoIiwKICAgICAgImVsc2UgKCIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJnbiIsCiAgICAgICJnbmkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJHYW1lIE1ha2VyIExhbmd1YWdlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJyZXBlYXQgIiwKICAgICAgInJlcGVhdCgiLAogICAgICAifHwgIiwKICAgICAgIm9yICIsCiAgICAgICImJiAiLAogICAgICAiYW5kICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZ21sIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIsCiAgICAgICIvLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJHYW1lIE1ha2VyIFByb2plY3QiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ5eXAiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkdlbWZpbGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICJnZW1maWxlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJHaGVya2luIFNwZWNpZmljYXRpb24iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImdpdmVuIiwKICAgICAgIndoZW4iLAogICAgICAidGhlbiIsCiAgICAgICJhbmQiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJmZWF0dXJlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJHbyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZ28gIiwKICAgICAgImRlZmVyICIsCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJnbyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImAiLAogICAgICAgICJpZ25vcmVFc2NhcGUiOiB0cnVlLAogICAgICAgICJzdGFydCI6ICJgIgogICAgICB9CiAgICBdCiAgfSwKICAiR28gVGVtcGxhdGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgInt7aWYgIiwKICAgICAgInt7IGlmICIsCiAgICAgICJ7e2Vsc2UiLAogICAgICAie3sgZWxzZSIsCiAgICAgICJ7e3JhbmdlICIsCiAgICAgICJ7eyByYW5nZSAiLAogICAgICAie3t3aXRoIiwKICAgICAgInt7IHdpdGgiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0bXBsIiwKICAgICAgImdvaHRtbCIsCiAgICAgICJnb3R4dCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7ey8qIiwKICAgICAgICAiKi99fSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkdyYWRsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImdyYWRsZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiR3JhcGhRTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAidHlwZSAiLAogICAgICAiaW5wdXQgIiwKICAgICAgInF1ZXJ5ICIsCiAgICAgICJtdXRhdGlvbiAiLAogICAgICAic3Vic2NyaXB0aW9uICIsCiAgICAgICJkaXJlY3RpdmUgIiwKICAgICAgInNjYWxhciAiLAogICAgICAiZW51bSAiLAogICAgICAiaW50ZXJmYWNlICIsCiAgICAgICJ1bmlvbiAiLAogICAgICAiZnJhZ21lbnQgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZ3JhcGhxbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJcIlwiXCIiLAogICAgICAgICJcIlwiXCIiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICJcIlwiXCIiLAogICAgICAgICJzdGFydCI6ICJcIlwiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJET1QiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkb3QiLAogICAgICAiZ3YiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIiwKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkdyb292eSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZ3Jvb3Z5IiwKICAgICAgImdydCIsCiAgICAgICJndHBsIiwKICAgICAgImd2eSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJIRVgiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJoZXgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkhUTUwiOiB7CiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImh0bWwiLAogICAgICAiaHRtIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSEFNTCI6IHsKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaGFtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLSMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkhhbWxldCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaGFtbGV0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSGFuZGxlYmFycyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaGJzIiwKICAgICAgImhhbmRsZWJhcnMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPCEtLSIsCiAgICAgICAgIi0tPiIKICAgICAgXSwKICAgICAgWwogICAgICAgICJ7eyEiLAogICAgICAgICJ9fSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkhhcHB5IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieSIsCiAgICAgICJseSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiSGFyZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZSAiLAogICAgICAibWF0Y2ggIiwKICAgICAgInN3aXRjaCAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaGEiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKCSJlbmQiOiAiYCIsCiAgICAgICAgInN0YXJ0IjogImAiCiAgICAgIH0KICAgIF0KICB9LAogICJIYXNrZWxsIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJpZiAiLAogICAgICAidGhlbiAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIvPSAiLAogICAgICAiPT0gIiwKICAgICAgImNhc2UgIiwKICAgICAgImRvIHsiLAogICAgICAiZm9yYWxsICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImhzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7LSIsCiAgICAgICAgIi19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiSGF4ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaHgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiaG9vbiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiJSsgIHR1cm4iLAogICAgICAiKHR1cm4gIiwKICAgICAgIiUrICByb2xsIiwKICAgICAgIihyb2xsICIsCiAgICAgICIlKyAgcmVlbCIsCiAgICAgICIocmVlbCAiLAogICAgICAifC4gICIsCiAgICAgICJ8LigiLAogICAgICAifC0gICIsCiAgICAgICJ8LSgiLAogICAgICAifD8gICIsCiAgICAgICJ8PygiLAogICAgICAiP3wgICIsCiAgICAgICI/fCgiLAogICAgICAifCgiLAogICAgICAiPy0gICIsCiAgICAgICI/LSgiLAogICAgICAiPzogICIsCiAgICAgICI/OigiLAogICAgICAiPy4gICIsCiAgICAgICI/LigiLAogICAgICAiP14gICIsCiAgICAgICI/XigiLAogICAgICAiPzwgICIsCiAgICAgICI/PCgiLAogICAgICAiPz4gICIsCiAgICAgICI/PigiLAogICAgICAiPysgICIsCiAgICAgICI/KygiLAogICAgICAiPyYgICIsCiAgICAgICI/JigiLAogICAgICAiJigiLAogICAgICAiP0AgICIsCiAgICAgICI/QCgiLAogICAgICAiP34gICIsCiAgICAgICI/figiLAogICAgICAiPz0gICIsCiAgICAgICI/PSgiLAogICAgICAiLj0gICIsCiAgICAgICI9KCIsCiAgICAgICIhPSgiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJob29uIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI6OiIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImBgYCIsCiAgICAgICAgInN0YXJ0IjogImBgYCIKICAgICAgfQogICAgXQogIH0sCiAgIklETCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaWRsIiwKICAgICAgIndlYmlkbCIsCiAgICAgICJ3aWRsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIklkcmlzIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJpZHIiLAogICAgICAibGlkciIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLS0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiey0iLAogICAgICAgICItfSIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCJcXFwiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCJcXFwiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkludGVsIEhFWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImloZXgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIklzYWJlbGxlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0aHkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInsqIiwKICAgICAgICAiKn0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXSwKICAgICAgWwogICAgICAgICLigLkiLAogICAgICAgICLigLoiCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiXFxcXDxvcGVuPiIsCiAgICAgICAgIlxcXFw8Y2xvc2U+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyciLAogICAgICAgICJzdGFydCI6ICInJyIKICAgICAgfQogICAgXQogIH0sCiAgIkpBSSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamFpIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSlNPTiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImpzb24iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkpTT05DIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAianNvbmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSlNPTkwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc29ubCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiSnNvbm5ldCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yIiwKICAgICAgImlmIiwKICAgICAgImVsc2UiLAogICAgICAifHwiLAogICAgICAiJiYiLAogICAgICAiIT0iLAogICAgICAiPT0iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc29ubmV0IiwKICAgICAgImxpYnNvbm5ldCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIsCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogInx8fCIsCiAgICAgICAgInN0YXJ0IjogInx8fCIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJAXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICJAJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImpzb25uZXQiCiAgICBdCiAgfSwKICAiSlNYIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc3giCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSmFkZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYgIiwKICAgICAgImVsc2UgaWYgIiwKICAgICAgInVubGVzcyAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqYWRlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLy0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkphbmV0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICIoaWYgIiwKICAgICAgIihmb3IgIiwKICAgICAgIihmb3IgIiwKICAgICAgIihjb25kICIsCiAgICAgICIoc3dpdGNoICIsCiAgICAgICIod2hlbiAiLAogICAgICAiKHdoaWxlICIsCiAgICAgICIobG9vcCAiLAogICAgICAiKGNhc2UgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamFuZXQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiBmYWxzZSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImBgIiwKICAgICAgICAic3RhcnQiOiAiYGAiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiQFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSmF2YSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamF2YSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJKYXZhU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqcyIsCiAgICAgICJtanMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAibm9kZSIKICAgIF0KICB9LAogICJKYXZhU2VydmVyIFBhZ2VzIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc3AiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkplbmtpbnMgQnVpbGRmaWxlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamVua2luc2ZpbGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkppbmphIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJ7JSBmb3IgIiwKICAgICAgInslLSBmb3IgIiwKICAgICAgInslIGlmICIsCiAgICAgICJ7JS0gaWYgIiwKICAgICAgInslIGVsc2UgIiwKICAgICAgInslLSBlbHNlICIsCiAgICAgICJ7JSBlbGlmICIsCiAgICAgICJ7JSBtYWNybyAiLAogICAgICAieyUtIG1hY3JvICIsCiAgICAgICJ7JSBjYWxsICIsCiAgICAgICJ7JS0gY2FsbCAiLAogICAgICAieyUgZmlsdGVyICIsCiAgICAgICJ7JS0gZmlsdGVyICIsCiAgICAgICJ7JSBzZXQgIiwKICAgICAgInslIGluY2x1ZGUgIiwKICAgICAgInslIGZyb20gIiwKICAgICAgInslIGV4dGVuZHMgIiwKICAgICAgInslIHdpdGggIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamluamEiLAogICAgICAiajIiLAogICAgICAiamluamEyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInsjIiwKICAgICAgICAiI30iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJKdWxpYSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgImVsc2VpZiAiLAogICAgICAiZWxzZWlmKCIsCiAgICAgICJ0cnkgIiwKICAgICAgImNhdGNoICIsCiAgICAgICJmaW5hbGx5ICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiIz0iLAogICAgICAgICI9IyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCJcXFwiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCJcXFwiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkp1bGl1cyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAianVsaXVzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkp1cHl0ZXIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJpcHluYiIsCiAgICAgICJqcHluYiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiSnVzdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAianVzdGZpbGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiJyIsCiAgICAgICIvIiwKICAgICAgIlxcIiwKICAgICAgIic6IiwKICAgICAgIi86IiwKICAgICAgIlxcOiIsCiAgICAgICJ8IiwKICAgICAgIiYiLAogICAgICAiISIsCiAgICAgICI9IgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiayIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLyIKICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiS29ybiBTaGVsbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAia3NoIgogICAgXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICIua3NocmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImtzaCIKICAgIF0KICB9LAogICJLb3RsaW4iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImt0IiwKICAgICAgImt0cyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkxEIFNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibGRzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkxFU1MiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJsZXNzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkxFWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkxPTENPREUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgIkFXU1VNIFRIWCAiLAogICAgICAiTyBOT0VTICIsCiAgICAgICJQTFogT1BFTiBGSUxFICIsCiAgICAgICJJTSBJTiBZUiAiLAogICAgICAiTyBSTFk/IiwKICAgICAgIk8gUkxZPyAiLAogICAgICAiV1RGPyIsCiAgICAgICJXVEY/ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImxvbCIsCiAgICAgICJsb2xzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICJCVFciCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiT0JUVyIsCiAgICAgICAgIlRMRFIiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiTGFUZVgiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0ZXgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiUiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkxlYW4iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImxlYW4iLAogICAgICAiaGxlYW4iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8tIiwKICAgICAgICAiLS8iCiAgICAgIF0KICAgIF0sCiAgICAibmVzdGVkbXVsdGlsaW5lIjogdHJ1ZSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkxpY2Vuc2UiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICJsaWNlbnNlIiwKICAgICAgImxpY2VuY2UiLAogICAgICAiY29weWluZyIsCiAgICAgICJjb3B5aW5nMyIsCiAgICAgICJ1bmxpY2Vuc2UiLAogICAgICAidW5saWNlbmNlIiwKICAgICAgImxpY2Vuc2UtbWl0IiwKICAgICAgImxpY2VuY2UtbWl0IiwKICAgICAgImNvcHlyaWdodCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiTGlzcCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibGlzcCIsCiAgICAgICJsc3AiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiI3wiLAogICAgICAgICJ8IyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFtdLAogICAgInNoZWJhbmdzIjogWwogICAgICAic2JjbCIKICAgIF0KICB9LAogICJMTFZNIElSIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJsbHZtLmxvb3AiLAogICAgICAiYnIgIiwKICAgICAgInN3aXRjaCAiLAogICAgICAiaW5kaXJlY3RiciAiLAogICAgICAiaW52b2tlICIsCiAgICAgICJjYWxsYnIgIiwKICAgICAgInJlc3VtZSAiLAogICAgICAiY2F0Y2hzd2l0Y2ggIiwKICAgICAgImNhdGNocmV0ICIsCiAgICAgICJjbGVhbnVwcmV0ICIsCiAgICAgICJzaGwgIiwKICAgICAgImxzaHIgIiwKICAgICAgImFzaHIgIiwKICAgICAgImFuZCAiLAogICAgICAib3IgIiwKICAgICAgInhvciAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJsbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFtdCiAgfSwKICAiTHVhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJ3aGlsZSAiLAogICAgICAid2hpbGUoIiwKICAgICAgImVsc2UgIiwKICAgICAgImVsc2UoIiwKICAgICAgImVsc2VpZiAiLAogICAgICAiZWxzZWlmKCIsCiAgICAgICJvciAiLAogICAgICAiYW5kICIsCiAgICAgICJ+PSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibHVhIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICItLVtbIiwKICAgICAgICAiXV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgIi0tWz1bIiwKICAgICAgIl09XSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPT1bIiwKICAgICAgIl09PV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgIi0tWz09PVsiLAogICAgICAiXT09PV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgIi0tWz09PT1bIiwKICAgICAgIl09PT09XSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPT09PT1bIiwKICAgICAgIl09PT09PV0iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIltbIiwKICAgICAgICAic3RhcnQiOiAiXV0iCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJsdWEiCiAgICBdCiAgfSwKICAiTHVhdSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJlbHNlICIsCiAgICAgICJlbHNlKCIsCiAgICAgICJlbHNlaWYgIiwKICAgICAgImVsc2VpZigiLAogICAgICAib3IgIiwKICAgICAgImFuZCAiLAogICAgICAifj0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImx1YXUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi0tW1siLAogICAgICAgICJdXSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPVsiLAogICAgICAiXT1dIgogICAgICBdLAogICAgICBbCiAgICAgICItLVs9PVsiLAogICAgICAiXT09XSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPT09WyIsCiAgICAgICJdPT09XSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPT09PVsiLAogICAgICAiXT09PT1dIgogICAgICBdLAogICAgICBbCiAgICAgICItLVs9PT09PVsiLAogICAgICAiXT09PT09XSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiYCIsCiAgICAgICAgInN0YXJ0IjogImAiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIltbIiwKICAgICAgICAic3RhcnQiOiAiXV0iCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJsdWF1IgogICAgXQogIH0sCiAgIkx1Y2l1cyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibHVjaXVzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkx1bmEiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJsdW5hIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJNUUwgSGVhZGVyIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJtcWgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiTVFMNCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibXE0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk1RTDUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm1xNSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJNU0J1aWxkIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJDb25kaXRpb24iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjc3Byb2oiLAogICAgICAidmJwcm9qIiwKICAgICAgImZzcHJvaiIsCiAgICAgICJ2Y3Byb2oiLAogICAgICAidmN4cHJvaiIsCiAgICAgICJ2Y3hwcm9qLmZpbHRlcnMiLAogICAgICAiaWxwcm9qIiwKICAgICAgIm15YXBwIiwKICAgICAgInByb3BzIiwKICAgICAgInJkbGMiLAogICAgICAicmVzeCIsCiAgICAgICJzZXR0aW5ncyIsCiAgICAgICJzbG4iLAogICAgICAidGFyZ2V0cyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk1VTVBTIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJtcHMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJNYWNyb21lZGlhIGVYdGVuc2libGUgTWFya3VwIExhbmd1YWdlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibXhtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiTWFkbGFuZyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibWFkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInsjIiwKICAgICAgICAiI30iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJNYWtlZmlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibWFrZWZpbGUiLAogICAgICAibWFrIiwKICAgICAgIm1rIiwKICAgICAgImJwIgogICAgXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICJtYWtlZmlsZSIsCiAgICAgICJnbnVtYWtlZmlsZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiTWFrbyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiJSBmb3IgIiwKICAgICAgIiUgaWYgIiwKICAgICAgIiUgZWxzZSAiLAogICAgICAiJSBlbGlmICIsCiAgICAgICI8JSBpbmNsdWRlICIsCiAgICAgICI8JWRlZiAiLAogICAgICAiPCVwYWdlICIsCiAgICAgICI8JWRlZiAiLAogICAgICAiPCVibG9jayAiLAogICAgICAiPCVuYW1lc3BhY2UgIiwKICAgICAgIjwlaW5oZXJpdCAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJtYWtvIiwKICAgICAgIm1hbyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPCVkb2M+IiwKICAgICAgICAiPC8lZG9jPiIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIk1hcmtkb3duIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibWQiLAogICAgICAibWFya2Rvd24iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIk1lc29uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3JlYWNoICIsCiAgICAgICJpZiAiLAogICAgICAiZWxpZiAiLAogICAgICAidW5sZXNzICIsCiAgICAgICJhbmQgIiwKICAgICAgIm9yICIsCiAgICAgICJlbHNlICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm1lc29uLmJ1aWxkIiwKICAgICAgIm1lc29uX29wdGlvbnMudHh0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICInJyciCiAgICAgIH0KICAgIF0KICB9LAogICJNQVRMQUIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImlmICIsCiAgICAgICJlbHNlaWYgIiwKICAgICAgImNhc2UgIiwKICAgICAgIm90aGVyd2lzZSAiLAogICAgICAidHJ5IiwKICAgICAgImZvciAiLAogICAgICAid2hpbGUgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibSIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJleWUoIiwKICAgICAgInplcm9zKCIsCiAgICAgICJvbmVzKCIsCiAgICAgICJ0cmFuc3Bvc2UoIiwKICAgICAgIm1lc2hncmlkKCIsCiAgICAgICJtb2QoIiwKICAgICAgImNsYXNzZGVmIiwKICAgICAgImZ1bmN0aW9uIiwKICAgICAgImRpc3AoIiwKICAgICAgInNpbigiLAogICAgICAidGFuKCIsCiAgICAgICJjb3MoIiwKICAgICAgInBsb3QiLAogICAgICAic3FydCgiLAogICAgICAiZGVibGFuaygiLAogICAgICAiZmluZHN0cigiLAogICAgICAic3RycmVwKCIsCiAgICAgICJzdHJjbXAoIiwKICAgICAgImRpc3BsYXkoIiwKICAgICAgInN0cmNhdCgiLAogICAgICAiaXNjZWxsc3RyKCIsCiAgICAgICJzdHJmaW5kKCIsCiAgICAgICIlIiwKICAgICAgImZwcmludGYoIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIlIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIiV7IiwKICAgICAgICAifSUiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIk1EWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm1keCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiTW9kdWxhMyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibTMiLAogICAgICAibWciLAogICAgICAiaWciLAogICAgICAiaTMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJNb2R1bGUtRGVmaW5pdGlvbiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZGVmIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI7IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJNb25rZXkgQyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibWMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiTXVzdGFjaGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm11c3RhY2hlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInt7ISIsCiAgICAgICAgIn19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiTmlhbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiY2FzZSAiLAogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAicmVwZWF0ICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAib3IgIiwKICAgICAgImFuZCAiLAogICAgICAiPSAiLAogICAgICAiZXF1YWwgIiwKICAgICAgIn49ICIsCiAgICAgICJ1bmVxdWFsICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm5kZiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJOaW0iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm5pbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCJcXFwiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCJcXFwiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk5peCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibml4IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk9DYW1sIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJtbCIsCiAgICAgICJtbGkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJPYmplY3RpdmUgQyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibSIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICIjaW5jbHVkZSIsCiAgICAgICJwcmludGYiLAogICAgICAic3RkaW8uaCIsCiAgICAgICIuaCIsCiAgICAgICJAaW1wb3J0IiwKICAgICAgIkBpbnRlcmZhY2UiLAogICAgICAiQHByb3BlcnR5IiwKICAgICAgIkBpbXBsZW1lbnRhdGlvbiIsCiAgICAgICJOU0FycmF5IiwKICAgICAgIiNwcmFnbWEiLAogICAgICAic3RhdGljIiwKICAgICAgImNvbnN0IiwKICAgICAgImF0b21pYyIsCiAgICAgICJAZW5kIiwKICAgICAgIi8vIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk9iamVjdGl2ZSBDKysiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm1tIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk9wYWxhbmciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm9wYSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJPcmciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm9yZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyAiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIk96IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJveiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlBIUCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicGhwIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIiwKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJwaHAiLAogICAgICAicGhwNSIKICAgIF0KICB9LAogICJQS0dCVUlMRCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBrZ2J1aWxkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJQa2wiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZ1bmN0aW9uICIsCiAgICAgICI/PyAiLAogICAgICAiPy4iLAogICAgICAiaWZOb25OdWxsKCIsCiAgICAgICJpZiAiLAogICAgICAiIGVsc2UgIiwKICAgICAgIi5tYXAiLAogICAgICAiZm9yICIsCiAgICAgICJ3aGVuICIsCiAgICAgICIuLi4iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwa2wiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICIjXCIiLAogICAgICAgICJzdGFydCI6ICJcIiMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiMjXCIiLAogICAgICAgICJzdGFydCI6ICJcIiMjIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcIlwiXCIiLAogICAgICAgICJpZ25vcmVFc2NhcGUiOiB0cnVlLAogICAgICAgICJzdGFydCI6ICJcIlwiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJQTC9TUUwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImFuZCAiLAogICAgICAiYW5kKCIsCiAgICAgICJlbHNlICIsCiAgICAgICJlbHNlKCIsCiAgICAgICJlbHNlaWYgIiwKICAgICAgImVsc2VpZigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJsb29wICIsCiAgICAgICJub3QgIiwKICAgICAgIm5vdCgiLAogICAgICAib3IgIiwKICAgICAgIm9yKCIsCiAgICAgICI8PiAiLAogICAgICAiPD4oIiwKICAgICAgIj0gIiwKICAgICAgIj0oIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZm5jIiwKICAgICAgInBrYiIsCiAgICAgICJwa3MiLAogICAgICAicHJjIiwKICAgICAgInRyZyIsCiAgICAgICJ2dyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLS0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiUFNMIEFzc2VydGlvbiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHNsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlBhc2NhbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicGFzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7IiwKICAgICAgICAifSIKICAgICAgXSwKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJQYXRjaCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBhdGNoIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJQZXJsIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwbCIsCiAgICAgICJwbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI9cG9kIiwKICAgICAgICAiPWN1dCIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgInBlcmwiLAogICAgICAicGVybDUiCiAgICBdCiAgfSwKICAiUGljYXQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImRvICIsCiAgICAgICJmb3JlYWNoICIsCiAgICAgICJmb3JlYWNoKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwaSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlBsYWluIFRleHQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0ZXh0IiwKICAgICAgInR4dCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiUG9sbHkiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBvbGx5IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiUG9ueSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAibWF0Y2ggIiwKICAgICAgInJlcGVhdCIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAiZWxzZWlmICIsCiAgICAgICJ8ICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwb255IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIlxcXCJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIlxcXCJcXFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiUG93ZXJzaGVsbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJ1bnRpbCAiLAogICAgICAidW50aWwoIiwKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJmb3JlYWNoICIsCiAgICAgICJmb3JlYWNoKCIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZWlmICIsCiAgICAgICJlbHNlICIsCiAgICAgICJzd2l0Y2giLAogICAgICAic3dpdGNoKCIsCiAgICAgICItZ3QiLAogICAgICAiLWx0IiwKICAgICAgIi1lcSIsCiAgICAgICItbmUiLAogICAgICAiLWdlIiwKICAgICAgIi1sZSIsCiAgICAgICItaW4iLAogICAgICAiLW5vdGluIiwKICAgICAgIi1jb250YWlucyIsCiAgICAgICItbm90Y29udGFpbnMiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwczEiLAogICAgICAicHNtMSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IyIsCiAgICAgICAgIiM+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlByb2Nlc3NpbmciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBkZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJQcm9sb2ciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInAiLAogICAgICAicHJvIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIlIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiUHJvcGVydGllcyBGaWxlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHJvcGVydGllcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiUHJvdG9jb2wgQnVmZmVycyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHJvdG8iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJQdXBwZXQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBwIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIj1iZWdpbiIsCiAgICAgICAgIj1lbmQiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJQdXJlU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwdXJzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7LSIsCiAgICAgICAgIi19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiUHl0aG9uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgImVsaWYgIiwKICAgICAgImVsaWYoIiwKICAgICAgImVsc2UgIiwKICAgICAgImVsc2U6IiwKICAgICAgIm1hdGNoICIsCiAgICAgICJtYXRjaCgiLAogICAgICAidHJ5ICIsCiAgICAgICJ0cnk6IiwKICAgICAgImV4Y2VwdCAiLAogICAgICAiZXhjZXB0KCIsCiAgICAgICJmaW5hbGx5ICIsCiAgICAgICJmaW5hbGx5OiIsCiAgICAgICJ3aXRoICIsCiAgICAgICJ3aXRoICgiLAogICAgICAiYW5kICIsCiAgICAgICJhbmQoIiwKICAgICAgIm9yICIsCiAgICAgICJvcigiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJweSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZG9jU3RyaW5nIjogdHJ1ZSwKICAgICAgICAiZW5kIjogIlwiXCJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiXCJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJkb2NTdHJpbmciOiB0cnVlLAogICAgICAgICJlbmQiOiAiJycnIiwKICAgICAgICAic3RhcnQiOiAiJycnIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICJcIlwiXCIiLAogICAgICAgICJzdGFydCI6ICJyXCJcIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICJyJycnIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAicHl0aG9uIiwKICAgICAgInB5dGhvbjIiLAogICAgICAicHl0aG9uMyIKICAgIF0KICB9LAogICJQUlFMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJjYXNlICIsCiAgICAgICImJiAiLAogICAgICAifHwgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiLAogICAgICAifj0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHJxbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZG9jU3RyaW5nIjogdHJ1ZSwKICAgICAgICAiZW5kIjogIlwiXCJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiXCJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJkb2NTdHJpbmciOiB0cnVlLAogICAgICAgICJlbmQiOiAiJycnIiwKICAgICAgICAic3RhcnQiOiAiJycnIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICJcIlwiXCIiLAogICAgICAgICJzdGFydCI6ICJyXCJcIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICJyJycnIgogICAgICB9CiAgICBdCiAgfSwKICAiUSMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJyZXBlYXQgIiwKICAgICAgInJlcGVhdHsiLAogICAgICAidW50aWwgKCIsCiAgICAgICJ1bnRpbCgiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJlbGlmICIsCiAgICAgICJlbGlmeyIsCiAgICAgICJlbHNlICIsCiAgICAgICJlbHNleyIsCiAgICAgICJ8fHwgIiwKICAgICAgIiYmJiAiLAogICAgICAiPDw8IiwKICAgICAgIj4+PiIsCiAgICAgICJeXl4iLAogICAgICAifn5+IiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJxcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJRQ0wiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInFjbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJRTUwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInFtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJSIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJSYWtlZmlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogW10sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAicmFrZSIsCiAgICAgICJyYWtlZmlsZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI9YmVnaW4iLAogICAgICAgICI9ZW5kIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiUmFrdSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiPT0gIiwKICAgICAgIuKJoSAiLAogICAgICAiIT0gIiwKICAgICAgIuKJoCAiLAogICAgICAiIT09ICIsCiAgICAgICLiiaIgIiwKICAgICAgIjwgIiwKICAgICAgIuKKgiAiLAogICAgICAiITwgIiwKICAgICAgIuKKhCAiLAogICAgICAiPD0gIiwKICAgICAgIuKJpCAiLAogICAgICAi4oqGICIsCiAgICAgICIhPD0gIiwKICAgICAgIuKKiCAiLAogICAgICAiPiAiLAogICAgICAi4oqDICIsCiAgICAgICIhPiAiLAogICAgICAi4oqFICIsCiAgICAgICI+PSAiLAogICAgICAi4omlICIsCiAgICAgICLiiocgIiwKICAgICAgIiE+PSAiLAogICAgICAi4oqJICIsCiAgICAgICI9fj0gIiwKICAgICAgIuKJhSAiLAogICAgICAiPT09ICIsCiAgICAgICJlcSAiLAogICAgICAiIWVxICIsCiAgICAgICJlcXYgIiwKICAgICAgIm5lICIsCiAgICAgICJndCAiLAogICAgICAiZ2UgIiwKICAgICAgImx0ICIsCiAgICAgICJsZSAiLAogICAgICAiPTo9IiwKICAgICAgIkNBVENIICIsCiAgICAgICJDT05UUk9MICIsCiAgICAgICJET0MgIiwKICAgICAgIk5FWFQgIiwKICAgICAgImFuZCAiLAogICAgICAiZGVmYXVsdCAiLAogICAgICAiZG8geyIsCiAgICAgICJlbHNlICIsCiAgICAgICJlbHNpZiAiLAogICAgICAiZW1pdCAiLAogICAgICAiZm9yICIsCiAgICAgICJnYXRoZXIgIiwKICAgICAgImdpdmVuICIsCiAgICAgICJpZiAiLAogICAgICAibGFzdCAiLAogICAgICAibG9vcCAoIiwKICAgICAgIm5leHQgIiwKICAgICAgIm9uY2UgIiwKICAgICAgIm9yICIsCiAgICAgICJvcndpdGggIiwKICAgICAgInJlYWN0IHsiLAogICAgICAicmVkbyAiLAogICAgICAicmVwZWF0ICIsCiAgICAgICJzdGFydCB7IiwKICAgICAgInN1cHBseSAiLAogICAgICAidW5sZXNzICIsCiAgICAgICJ1bnRpbCAiLAogICAgICAid2hlbiAiLAogICAgICAid2hlbmV2ZXIgIiwKICAgICAgIndoaWxlICIsCiAgICAgICJ3aXRoICIsCiAgICAgICJ3aXRob3V0ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJha3UiLAogICAgICAicmFrdW1vZCIsCiAgICAgICJyYWt1dGVzdCIsCiAgICAgICJyYWt1ZG9jIiwKICAgICAgInQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPWJlZ2luIiwKICAgICAgICAiPWVuZCIKICAgICAgXSwKICAgICAgWwogICAgICAgICIjYCgiLAogICAgICAgICIpIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiNgWyIsCiAgICAgICAgIl0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiI2B7IiwKICAgICAgICAifSIKICAgICAgXSwKICAgICAgWwogICAgICAgICIjYO+9oiIsCiAgICAgICAgIu+9oyIKICAgICAgXQoKICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIuKAnCIsCiAgICAgICAgInN0YXJ0IjogIuKAniIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiwrsiLAogICAgICAgICJzdGFydCI6ICLCqyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiPj4iLAogICAgICAgICJzdGFydCI6ICI8PCIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAi4oCdIiwKICAgICAgICAic3RhcnQiOiAi4oCcIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICLigJgiLAogICAgICAgICJzdGFydCI6ICLigJkiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIu+9oyIsCiAgICAgICAgInN0YXJ0IjogIu+9oiIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgInJha3UiCiAgICBdCiAgfSwKICAiUmF6b3IiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNzaHRtbCIsCiAgICAgICJyYXpvciIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdLAogICAgICBbCiAgICAgICAgIkAqIiwKICAgICAgICAiKkAiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJSZVNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgIj09PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJyZXMiLAogICAgICAicmVzaSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJSZVN0cnVjdHVyZWRUZXh0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicnN0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJSZXBvcnQgRGVmaW5pdGlvbiBMYW5ndWFnZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJkbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIldpbmRvd3MgUmVzb3VyY2UtRGVmaW5pdGlvbiBTY3JpcHQiOiB7CiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJjIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXSwKICAgICJrZXl3b3JkcyI6IFsKICAgICAgIiNpbmNsdWRlIiwKICAgICAgIiNkZWZpbmUiLAogICAgICAiUkNfSU5WT0tFRCIsCiAgICAgICJWRVJTSU9OSU5GTyIsCiAgICAgICJGSUxFVkVSU0lPTiIsCiAgICAgICJQUk9EVUNUVkVSU0lPTiIsCiAgICAgICJGSUxFT1MiLAogICAgICAiRklMRVRZUEUiLAogICAgICAiQkxPQ0siLAogICAgICAiVkFMVUUiLAogICAgICAiU3RyaW5nRmlsZUluZm8iLAogICAgICAiVmFyRmlsZUluZm8iCiAgICBdCiAgfSwKICAiUm9ib3QgRnJhbWV3b3JrIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicm9ib3QiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlJ1YnkiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJiIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIj1iZWdpbiIsCiAgICAgICAgIj1lbmQiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJydWJ5IgogICAgXQogIH0sCiAgIlJ1YnkgSFRNTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicmh0bWwiLAogICAgICAiZXJiIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiUnVzdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgIm1hdGNoICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU0FTIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJkbyIsCiAgICAgICIlZG8iLAogICAgICAiaWYiLAogICAgICAiJWlmIiwKICAgICAgImVsc2UiLAogICAgICAiJWVsc2UiLAogICAgICAiY2FzZSIsCiAgICAgICJvciIsCiAgICAgICJhbmQiLAogICAgICAiXj0iLAogICAgICAiwqw9IiwKICAgICAgIn49IiwKICAgICAgIm5lIiwKICAgICAgImVxIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic2FzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIqIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIlNLSUxMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJpbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlNOT0JPTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiOigiLAogICAgICAiOnMoIiwKICAgICAgIjpmKCIsCiAgICAgICJlcSAiLAogICAgICAibmUgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic25vIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIqIgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiU1BEWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInNwZHgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlNRTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic3FsIiwKICAgICAgImRtbCIsCiAgICAgICJkZGwiLAogICAgICAiZHFsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJTUmVjb2RlIFRlbXBsYXRlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzcnQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjs7IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJTVkciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInN2ZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlNhc3MiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInNhc3MiLAogICAgICAic2NzcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJTY2FsYSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic2MiLAogICAgICAic2NhbGEiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU2NoZW1lIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzY20iLAogICAgICAic3MiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiI3wiLAogICAgICAgICJ8IyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFtdLAogICAgInNoZWJhbmdzIjogW10KICB9LAogICJSYWNrZXQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgIihpZiIsCiAgICAgICIoY29uZCIsCiAgICAgICJbZWxzZSIsCiAgICAgICIoYW5kIiwKICAgICAgIihvciIsCiAgICAgICIoZm9yIiwKICAgICAgIiM6d2hlbiIsCiAgICAgICIjOnVubGVzcyIsCiAgICAgICIjOmJyZWFrIiwKICAgICAgIiM6ZmluYWwiLAogICAgICAiKGRvIiwKICAgICAgIih3aGVuIiwKICAgICAgIih1bmxlc3MiLAogICAgICAiKHNoYXJlZCIsCiAgICAgICIoY2FzZSIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJrdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ8IyIsCiAgICAgICAgIiN8IgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAicmFja2V0IgogICAgXQogIH0sCiAgIlNjb25zIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjc2lnIiwKICAgICAgInNjb25zdHJ1Y3QiLAogICAgICAic2NvbnNjcmlwdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiXFxcIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiXFxcIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIicnJyIsCiAgICAgICAgInN0YXJ0IjogIicnJyIKICAgICAgfQogICAgXQogIH0sCiAgIlNoZWxsIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzaCIKICAgIF0sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAiLnRjc2hyYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAic2giCiAgICBdCiAgfSwKICAiTnVzaGVsbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJkbyB7ICIsCiAgICAgICJlYWNoIHsiLAogICAgICAiaWYgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm51IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgIm51IgogICAgXQogIH0sCiAgIlNtYXJ0eSBUZW1wbGF0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgImluY2x1ZGUgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidHBsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInsqIiwKICAgICAgICAiKn0iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJTb2Z0YnJpZGdlIEJhc2ljIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJlbHNlaWYgIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInNibCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJTb2xpZGl0eSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgImFzc2VtYmx5ICIsCiAgICAgICJhc3NlbWJseXsiLAogICAgICAidW5jaGVja2VkICIsCiAgICAgICJ1bmNoZWNrZWR7IgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic29sIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlNwZWNtYW4gZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLS0iLAogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiJz4iLAogICAgICAgICI8JyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlNwaWNlIE5ldGxpc3QiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNrdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiKiIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiU3RhbmRhcmQgTUwgKFNNTCkiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInNtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlN0YXRhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3JlYWNoIiwKICAgICAgImZvcnZhbHVlcyIsCiAgICAgICJpZiIsCiAgICAgICJlbHNlIiwKICAgICAgIndoaWxlIiwKICAgICAgInN3aXRjaCIsCiAgICAgICJ8IiwKICAgICAgIiYiLAogICAgICAiIT0iLAogICAgICAiPT0iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkbyIsCiAgICAgICJhZG8iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIiwKICAgICAgIioiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiJyIsCiAgICAgICAgInN0YXJ0IjogImBcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlN0eWx1cyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAidW5sZXNzICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzdHlsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlN2ZWx0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic3ZlbHRlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU3dpZnQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInN3aWZ0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU3dpZyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJTeXN0ZW1WZXJpbG9nIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8ICIsCiAgICAgICImICIsCiAgICAgICIhPSAiLAogICAgICAiIT09ICIsCiAgICAgICI9PSAiLAogICAgICAiZm9yZWFjaCAiLAogICAgICAiZm9yZWFjaCgiLAogICAgICAiY2FzZSAiLAogICAgICAiY2FzZSgiLAogICAgICAiY2FzZXggIiwKICAgICAgImNhc2V4KCIsCiAgICAgICJjYXNleiAiLAogICAgICAiY2FzZXooIiwKICAgICAgImNhc2V4eiAiLAogICAgICAiY2FzZXh6KCIsCiAgICAgICJmb3JrICIsCiAgICAgICIgPyAiLAogICAgICAiaW5zaWRlIiwKICAgICAgIndpdGgiLAogICAgICAiZXZlbnQgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic3YiLAogICAgICAic3ZoIgogICAgXSwKICAgICJrZXl3b3JkcyI6IFsKICAgICAgImVuZG1vZHVsZSIsCiAgICAgICJwb3NlZGdlIiwKICAgICAgImVkZ2UiLAogICAgICAiYWx3YXlzIiwKICAgICAgIndpcmUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU3lzdGVtZCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImF1dG9tb3VudCIsCiAgICAgICJkZXZpY2UiLAogICAgICAibGluayIsCiAgICAgICJtb3VudCIsCiAgICAgICJwYXRoIiwKICAgICAgInNjb3BlIiwKICAgICAgInNlcnZpY2UiLAogICAgICAic2xpY2UiLAogICAgICAic29ja2V0IiwKICAgICAgInN3YXAiLAogICAgICAidGFyZ2V0IiwKICAgICAgInRpbWVyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJUQ0wiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRjbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAidGNsIgogICAgXQogIH0sCiAgIlRPTUwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRvbWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIlxcXCJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIlxcXCJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICInJyciCiAgICAgIH0KICAgIF0KICB9LAogICJUYXNrUGFwZXIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0YXNrcGFwZXIiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlRlYWwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImxvb3A6IiwKICAgICAgInJldHN1YiIsCiAgICAgICJjYWxsc3ViICIsCiAgICAgICImJiIsCiAgICAgICI9PSIsCiAgICAgICJ8fCIsCiAgICAgICI8PSIsCiAgICAgICI+PSIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRlYWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJUZW1wbGF0ZVRvb2xraXQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgIlslIEJMT0NLIiwKICAgICAgIlslIEZJTFRFUiIsCiAgICAgICJbJSBGT1IiLAogICAgICAiWyUgRk9SRUFDSCIsCiAgICAgICJbJSBJRiIsCiAgICAgICJbJSBJTkNMVURFIiwKICAgICAgIlslIE1BQ1JPIiwKICAgICAgIlslIFBST0NFU1MiLAogICAgICAiWyUgU1dJVENIIiwKICAgICAgIlslIFVOTEVTUyIsCiAgICAgICJbJSBXUkFQUEVSIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidHQiLAogICAgICAidHQyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIlslIyIsCiAgICAgICAgIiVdIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiVGVtcGwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImlmICIsCiAgICAgICIgZWxzZSAiLAogICAgICAic3dpdGNoICIsCiAgICAgICJjYXNlICIsCiAgICAgICJkZWZhdWx0OiIsCiAgICAgICJmb3IgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRlbXBsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiYCIsCiAgICAgICAgImlnbm9yZUVzY2FwZSI6IHRydWUsCiAgICAgICAgInN0YXJ0IjogImAiCiAgICAgIH0KICAgIF0KICB9LAogICJUZXJyYWZvcm0iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImNvdW50IiwKICAgICAgImZvciIsCiAgICAgICJmb3JfZWFjaCIsCiAgICAgICJpZiIsCiAgICAgICI6ICIsCiAgICAgICI/ICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI+ICIsCiAgICAgICI+PSAiLAogICAgICAiPCAiLAogICAgICAiPD0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRmIiwKICAgICAgInRmLmpzb24iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiLAogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlRlWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidGV4IiwKICAgICAgInN0eSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiVGV4dGlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRleHRpbGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMjIy4gIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIiMjIy4uICIsCiAgICAgICAgInAuICIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlRocmlmdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRocmlmdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iLAogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJUd2lnIFRlbXBsYXRlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJ7JSBmb3IgIiwKICAgICAgInslIGlmICIsCiAgICAgICJ7JSBlbHNlICIsCiAgICAgICJ7JSBlbHNlaWYgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidHdpZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiVHlwZVNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifCAiLAogICAgICAifHwgIiwKICAgICAgIiYgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiIT09ICIsCiAgICAgICI9PSAiLAogICAgICAiPT09ICIsCiAgICAgICJmb3JlYWNoKCIsCiAgICAgICJjYXNlICIsCiAgICAgICJjYXNlKCIsCiAgICAgICJjYXNleCAiLAogICAgICAiY2FzZXgoIiwKICAgICAgImNhc2V6ICIsCiAgICAgICJjYXNleigiLAogICAgICAiY2FzZXh6ICIsCiAgICAgICJjYXNleHooIiwKICAgICAgImZvcmsiLAogICAgICAiPyIsCiAgICAgICI6IiwKICAgICAgImluc2lkZSIsCiAgICAgICJ3aXRoIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidHMiLAogICAgICAidHN4IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlR5cGVTY3JpcHQgVHlwaW5ncyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifCAiLAogICAgICAifHwgIiwKICAgICAgIiYgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiIT09ICIsCiAgICAgICI9PSAiLAogICAgICAiPT09ICIsCiAgICAgICJmb3JlYWNoKCIsCiAgICAgICJjYXNlICIsCiAgICAgICJjYXNlKCIsCiAgICAgICJjYXNleCAiLAogICAgICAiY2FzZXgoIiwKICAgICAgImNhc2V6ICIsCiAgICAgICJjYXNleigiLAogICAgICAiY2FzZXh6ICIsCiAgICAgICJjYXNleHooIiwKICAgICAgImZvcmsiLAogICAgICAiPyIsCiAgICAgICI6IiwKICAgICAgImluc2lkZSIsCiAgICAgICJ3aXRoIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZC50cyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiVEwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0bCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iLAogICAgICAiLy8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJVbnJlYWwgU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ1YyIsCiAgICAgICJ1Y2kiLAogICAgICAidXBrZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJVci9XZWIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInVyIiwKICAgICAgInVycyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlVyL1dlYiBQcm9qZWN0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ1cnAiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlYiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInYiCiAgICBdLAogICAgImtleXdvcmRzIjogWwogICAgICAiYnJlYWsiLAogICAgICAiY29uc3QgIiwKICAgICAgImNvbnRpbnVlIiwKICAgICAgImRlZmVyIiwKICAgICAgImVsc2UgIiwKICAgICAgImVudW0iLAogICAgICAiZm4gIiwKICAgICAgImdvdG8iLAogICAgICAiaW1wb3J0ICIsCiAgICAgICJpbiAiLAogICAgICAiaW50ZXJmYWNlIiwKICAgICAgIm1hdGNoIiwKICAgICAgIm11dCIsCiAgICAgICJwcmludGxuIiwKICAgICAgInB1YiIsCiAgICAgICJyZXR1cm4iLAogICAgICAic3RydWN0ICIsCiAgICAgICJ0eXBlICIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImAiLAogICAgICAgICJzdGFydCI6ICJgIgogICAgICB9CiAgICBdCiAgfSwKICAiVkhETCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidmhkIiwKICAgICAgInZoZGwiCiAgICBdLAogICAgImtleXdvcmRzIjogWwogICAgICAiYWJzIiwKICAgICAgImFjY2VzcyIsCiAgICAgICJhZnRlciIsCiAgICAgICJhbGlhcyIsCiAgICAgICJhbGwiLAogICAgICAiYW5kIiwKICAgICAgImFyY2hpdGVjdHVyZSIsCiAgICAgICJhcnJheSIsCiAgICAgICJhc3NlcnQiLAogICAgICAiYXR0cmlidXRlIiwKICAgICAgImJlZ2luIiwKICAgICAgImJsb2NrIiwKICAgICAgImJvZHkiLAogICAgICAiYnVmZmVyIiwKICAgICAgImJ1cyIsCiAgICAgICJjYXNlIiwKICAgICAgImNvbXBvbmVudCIsCiAgICAgICJjb25maWd1cmF0aW9uIiwKICAgICAgImNvbnN0YW50IiwKICAgICAgImRpc2Nvbm5lY3QiLAogICAgICAiZG93bnRvIiwKICAgICAgImVsc2UiLAogICAgICAiZWxzaWYiLAogICAgICAiZW5kIiwKICAgICAgImVudGl0eSIsCiAgICAgICJleGl0IiwKICAgICAgImZpbGUiLAogICAgICAiZm9yIiwKICAgICAgImZ1bmN0aW9uIiwKICAgICAgImdlbmVyYXRlIiwKICAgICAgImdlbmVyaWMiLAogICAgICAiZ3JvdXAiLAogICAgICAiZ3VhcmRlZCIsCiAgICAgICJpZiIsCiAgICAgICJpbXB1cmUiLAogICAgICAiaW4iLAogICAgICAiaW5lcnRpYWwiLAogICAgICAiaW5vdXQiLAogICAgICAiaXMiLAogICAgICAibGFiZWwiLAogICAgICAibGlicmFyeSIsCiAgICAgICJsaW5rYWdlIiwKICAgICAgImxpdGVyYWwiLAogICAgICAibG9vcCIsCiAgICAgICJtYXAiLAogICAgICAibW9kIiwKICAgICAgIm5hbmQiLAogICAgICAibmV3IiwKICAgICAgIm5leHQiLAogICAgICAibm9yIiwKICAgICAgIm5vdCIsCiAgICAgICJudWxsIiwKICAgICAgIm9mIiwKICAgICAgIm9uIiwKICAgICAgIm9wZW4iLAogICAgICAib3IiLAogICAgICAib3RoZXJzIiwKICAgICAgIm91dCIsCiAgICAgICJwYWNrYWdlIiwKICAgICAgInBvcnQiLAogICAgICAicG9zdHBvbmVkIiwKICAgICAgInByb2NlZHVyZSIsCiAgICAgICJwcm9jZXNzIiwKICAgICAgInB1cmUiLAogICAgICAicmFuZ2UiLAogICAgICAicmVjb3JkIiwKICAgICAgInJlZ2lzdGVyIiwKICAgICAgInJlamVjdCIsCiAgICAgICJyZW0iLAogICAgICAicmVwb3J0IiwKICAgICAgInJldHVybiIsCiAgICAgICJyb2wiLAogICAgICAicm9yIiwKICAgICAgInNlbGVjdCIsCiAgICAgICJzZXZlcml0eSIsCiAgICAgICJzaGFyZWQiLAogICAgICAic2lnbmFsIiwKICAgICAgInNsYSIsCiAgICAgICJzbGwiLAogICAgICAic3JhIiwKICAgICAgInNybCIsCiAgICAgICJzdWJ0eXBlIiwKICAgICAgInRoZW4iLAogICAgICAidG8iLAogICAgICAidHJhbnNwb3J0IiwKICAgICAgInR5cGUiLAogICAgICAidW5hZmZlY3RlZCIsCiAgICAgICJ1bml0cyIsCiAgICAgICJ1bnRpbCIsCiAgICAgICJ1c2UiLAogICAgICAidmFyaWFibGUiLAogICAgICAid2FpdCIsCiAgICAgICJ3aGVuIiwKICAgICAgIndoaWxlIiwKICAgICAgIndpdGgiLAogICAgICAieG5vciIsCiAgICAgICJ4b3IiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJWYWxhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2YWxhIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlZhcm5pc2ggQ29uZmlndXJhdGlvbiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInZjbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIsCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiVmVyaWxvZyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidmciLAogICAgICAidmgiLAogICAgICAidiIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJtb2R1bGUiLAogICAgICAiZW5kbW9kdWxlIiwKICAgICAgInRpbWVzY2FsZSIsCiAgICAgICJpbnB1dCIsCiAgICAgICJvdXRwdXQiLAogICAgICAicmVnIiwKICAgICAgIndpcmUiLAogICAgICAicG9zZWRnZSIsCiAgICAgICJuZWdlZGdlIiwKICAgICAgImFsd2F5cyIsCiAgICAgICJiZWdpbiIsCiAgICAgICJzd2l0Y2giLAogICAgICAiY2FzZSIsCiAgICAgICJlbmQiLAogICAgICAiZW5kY2FzZSIsCiAgICAgICJlbHNlIiwKICAgICAgImxvY2FscGFyYW0iLAogICAgICAiaW5pdGlhbCIsCiAgICAgICJzaWduZWQiLAogICAgICAiYXNzaWduIiwKICAgICAgImdlbmVyYXRlIiwKICAgICAgImdlbnZhciIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJWZXJpbG9nIEFyZ3MgRmlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImlydW5hcmdzIiwKICAgICAgInhydW5hcmdzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJWZXJ0ZXggU2hhZGVyIEZpbGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInZzaCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJWaW0gU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2aW0iLAogICAgICAidmltcmMiLAogICAgICAiZ3ZpbXJjIgogICAgXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICJfdmltcmMiLAogICAgICAiLnZpbXJjIiwKICAgICAgIl9ndmltcmMiLAogICAgICAiLmd2aW1yYyIsCiAgICAgICJ2aW1yYyIsCiAgICAgICJndmltcmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIlwiIiwKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIlZpc3VhbCBCYXNpYyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAiZWxzZWlmICIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2YiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJWaXN1YWwgQmFzaWMgZm9yIEFwcGxpY2F0aW9ucyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAiZWxzZWlmICIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjbHMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiciCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiVnVlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2dWUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIjogewogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ3c2RsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiV29sZnJhbSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibmIiLAogICAgICAid2wiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJXcmVuIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ3cmVuIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiWEFNTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieGFtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlhjb2RlIENvbmZpZyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInhjY29uZmlnIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiWE1MIjogewogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ4bWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPCEtLSIsCiAgICAgICAgIi0tPiIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJYTUwgU2NoZW1hIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieHNkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJYdGVuZCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieHRlbmQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiWWFybiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiPDxpZiAiLAogICAgICAiPDxlbHNlaWYgIiwKICAgICAgIjw8ZWxzZSAiLAogICAgICAiIGVxICIsCiAgICAgICIgPT0gIiwKICAgICAgIiBuZXEgIiwKICAgICAgIiAhICIsCiAgICAgICIgZ3QgIiwKICAgICAgIiA+ICIsCiAgICAgICIgbHQgIiwKICAgICAgIiA8ICIsCiAgICAgICIgbHRlICIsCiAgICAgICIgPD0gIiwKICAgICAgIiBndGUgIiwKICAgICAgIiA+PSAiLAogICAgICAiIHhvciAiLAogICAgICAiIF4gIiwKICAgICAgIiBhbmQgIiwKICAgICAgIiAmJiAiLAogICAgICAiIHx8ICIsCiAgICAgICIgb3IgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieWFybiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJZQU1MIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieWFtbCIsCiAgICAgICJ5bWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkNsb3VkRm9ybWF0aW9uIChZQU1MKSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiIUdldEF0dCIsCiAgICAgICIhU3ViIiwKICAgICAgIiFTZWxlY3QiLAogICAgICAiIUVxdWFscyIsCiAgICAgICIhSWYiLAogICAgICAiRGVwZW5kc09uOiIsCiAgICAgICIhU2VsZWN0IiwKICAgICAgIiFFcXVhbHMiLAogICAgICAiIUlmIiwKICAgICAgIkZuOjpJZiIsCiAgICAgICJGbjo6QW5kIiwKICAgICAgIkZuOjpFcXVhbHMiLAogICAgICAiRm46Ok5vdCIsCiAgICAgICJGbjo6T3IiLAogICAgICAiRm46OkJhc2U2NCIsCiAgICAgICJGbjo6Q2lkciIsCiAgICAgICJGbjo6RmluZEluTWFwIiwKICAgICAgIkZuOjpHZXRBdHQiLAogICAgICAiRm46OkdldEFacyIsCiAgICAgICJGbjo6SW1wb3J0VmFsdWUiLAogICAgICAiRm46OkpvaW4iLAogICAgICAiRm46OlNlbGVjdCIsCiAgICAgICJGbjo6U3BsaXQiLAogICAgICAiRm46OlN1YiIsCiAgICAgICJGbjo6VHJhbnNmb3JtIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieWFtbCIsCiAgICAgICJ5bWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXSwKICAgICJrZXl3b3JkcyI6IFsKICAgICAgIlJlc291cmNlczoiLAogICAgICAiQVdTVGVtcGxhdGVGb3JtYXRWZXJzaW9uOiIsCiAgICAgICJEZXNjcmlwdGlvbjoiLAogICAgICAiQVdTOjoiLAogICAgICAiUHJvcGVydGllczoiLAogICAgICAiTmFtZToiLAogICAgICAiVHlwZToiLAogICAgICAiIUdldEF0dCIsCiAgICAgICIhU3ViIiwKICAgICAgIlN0YXRlbWVudDoiLAogICAgICAiUmVmOiIsCiAgICAgICJEZXBlbmRzT246IiwKICAgICAgIiFTZWxlY3QiLAogICAgICAiIUVxdWFscyIsCiAgICAgICIhSWYiLAogICAgICAiRm46OklmIiwKICAgICAgIkZuOjpBbmQiLAogICAgICAiRm46OkVxdWFscyIsCiAgICAgICJGbjo6Tm90IiwKICAgICAgIkZuOjpPciIsCiAgICAgICJGbjo6QmFzZTY0IiwKICAgICAgIkZuOjpDaWRyIiwKICAgICAgIkZuOjpGaW5kSW5NYXAiLAogICAgICAiRm46OkdldEF0dCIsCiAgICAgICJGbjo6R2V0QVpzIiwKICAgICAgIkZuOjpJbXBvcnRWYWx1ZSIsCiAgICAgICJGbjo6Sm9pbiIsCiAgICAgICJGbjo6U2VsZWN0IiwKICAgICAgIkZuOjpTcGxpdCIsCiAgICAgICJGbjo6U3ViIiwKICAgICAgIkZuOjpUcmFuc2Zvcm0iCiAgICBdCiAgfSwKICAiQ2xvdWRGb3JtYXRpb24gKEpTT04pIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICIhR2V0QXR0IiwKICAgICAgIiFTdWIiLAogICAgICAiIVNlbGVjdCIsCiAgICAgICIhRXF1YWxzIiwKICAgICAgIiFJZiIsCiAgICAgICJEZXBlbmRzT246IiwKICAgICAgIiFTZWxlY3QiLAogICAgICAiIUVxdWFscyIsCiAgICAgICIhSWYiLAogICAgICAiRm46OklmIiwKICAgICAgIkZuOjpBbmQiLAogICAgICAiRm46OkVxdWFscyIsCiAgICAgICJGbjo6Tm90IiwKICAgICAgIkZuOjpPciIsCiAgICAgICJGbjo6QmFzZTY0IiwKICAgICAgIkZuOjpDaWRyIiwKICAgICAgIkZuOjpGaW5kSW5NYXAiLAogICAgICAiRm46OkdldEF0dCIsCiAgICAgICJGbjo6R2V0QVpzIiwKICAgICAgIkZuOjpJbXBvcnRWYWx1ZSIsCiAgICAgICJGbjo6Sm9pbiIsCiAgICAgICJGbjo6U2VsZWN0IiwKICAgICAgIkZuOjpTcGxpdCIsCiAgICAgICJGbjo6U3ViIiwKICAgICAgIkZuOjpUcmFuc2Zvcm0iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc29uIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJcIkFXU1RlbXBsYXRlRm9ybWF0VmVyc2lvblwiIiwKICAgICAgIkFXUzo6IiwKICAgICAgIiFHZXRBdHQiLAogICAgICAiIVN1YiIsCiAgICAgICJcIkRlcGVuZHNPblwiIiwKICAgICAgIiFTZWxlY3QiLAogICAgICAiIUVxdWFscyIsCiAgICAgICIhSWYiLAogICAgICAiRm46OklmIiwKICAgICAgIkZuOjpBbmQiLAogICAgICAiRm46OkVxdWFscyIsCiAgICAgICJGbjo6Tm90IiwKICAgICAgIkZuOjpPciIsCiAgICAgICJGbjo6QmFzZTY0IiwKICAgICAgIkZuOjpDaWRyIiwKICAgICAgIkZuOjpGaW5kSW5NYXAiLAogICAgICAiRm46OkdldEF0dCIsCiAgICAgICJGbjo6R2V0QVpzIiwKICAgICAgIkZuOjpJbXBvcnRWYWx1ZSIsCiAgICAgICJGbjo6Sm9pbiIsCiAgICAgICJGbjo6U2VsZWN0IiwKICAgICAgIkZuOjpTcGxpdCIsCiAgICAgICJGbjo6U3ViIiwKICAgICAgIkZuOjpUcmFuc2Zvcm0iCiAgICBdCiAgfSwKICAiWmlnIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJ3aGlsZSAiLAogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZSAiLAogICAgICAiZGVmZXIgIiwKICAgICAgInN3aXRjaCIsCiAgICAgICJ8fCIsCiAgICAgICImJiIsCiAgICAgICIhPSIsCiAgICAgICI9PSIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInppZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxuIiwKICAgICAgICAic3RhcnQiOiAiXFxcXCIKICAgICAgfQogICAgXQogIH0sCiAgIlpzaCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAienNoIiwKICAgICAgInpzaGVudiIsCiAgICAgICJ6bG9naW4iLAogICAgICAiemxvZ291dCIsCiAgICAgICJ6cHJvZmlsZSIsCiAgICAgICJ6c2hyYyIKICAgIF0sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAiLnpzaGVudiIsCiAgICAgICIuemxvZ2luIiwKICAgICAgIi56bG9nb3V0IiwKICAgICAgIi56cHJvZmlsZSIsCiAgICAgICIuenNocmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgInpzaCIKICAgIF0KICB9LAogICJnaXRpZ25vcmUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICIuZ2l0aWdub3JlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJpZ25vcmUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICIuaWdub3JlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJtNCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm00IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJudXNwZWMiOiB7CiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm51c3BlYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgInNlZCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAiYW5kICIsCiAgICAgICJvciAiLAogICAgICAibm90ICIsCiAgICAgICJpbiAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzZWQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgInNlZCIKICAgIF0KICB9LAogICJTaWV2ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYiLAogICAgICAiaWYgIiwKICAgICAgImVsc2lmIiwKICAgICAgImVsc2lmICIsCiAgICAgICJhbGxvZiIsCiAgICAgICJhbGxvZiAiLAogICAgICAiYW55b2YiLAogICAgICAiYW55b2YgIiwKICAgICAgImFsbG9mKCIsCiAgICAgICJhbnlvZigiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzaWV2ZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlJlYXNvbk1MIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJyZSIsCiAgICAgICJyZWkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiT2RpbiI6IHsKICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJ3aGVuICIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgImRlZmVyICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJvZGluIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0KfQo=` + languages = `ewogICJBQkFQIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhYmFwIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIqIiwKICAgICAgIlxcXCIiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFQTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiOkZvciAiLAogICAgICAiOklmICIsCiAgICAgICI6Q2FzZSAiLAogICAgICAiOkNhc2VMaXN0ICIsCiAgICAgICI6V2hpbGUgIiwKICAgICAgIjpSZXBlYXQgIiwKICAgICAgIjpFbHNlICIsCiAgICAgICLiiKgiLAogICAgICAi4oinIiwKICAgICAgIuKJoCIsCiAgICAgICJ+IiwKICAgICAgIsKoIiwKICAgICAgIj0iLAogICAgICAiOiIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFwbCIsCiAgICAgICJhcGxmIiwKICAgICAgImFwbG4iLAogICAgICAiYXBsYyIsCiAgICAgICJkeWFsb2ciCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIuKNnSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJBcHBsZVNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiY29uc2lkZXJpbmcgIiwKICAgICAgImlnbm9yaW5nICIsCiAgICAgICJyZXBlYXQgIiwKICAgICAgIndoaWxlICIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZSAiLAogICAgICAiZWxzZSBpZiAiLAogICAgICAidHJ5ICIsCiAgICAgICJvbiBlcnJvciAiLAogICAgICAiYW5kICIsCiAgICAgICJvciAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhcHBsZXNjcmlwdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIsCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFtdCiAgfSwKICAiQXJ0dXJvIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJsb29wICIsCiAgICAgICJtYXAgIiwKICAgICAgInNlbGVjdCAiLAogICAgICAiaWYgIiwKICAgICAgImlmPyAiLAogICAgICAid2hpbGUgIiwKICAgICAgImZ1bmN0aW9uICIsCiAgICAgICJvcj8gIiwKICAgICAgImFuZD8gIiwKICAgICAgIm5vdD8gIiwKICAgICAgIjw+ICIsCiAgICAgICI9ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFydCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQVNQIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhc2EiLAogICAgICAiYXNwIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICInIiwKICAgICAgIlJFTSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQVNQLk5FVCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYXNheCIsCiAgICAgICJhc2N4IiwKICAgICAgImFzbXgiLAogICAgICAiYXNweCIsCiAgICAgICJtYXN0ZXIiLAogICAgICAic2l0ZW1hcCIsCiAgICAgICJ3ZWJpbmZvIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiPCUtLSIsCiAgICAgICAgIi0tPiIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFUUyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICIgdGhlbiAiLAogICAgICAiIGVsc2UgIiwKICAgICAgImNhc2UrICIsCiAgICAgICJpZmNhc2UiLAogICAgICAibGV0ICIsCiAgICAgICJhbmQgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZGF0cyIsCiAgICAgICJzYXRzIiwKICAgICAgImF0cyIsCiAgICAgICJoYXRzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdLAogICAgICBbCiAgICAgICAgIigqIiwKICAgICAgICAiKikiCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiLy8vLyIsCiAgICAgICAgIlRISVNTSE9VTERORVZFUkFQUEVBUldFSE9QRSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJBV0siOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhd2siCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJhd2siLAogICAgICAiZ2F3ayIsCiAgICAgICJtYXdrIgogICAgXQogIH0sCiAgIkFjdGlvblNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYXMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQWRhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhZGEiLAogICAgICAiYWRiIiwKICAgICAgImFkcyIsCiAgICAgICJwYWQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJBZ2RhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJhZ2RhIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7LSIsCiAgICAgICAgIi19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQWxjaGVtaXN0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICIrIiwKICAgICAgIi0+IiwKICAgICAgIiEiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjcm4iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFsZXgiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ4IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJBbGxveSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaW1wbGllcyAiLAogICAgICAiZWxzZSAiLAogICAgICAiZm9yICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiLAogICAgICAiPD0gIiwKICAgICAgIj49ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFscyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iLAogICAgICAiLS0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFuZHJvaWQgSW50ZXJmYWNlIERlZmluaXRpb24gTGFuZ3VhZ2UiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFpZGwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qKiIsCiAgICAgICAgIiovIgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQXZybyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImF2ZGwiLAogICAgICAiYXZwciIsCiAgICAgICJhdnNjIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJBc2NpaURvYyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImFkb2MiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkFzc2VtYmx5IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzIiwKICAgICAgImFzbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQXV0b0hvdEtleSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYWhrIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI7IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJBdXRvY29uZiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaW4iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiLAogICAgICAiZG5sIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJiYWl0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImlmICIsCiAgICAgICJlbHNlICIsCiAgICAgICIgb3IgIiwKICAgICAgIiBhbmQgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJidCIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJhbmQiLAogICAgICAiYnJlYWsiLAogICAgICAiY29uc3QgIiwKICAgICAgImNvbnRpbnVlIiwKICAgICAgImVsc2UgIiwKICAgICAgImZ1biAiLAogICAgICAiaW1wb3J0ICIsCiAgICAgICJub3QgIiwKICAgICAgIm9yICIsCiAgICAgICJwYWNrYWdlICIsCiAgICAgICJyZXR1cm4iLAogICAgICAic3RydWN0ICIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImAiLAogICAgICAgICJzdGFydCI6ICJgIgogICAgICB9CiAgICBdCiAgfSwKICAiQkFTSCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYmFzaCIsCiAgICAgICJiYXNoX2xvZ2luIiwKICAgICAgImJhc2hfbG9nb3V0IiwKICAgICAgImJhc2hfcHJvZmlsZSIsCiAgICAgICJiYXNocmMiCiAgICBdLAogICAgImZpbGVuYW1lcyI6IFsKICAgICAgIi5iYXNoX2xvZ2luIiwKICAgICAgIi5iYXNoX2xvZ291dCIsCiAgICAgICIuYmFzaF9wcm9maWxlIiwKICAgICAgIi5iYXNocmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImJhc2giCiAgICBdCiAgfSwKICAiQmFzaWMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgImVsc2VpZiAiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYmFzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICInIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkJhdGNoIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJiYXQiLAogICAgICAiYnRtIiwKICAgICAgImNtZCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiUkVNIiwKICAgICAgIjo6IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJCYXplbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYnpsIiwKICAgICAgImJ1aWxkLmJhemVsIiwKICAgICAgImJ1aWxkIiwKICAgICAgIndvcmtzcGFjZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkJpY2VwIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJAbWluTGVuZ3RoKCIsCiAgICAgICJAbWF4TGVuZ3RoKCIsCiAgICAgICJAc2VjdXJlKCIsCiAgICAgICJbZm9yICIsCiAgICAgICJpZigiLAogICAgICAiaWYgKCIsCiAgICAgICIgPT0gIiwKICAgICAgIiAhPSAiLAogICAgICAiID8gIiwKICAgICAgInVzaW5nICIsCiAgICAgICJyYW5nZSgiLAogICAgICAidHlwZSAiLAogICAgICAiZnVuYyAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJiaWNlcCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQml0YmFrZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYmIiLAogICAgICAiYmJhcHBlbmQiLAogICAgICAiYmJjbGFzcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkJpdGJ1Y2tldCBQaXBlbGluZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImJpdGJ1Y2tldC1waXBlbGluZXMueW1sIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJCbGFkZSB0ZW1wbGF0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiQGZvciAiLAogICAgICAiQGZvcigiLAogICAgICAiQGZvcmVhY2ggIiwKICAgICAgIkBmb3JlYWNoKCIsCiAgICAgICJAZm9yZWxzZSAiLAogICAgICAiQGZvcmVsc2UoIiwKICAgICAgIkBlYWNoICIsCiAgICAgICJAZWFjaCAoIiwKICAgICAgIkB3aGlsZSAiLAogICAgICAiQHdoaWxlKCIsCiAgICAgICJAaWYgIiwKICAgICAgIkBpZigiLAogICAgICAiQHVubGVzcyAiLAogICAgICAiQHVubGVzcygiLAogICAgICAiQGlzc2V0ICIsCiAgICAgICJAaXNzZXQoIiwKICAgICAgIkBlbXB0eSAiLAogICAgICAiQGVtcHR5KCIsCiAgICAgICJAZWxzZSAiLAogICAgICAiQGVsc2VpZiAiLAogICAgICAiQGVsc2VpZigiLAogICAgICAiQHdoaWxlICIsCiAgICAgICJAd2hpbGUoIiwKICAgICAgIkBzd2l0Y2ggIiwKICAgICAgIkBzd2l0Y2ggKCIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJibGFkZS5waHAiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAie3stLSIsCiAgICAgICAgIi0tfX0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiPCEtLSIsCiAgICAgICAgIi0tPiIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkJvbyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAiZWxpZiAiLAogICAgICAidW5sZXNzICIsCiAgICAgICIgYW5kICIsCiAgICAgICJmb3IgIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJib28iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXCJcIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCJcIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQm9zcXVlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAibWF0Y2ggIiwKICAgICAgImNhc2UgIiwKICAgICAgInwgIiwKICAgICAgInx8ICIsCiAgICAgICImICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIiE9PSAiLAogICAgICAiPT0gIiwKICAgICAgIj09PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJic3EiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkJyYWluZnVjayI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiWyIsCiAgICAgICJdIiwKICAgICAgIjwiLAogICAgICAiPiIsCiAgICAgICIrIiwKICAgICAgIi0iLAogICAgICAiLiIsCiAgICAgICIsIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYmYiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkJ1aWxkU3RyZWFtIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiYnN0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJDIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjIiwKICAgICAgImVjIiwKICAgICAgInBnYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDIEhlYWRlciI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDIFNoZWxsIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjc2giCiAgICBdLAogICAgImZpbGVuYW1lcyI6IFsKICAgICAgIi5jc2hyYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdLAogICAgInNoZWJhbmdzIjogWwogICAgICAiY3NoIiwKICAgICAgInRjc2giCiAgICBdCiAgfSwKICAiQyMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNzIiwKICAgICAgImNzeCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAiaWdub3JlRXNjYXBlIjogdHJ1ZSwKICAgICAgICAic3RhcnQiOiAiQFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQysrIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjYyIsCiAgICAgICJjcHAiLAogICAgICAiY3h4IiwKICAgICAgImMrKyIsCiAgICAgICJwY2MiLAogICAgICAiaW5vIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkMrKyBIZWFkZXIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImhoIiwKICAgICAgImhwcCIsCiAgICAgICJoeHgiLAogICAgICAiaW5sIiwKICAgICAgImlwcCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDdWRhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjdSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDTWFrZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY21ha2UiLAogICAgICAiY21ha2VsaXN0cy50eHQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ09CT0wiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNvYiIsCiAgICAgICJjYmwiLAogICAgICAiY2NwIiwKICAgICAgImNvYm9sIiwKICAgICAgImNweSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiKiIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQ29kZVFMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJhbmQgIiwKICAgICAgIm9yICIsCiAgICAgICJpbXBsaWVzICIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZSAiLAogICAgICAibm90ICIsCiAgICAgICJpbnN0YW5jZW9mICIsCiAgICAgICJpbiAiLAogICAgICAiZXhpc3RzKCIsCiAgICAgICJmb3JhbGwoICIsCiAgICAgICJhdmcoIiwKICAgICAgImNvbmNhdCgiLAogICAgICAiY291bnQoIiwKICAgICAgIm1heCgiLAogICAgICAibWluKCIsCiAgICAgICJyYW5rKCIsCiAgICAgICJzdHJpY3Rjb25jYXQoIiwKICAgICAgInN0cmljdGNvdW50KCIsCiAgICAgICJzdHJpY3RzdW0oIiwKICAgICAgInN1bSgiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJxbCIsCiAgICAgICJxbGwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ1NTIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjc3MiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ1NWIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY3N2IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJDYWJhbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY2FiYWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInstIiwKICAgICAgICAiLX0iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJDYWlybyI6IHsKICAgICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICAgImxvb3AgIiwKICAgICAgICAiaWYgIiwKICAgICAgICAiaWYoIiwKICAgICAgICAibWF0Y2ggIiwKICAgICAgICAibWF0Y2goIiwKICAgICAgICAiZWxzZSAiLAogICAgICAgICJ8fCAiLAogICAgICAgICImJiAiLAogICAgICAgICIhPSAiLAogICAgICAgICI9PSAiCiAgICAgIF0sCiAgICAgICJleHRlbnNpb25zIjogWwogICAgICAgICJjYWlybyIKICAgICAgXSwKICAgICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgICAiLy8iCiAgICAgIF0sCiAgICAgICJtdWx0aV9saW5lIjogW10sCiAgICAgICJxdW90ZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAgICJzdGFydCI6ICInIgogICAgICAgIH0KICAgICAgXQogIH0sCiAgIkNhc3NpdXMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNhc3NpdXMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ2V5bG9uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjZXlsb24iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ2xvanVyZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiKGZvciAiLAogICAgICAiKHdoZW4gIiwKICAgICAgIihsb29wICIsCiAgICAgICIoZG9zZXEgIiwKICAgICAgIihjb25kICIsCiAgICAgICIoaWYiLAogICAgICAiKGlmLW5vdCAiLAogICAgICAiKGFuZCAiLAogICAgICAiKG9yICIsCiAgICAgICIobm90ICIsCiAgICAgICIoPSAiLAogICAgICAiKG5vdD0gIiwKICAgICAgIihyZWN1ciAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjbGoiLAogICAgICAiY2xqYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQ2xvanVyZVNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY2xqcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiQ2xvc3VyZSBUZW1wbGF0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgIj49ICIsCiAgICAgICI8PSAiLAogICAgICAiPzogIiwKICAgICAgIj8gOiAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzb3kiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qKiIsCiAgICAgICAgIiovIgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiQ29mZmVlU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjb2ZmZWUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiIyMjIiwKICAgICAgICAiIyMjIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQ29nZW50IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjb2dlbnQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJDb2xkRnVzaW9uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjZm0iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPCEtLS0iLAogICAgICAgICItLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiQ29sZEZ1c2lvbiBDRlNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiY2ZjIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkNvcSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidiIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJSZXF1aXJlIiwKICAgICAgIkh5cG90aGVzaXMiLAogICAgICAiSW5kdWN0aXZlIiwKICAgICAgIlJlbWFyayIsCiAgICAgICJMZW1tYSIsCiAgICAgICJQcm9vZiIsCiAgICAgICJEZWZpbml0aW9uIiwKICAgICAgIlRoZW9yZW0iLAogICAgICAiQ2xhc3MiLAogICAgICAiSW5zdGFuY2UiLAogICAgICAiTW9kdWxlIiwKICAgICAgIkNvbnRleHQiLAogICAgICAiU2VjdGlvbiIsCiAgICAgICJOb3RhdGlvbiIsCiAgICAgICJFbmQiLAogICAgICAiRml4cG9pbnQiLAogICAgICAiRnJvbSBDb3EiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJDcmVvbGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjcmVvbGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkNyeXN0YWwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJDeXRob24iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgImFuZCAiLAogICAgICAib3IgIiwKICAgICAgIm5vdCAiLAogICAgICAiaW4gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHl4IiwKICAgICAgInB4aSIsCiAgICAgICJweGQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIlxcXCJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIlxcXCJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICInJyciCiAgICAgIH0KICAgIF0KICB9LAogICJEIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8rIiwKICAgICAgICAiKy8iCiAgICAgIF0KICAgIF0sCiAgICAibmVzdGVkbXVsdGlsaW5lIjogdHJ1ZSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAicmRtZCIKICAgIF0KICB9LAogICJEYXJ0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkYXJ0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkRldmljZSBUcmVlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkdHMiLAogICAgICAiZHRzaSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJEaGFsbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImRoYWxsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7LSIsCiAgICAgICAgIi19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkRNIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgInN3aXRjaCgiLAogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCIsCiAgICAgICImJiIsCiAgICAgICIhPSIsCiAgICAgICI8PiIsCiAgICAgICI9PSIsCiAgICAgICJpbiAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJEb2NrZXIgaWdub3JlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogW10sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAiLmRvY2tlcmlnbm9yZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIsCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiRG9ja2VyZmlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZG9ja2VyZmlsZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAiZG9ja2VyZmlsZSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZHRkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJFbGl4aXIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImV4IiwKICAgICAgImV4cyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIlxcXCJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIlxcXCJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJycnIiwKICAgICAgICAic3RhcnQiOiAiJycnIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkVsbSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAiY2FzZSAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImVsbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLS0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiey0iLAogICAgICAgICItfSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJFbWFjcyBEZXYgRW52IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJlZGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkVtYWNzIExpc3AiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImVsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI7IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJFcmxhbmciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImVybCIsCiAgICAgICJocmwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiUiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImVzY3JpcHQiCiAgICBdCiAgfSwKICAiRXhwZWN0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJleHAiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkV4dGVuc2libGUgU3R5bGVzaGVldCBMYW5ndWFnZSBUcmFuc2Zvcm1hdGlvbnMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ4c2x0IiwKICAgICAgInhzbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiRiMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgIm1hdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZnMiLAogICAgICAiZnNpIiwKICAgICAgImZzeCIsCiAgICAgICJmc3NjcmlwdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkZhY3RvciIgOnsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYiLAogICAgICAid2hlbiIsCiAgICAgICJ1bmxlc3MiLAogICAgICAiaWYqIiwKICAgICAgIndoZW4qIiwKICAgICAgInVubGVzcyoiLAogICAgICAiP2lmIiwKICAgICAgIj8iLAogICAgICAiY29uZCIsCiAgICAgICJjYXNlIiwKCiAgICAgICJjb25kPnF1b3QiLAogICAgICAiY2FzZT5xdW90IiwKICAgICAgImFsaXN0PnF1b3QiLAoKICAgICAgIndoaWxlIiwKICAgICAgInVudGlsIiwKICAgICAgImxvb3AiLAoKICAgICAgIjAmJiIsCiAgICAgICIxJiYiLAogICAgICAiMiYmIiwKICAgICAgIjMmJiIsCiAgICAgICJuJiYiLAogICAgICAiJiYiLAoKICAgICAgIjB8fCIsCiAgICAgICIxfHwiLAogICAgICAiMnx8IiwKICAgICAgIjN8fCIsCiAgICAgICJufHwiLAogICAgICAifHwiLAoKICAgICAgImFuZCIsCiAgICAgICJvciIsCiAgICAgICJ4b3IiLAoKICAgICAgImVxIiwKICAgICAgIj0iLAoKICAgICAgInNtYXJ0LWlmIiwKICAgICAgInNtYXJ0LWlmKiIsCiAgICAgICJzbWFydC13aGVuIiwKICAgICAgInNtYXJ0LXdoZW4qIiwKICAgICAgInNtYXJ0LXVubGVzcyIsCiAgICAgICJzbWFydC11bmxlc3MqIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZmFjdG9yIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIiFbWyIsCiAgICAgICAgIl1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiFbPVsiLAogICAgICAgICJdPV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiIVs9PVsiLAogICAgICAgICJdPT1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiFbPT09WyIsCiAgICAgICAgIl09PT1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiFbPT09PVsiLAogICAgICAgICJdPT09PV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiIVs9PT09PVsiLAogICAgICAgICJdPT09PT1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiFbPT09PT09WyIsCiAgICAgICAgIl09PT09PT1dIgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiKCgiLAogICAgICAgICIpKSIKICAgICAgXQogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIhIgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiXCIiLAogICAgICAgICJlbmQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiU1RSSU5HOiIsCiAgICAgICAgImVuZCI6ICI7IgogICAgICB9LAogICAgICB7CiAgICAgICAgInN0YXJ0IjogIls9PT09PT1bIiwKICAgICAgICAiZW5kIjogIl09PT09PT1dIgogICAgICB9LAogICAgICB7CiAgICAgICAgInN0YXJ0IjogIls9PT09PVsiLAogICAgICAgICJlbmQiOiAiXT09PT1dIgogICAgICB9LAogICAgICB7CiAgICAgICAgInN0YXJ0IjogIls9PT09WyIsCiAgICAgICAgImVuZCI6ICJdPT09PV0iCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiWz09PVsiLAogICAgICAgICJlbmQiOiAiXT09PV0iCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiWz09WyIsCiAgICAgICAgImVuZCI6ICJdPT1dIgogICAgICB9LAogICAgICB7CiAgICAgICAgInN0YXJ0IjogIls9WyIsCiAgICAgICAgImVuZCI6ICJdPV0iCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiW1siLAogICAgICAgICJlbmQiOiAiXV0iCiAgICAgIH0KICAgIF0KICB9LAogICJGZW5uZWwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgIihmb3IiLAogICAgICAiKGVhY2giLAogICAgICAiKGlmIiwKICAgICAgIih3aGVuIiwKICAgICAgIih3aGlsZSIsCiAgICAgICIoc3dpdGNoIiwKICAgICAgIihkbyIsCiAgICAgICIoLi4iLAogICAgICAiKD0iLAogICAgICAiKGFuZCIsCiAgICAgICIob3IiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJmbmwiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI7IgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiXCIiLAogICAgICAgICJlbmQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAic3RhcnQiOiAiLCIsCiAgICAgICAgImVuZCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiRioiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZzdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkZJREwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZpZGwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiRk9SVFJBTiBMZWdhY3kiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImYiLAogICAgICAiZm9yIiwKICAgICAgImZ0biIsCiAgICAgICJmNzciLAogICAgICAicGZvIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICJjIiwKICAgICAgIkMiLAogICAgICAiISIsCiAgICAgICIqIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJGT1JUUkFOIE1vZGVybiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZjAzIiwKICAgICAgImYwOCIsCiAgICAgICJmOTAiLAogICAgICAiZjk1IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIhIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkZpc2giOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZpc2giCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImZpc2giCiAgICBdCiAgfSwKICAiRmxvdzkiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAiZWxzZSAiLAogICAgICAiZWxzZXsiLAogICAgICAiZm9yaSAiLAogICAgICAiZm9yaSgiLAogICAgICAic3dpdGNoICIsCiAgICAgICJzd2l0Y2goIiwKICAgICAgImZvbGQgIiwKICAgICAgImZvbGQoIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIsCiAgICAgICJ8PiAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJmbG93IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkZvcnRoIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICI0dGgiLAogICAgICAiZm9ydGgiLAogICAgICAiZnIiLAogICAgICAiZnJ0IiwKICAgICAgImZ0aCIsCiAgICAgICJmODMiLAogICAgICAiZmIiLAogICAgICAiZnBtIiwKICAgICAgImU0IiwKICAgICAgInJ4IiwKICAgICAgImZ0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICJcXFxcIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIiggIiwKICAgICAgICAiKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkZyYWdtZW50IFNoYWRlciBGaWxlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJmc2giCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiRnJlZW1hcmtlciBUZW1wbGF0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiPCNsaXN0ICIsCiAgICAgICI8I2Fzc2lnbiAiLAogICAgICAiPCNpZiAiLAogICAgICAiPCNlbHNlaWYgIiwKICAgICAgIjwjZWxzZT4iLAogICAgICAiPCNlbHNlPiAiLAogICAgICAiPCNzd2l0Y2ggICIsCiAgICAgICI8I2Nhc2UgIiwKICAgICAgIjwjZGVmYXVsdD4iLAogICAgICAiPCNkZWZhdWx0PiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZ0bCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8Iy0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiRlNMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICItPiIsCiAgICAgICI8LSIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImZzbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkZ1dGhhcmsiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImlmICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ0aGVuICIsCiAgICAgICJmb3IgIiwKICAgICAgImxvb3AgIiwKICAgICAgIndoaWxlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI+PSAiLAogICAgICAiPD0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZnV0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiRlhNTCI6IHsKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZnhtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIklOSSI6IHsKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaW5pIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIiwKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkdEU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJnZCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiXFxcIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiXFxcIlxcXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJHTFNMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2ZXJ0IiwKICAgICAgInRlc2MiLAogICAgICAidGVzZSIsCiAgICAgICJnZW9tIiwKICAgICAgImZyYWciLAogICAgICAiY29tcCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJHTiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYoIiwKICAgICAgImlmICgiLAogICAgICAiZWxzZSBpZigiLAogICAgICAiZWxzZSBpZiAoIiwKICAgICAgImVsc2UoIiwKICAgICAgImVsc2UgKCIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJnbiIsCiAgICAgICJnbmkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJHYW1lIE1ha2VyIExhbmd1YWdlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJyZXBlYXQgIiwKICAgICAgInJlcGVhdCgiLAogICAgICAifHwgIiwKICAgICAgIm9yICIsCiAgICAgICImJiAiLAogICAgICAiYW5kICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZ21sIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIsCiAgICAgICIvLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJHYW1lIE1ha2VyIFByb2plY3QiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ5eXAiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkdlbWZpbGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICJnZW1maWxlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJHaGVya2luIFNwZWNpZmljYXRpb24iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImdpdmVuIiwKICAgICAgIndoZW4iLAogICAgICAidGhlbiIsCiAgICAgICJhbmQiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJmZWF0dXJlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJHbyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZ28gIiwKICAgICAgImRlZmVyICIsCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJnbyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImAiLAogICAgICAgICJpZ25vcmVFc2NhcGUiOiB0cnVlLAogICAgICAgICJzdGFydCI6ICJgIgogICAgICB9CiAgICBdCiAgfSwKICAiR28gVGVtcGxhdGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgInt7aWYgIiwKICAgICAgInt7IGlmICIsCiAgICAgICJ7e2Vsc2UiLAogICAgICAie3sgZWxzZSIsCiAgICAgICJ7e3JhbmdlICIsCiAgICAgICJ7eyByYW5nZSAiLAogICAgICAie3t3aXRoIiwKICAgICAgInt7IHdpdGgiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0bXBsIiwKICAgICAgImdvaHRtbCIsCiAgICAgICJnb3R4dCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7ey8qIiwKICAgICAgICAiKi99fSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkdyYWRsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImdyYWRsZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiR3JhcGhRTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAidHlwZSAiLAogICAgICAiaW5wdXQgIiwKICAgICAgInF1ZXJ5ICIsCiAgICAgICJtdXRhdGlvbiAiLAogICAgICAic3Vic2NyaXB0aW9uICIsCiAgICAgICJkaXJlY3RpdmUgIiwKICAgICAgInNjYWxhciAiLAogICAgICAiZW51bSAiLAogICAgICAiaW50ZXJmYWNlICIsCiAgICAgICJ1bmlvbiAiLAogICAgICAiZnJhZ21lbnQgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZ3JhcGhxbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJcIlwiXCIiLAogICAgICAgICJcIlwiXCIiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICJcIlwiXCIiLAogICAgICAgICJzdGFydCI6ICJcIlwiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJET1QiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkb3QiLAogICAgICAiZ3YiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIiwKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkdyb292eSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZ3Jvb3Z5IiwKICAgICAgImdydCIsCiAgICAgICJndHBsIiwKICAgICAgImd2eSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJIRVgiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJoZXgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkhUTUwiOiB7CiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImh0bWwiLAogICAgICAiaHRtIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSEFNTCI6IHsKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaGFtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLSMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkhhbWxldCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaGFtbGV0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSGFuZGxlYmFycyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaGJzIiwKICAgICAgImhhbmRsZWJhcnMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPCEtLSIsCiAgICAgICAgIi0tPiIKICAgICAgXSwKICAgICAgWwogICAgICAgICJ7eyEiLAogICAgICAgICJ9fSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkhhcHB5IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieSIsCiAgICAgICJseSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiSGFyZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZSAiLAogICAgICAibWF0Y2ggIiwKICAgICAgInN3aXRjaCAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaGEiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKCSJlbmQiOiAiYCIsCiAgICAgICAgInN0YXJ0IjogImAiCiAgICAgIH0KICAgIF0KICB9LAogICJIYXNrZWxsIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJpZiAiLAogICAgICAidGhlbiAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIvPSAiLAogICAgICAiPT0gIiwKICAgICAgImNhc2UgIiwKICAgICAgImRvIHsiLAogICAgICAiZm9yYWxsICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImhzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7LSIsCiAgICAgICAgIi19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiSGF4ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaHgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiaG9vbiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiJSsgIHR1cm4iLAogICAgICAiKHR1cm4gIiwKICAgICAgIiUrICByb2xsIiwKICAgICAgIihyb2xsICIsCiAgICAgICIlKyAgcmVlbCIsCiAgICAgICIocmVlbCAiLAogICAgICAifC4gICIsCiAgICAgICJ8LigiLAogICAgICAifC0gICIsCiAgICAgICJ8LSgiLAogICAgICAifD8gICIsCiAgICAgICJ8PygiLAogICAgICAiP3wgICIsCiAgICAgICI/fCgiLAogICAgICAifCgiLAogICAgICAiPy0gICIsCiAgICAgICI/LSgiLAogICAgICAiPzogICIsCiAgICAgICI/OigiLAogICAgICAiPy4gICIsCiAgICAgICI/LigiLAogICAgICAiP14gICIsCiAgICAgICI/XigiLAogICAgICAiPzwgICIsCiAgICAgICI/PCgiLAogICAgICAiPz4gICIsCiAgICAgICI/PigiLAogICAgICAiPysgICIsCiAgICAgICI/KygiLAogICAgICAiPyYgICIsCiAgICAgICI/JigiLAogICAgICAiJigiLAogICAgICAiP0AgICIsCiAgICAgICI/QCgiLAogICAgICAiP34gICIsCiAgICAgICI/figiLAogICAgICAiPz0gICIsCiAgICAgICI/PSgiLAogICAgICAiLj0gICIsCiAgICAgICI9KCIsCiAgICAgICIhPSgiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJob29uIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI6OiIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImBgYCIsCiAgICAgICAgInN0YXJ0IjogImBgYCIKICAgICAgfQogICAgXQogIH0sCiAgIklETCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiaWRsIiwKICAgICAgIndlYmlkbCIsCiAgICAgICJ3aWRsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIklkcmlzIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJpZHIiLAogICAgICAibGlkciIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLS0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiey0iLAogICAgICAgICItfSIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCJcXFwiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCJcXFwiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkludGVsIEhFWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImloZXgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIklzYWJlbGxlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0aHkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInsqIiwKICAgICAgICAiKn0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXSwKICAgICAgWwogICAgICAgICLigLkiLAogICAgICAgICLigLoiCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiXFxcXDxvcGVuPiIsCiAgICAgICAgIlxcXFw8Y2xvc2U+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyciLAogICAgICAgICJzdGFydCI6ICInJyIKICAgICAgfQogICAgXQogIH0sCiAgIkpBSSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamFpIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSlNPTiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImpzb24iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkpTT05DIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAianNvbmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSlNPTkwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc29ubCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiSnNvbm5ldCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yIiwKICAgICAgImlmIiwKICAgICAgImVsc2UiLAogICAgICAifHwiLAogICAgICAiJiYiLAogICAgICAiIT0iLAogICAgICAiPT0iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc29ubmV0IiwKICAgICAgImxpYnNvbm5ldCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIsCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogInx8fCIsCiAgICAgICAgInN0YXJ0IjogInx8fCIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJAXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICJAJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImpzb25uZXQiCiAgICBdCiAgfSwKICAiSlNYIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc3giCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSmFkZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYgIiwKICAgICAgImVsc2UgaWYgIiwKICAgICAgInVubGVzcyAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqYWRlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLy0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkphbmV0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICIoaWYgIiwKICAgICAgIihmb3IgIiwKICAgICAgIihmb3IgIiwKICAgICAgIihjb25kICIsCiAgICAgICIoc3dpdGNoICIsCiAgICAgICIod2hlbiAiLAogICAgICAiKHdoaWxlICIsCiAgICAgICIobG9vcCAiLAogICAgICAiKGNhc2UgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamFuZXQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiBmYWxzZSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImBgIiwKICAgICAgICAic3RhcnQiOiAiYGAiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiQFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSmF2YSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamF2YSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJKYXZhU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqcyIsCiAgICAgICJtanMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAibm9kZSIKICAgIF0KICB9LAogICJKYXZhU2VydmVyIFBhZ2VzIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc3AiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIkplbmtpbnMgQnVpbGRmaWxlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamVua2luc2ZpbGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkppbmphIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJ7JSBmb3IgIiwKICAgICAgInslLSBmb3IgIiwKICAgICAgInslIGlmICIsCiAgICAgICJ7JS0gaWYgIiwKICAgICAgInslIGVsc2UgIiwKICAgICAgInslLSBlbHNlICIsCiAgICAgICJ7JSBlbGlmICIsCiAgICAgICJ7JSBtYWNybyAiLAogICAgICAieyUtIG1hY3JvICIsCiAgICAgICJ7JSBjYWxsICIsCiAgICAgICJ7JS0gY2FsbCAiLAogICAgICAieyUgZmlsdGVyICIsCiAgICAgICJ7JS0gZmlsdGVyICIsCiAgICAgICJ7JSBzZXQgIiwKICAgICAgInslIGluY2x1ZGUgIiwKICAgICAgInslIGZyb20gIiwKICAgICAgInslIGV4dGVuZHMgIiwKICAgICAgInslIHdpdGggIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamluamEiLAogICAgICAiajIiLAogICAgICAiamluamEyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInsjIiwKICAgICAgICAiI30iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJKdWxpYSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgImVsc2VpZiAiLAogICAgICAiZWxzZWlmKCIsCiAgICAgICJ0cnkgIiwKICAgICAgImNhdGNoICIsCiAgICAgICJmaW5hbGx5ICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiamwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiIz0iLAogICAgICAgICI9IyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCJcXFwiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCJcXFwiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkp1bGl1cyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAianVsaXVzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkp1cHl0ZXIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJpcHluYiIsCiAgICAgICJqcHluYiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiSnVzdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAianVzdGZpbGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiSyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiJyIsCiAgICAgICIvIiwKICAgICAgIlxcIiwKICAgICAgIic6IiwKICAgICAgIi86IiwKICAgICAgIlxcOiIsCiAgICAgICJ8IiwKICAgICAgIiYiLAogICAgICAiISIsCiAgICAgICI9IgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiayIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLyIKICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiS29ybiBTaGVsbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAia3NoIgogICAgXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICIua3NocmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgImtzaCIKICAgIF0KICB9LAogICJLb3RsaW4iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImt0IiwKICAgICAgImt0cyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkxEIFNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibGRzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkxFU1MiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJsZXNzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkxFWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkxPTENPREUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgIkFXU1VNIFRIWCAiLAogICAgICAiTyBOT0VTICIsCiAgICAgICJQTFogT1BFTiBGSUxFICIsCiAgICAgICJJTSBJTiBZUiAiLAogICAgICAiTyBSTFk/IiwKICAgICAgIk8gUkxZPyAiLAogICAgICAiV1RGPyIsCiAgICAgICJXVEY/ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImxvbCIsCiAgICAgICJsb2xzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICJCVFciCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiT0JUVyIsCiAgICAgICAgIlRMRFIiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiTGFUZVgiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0ZXgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiUiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkxlYW4iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImxlYW4iLAogICAgICAiaGxlYW4iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8tIiwKICAgICAgICAiLS8iCiAgICAgIF0KICAgIF0sCiAgICAibmVzdGVkbXVsdGlsaW5lIjogdHJ1ZSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkxpY2Vuc2UiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICJsaWNlbnNlIiwKICAgICAgImxpY2VuY2UiLAogICAgICAiY29weWluZyIsCiAgICAgICJjb3B5aW5nMyIsCiAgICAgICJ1bmxpY2Vuc2UiLAogICAgICAidW5saWNlbmNlIiwKICAgICAgImxpY2Vuc2UtbWl0IiwKICAgICAgImxpY2VuY2UtbWl0IiwKICAgICAgImNvcHlyaWdodCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiTGlzcCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibGlzcCIsCiAgICAgICJsc3AiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiI3wiLAogICAgICAgICJ8IyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFtdLAogICAgInNoZWJhbmdzIjogWwogICAgICAic2JjbCIKICAgIF0KICB9LAogICJMTFZNIElSIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJsbHZtLmxvb3AiLAogICAgICAiYnIgIiwKICAgICAgInN3aXRjaCAiLAogICAgICAiaW5kaXJlY3RiciAiLAogICAgICAiaW52b2tlICIsCiAgICAgICJjYWxsYnIgIiwKICAgICAgInJlc3VtZSAiLAogICAgICAiY2F0Y2hzd2l0Y2ggIiwKICAgICAgImNhdGNocmV0ICIsCiAgICAgICJjbGVhbnVwcmV0ICIsCiAgICAgICJzaGwgIiwKICAgICAgImxzaHIgIiwKICAgICAgImFzaHIgIiwKICAgICAgImFuZCAiLAogICAgICAib3IgIiwKICAgICAgInhvciAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJsbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFtdCiAgfSwKICAiTHVhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJ3aGlsZSAiLAogICAgICAid2hpbGUoIiwKICAgICAgImVsc2UgIiwKICAgICAgImVsc2UoIiwKICAgICAgImVsc2VpZiAiLAogICAgICAiZWxzZWlmKCIsCiAgICAgICJvciAiLAogICAgICAiYW5kICIsCiAgICAgICJ+PSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibHVhIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICItLVtbIiwKICAgICAgICAiXV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgIi0tWz1bIiwKICAgICAgIl09XSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPT1bIiwKICAgICAgIl09PV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgIi0tWz09PVsiLAogICAgICAiXT09PV0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgIi0tWz09PT1bIiwKICAgICAgIl09PT09XSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPT09PT1bIiwKICAgICAgIl09PT09PV0iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIltbIiwKICAgICAgICAic3RhcnQiOiAiXV0iCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJsdWEiCiAgICBdCiAgfSwKICAiTHVhdSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJlbHNlICIsCiAgICAgICJlbHNlKCIsCiAgICAgICJlbHNlaWYgIiwKICAgICAgImVsc2VpZigiLAogICAgICAib3IgIiwKICAgICAgImFuZCAiLAogICAgICAifj0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImx1YXUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi0tW1siLAogICAgICAgICJdXSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPVsiLAogICAgICAiXT1dIgogICAgICBdLAogICAgICBbCiAgICAgICItLVs9PVsiLAogICAgICAiXT09XSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPT09WyIsCiAgICAgICJdPT09XSIKICAgICAgXSwKICAgICAgWwogICAgICAiLS1bPT09PVsiLAogICAgICAiXT09PT1dIgogICAgICBdLAogICAgICBbCiAgICAgICItLVs9PT09PVsiLAogICAgICAiXT09PT09XSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiYCIsCiAgICAgICAgInN0YXJ0IjogImAiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIltbIiwKICAgICAgICAic3RhcnQiOiAiXV0iCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJsdWF1IgogICAgXQogIH0sCiAgIkx1Y2l1cyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibHVjaXVzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIkx1bmEiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJsdW5hIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJNUUwgSGVhZGVyIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJtcWgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiTVFMNCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibXE0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk1RTDUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm1xNSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJNU0J1aWxkIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJDb25kaXRpb24iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjc3Byb2oiLAogICAgICAidmJwcm9qIiwKICAgICAgImZzcHJvaiIsCiAgICAgICJ2Y3Byb2oiLAogICAgICAidmN4cHJvaiIsCiAgICAgICJ2Y3hwcm9qLmZpbHRlcnMiLAogICAgICAiaWxwcm9qIiwKICAgICAgIm15YXBwIiwKICAgICAgInByb3BzIiwKICAgICAgInJkbGMiLAogICAgICAicmVzeCIsCiAgICAgICJzZXR0aW5ncyIsCiAgICAgICJzbG4iLAogICAgICAidGFyZ2V0cyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk1VTVBTIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJtcHMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJNYWNyb21lZGlhIGVYdGVuc2libGUgTWFya3VwIExhbmd1YWdlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibXhtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiTWFkbGFuZyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibWFkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInsjIiwKICAgICAgICAiI30iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJNYWtlZmlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibWFrZWZpbGUiLAogICAgICAibWFrIiwKICAgICAgIm1rIiwKICAgICAgImJwIgogICAgXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICJtYWtlZmlsZSIsCiAgICAgICJnbnVtYWtlZmlsZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiTWFrbyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiJSBmb3IgIiwKICAgICAgIiUgaWYgIiwKICAgICAgIiUgZWxzZSAiLAogICAgICAiJSBlbGlmICIsCiAgICAgICI8JSBpbmNsdWRlICIsCiAgICAgICI8JWRlZiAiLAogICAgICAiPCVwYWdlICIsCiAgICAgICI8JWRlZiAiLAogICAgICAiPCVibG9jayAiLAogICAgICAiPCVuYW1lc3BhY2UgIiwKICAgICAgIjwlaW5oZXJpdCAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJtYWtvIiwKICAgICAgIm1hbyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPCVkb2M+IiwKICAgICAgICAiPC8lZG9jPiIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIk1hcmtkb3duIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibWQiLAogICAgICAibWFya2Rvd24iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIk1lc29uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3JlYWNoICIsCiAgICAgICJpZiAiLAogICAgICAiZWxpZiAiLAogICAgICAidW5sZXNzICIsCiAgICAgICJhbmQgIiwKICAgICAgIm9yICIsCiAgICAgICJlbHNlICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm1lc29uLmJ1aWxkIiwKICAgICAgIm1lc29uX29wdGlvbnMudHh0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICInJyciCiAgICAgIH0KICAgIF0KICB9LAogICJNQVRMQUIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImlmICIsCiAgICAgICJlbHNlaWYgIiwKICAgICAgImNhc2UgIiwKICAgICAgIm90aGVyd2lzZSAiLAogICAgICAidHJ5IiwKICAgICAgImZvciAiLAogICAgICAid2hpbGUgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibSIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJleWUoIiwKICAgICAgInplcm9zKCIsCiAgICAgICJvbmVzKCIsCiAgICAgICJ0cmFuc3Bvc2UoIiwKICAgICAgIm1lc2hncmlkKCIsCiAgICAgICJtb2QoIiwKICAgICAgImNsYXNzZGVmIiwKICAgICAgImZ1bmN0aW9uIiwKICAgICAgImRpc3AoIiwKICAgICAgInNpbigiLAogICAgICAidGFuKCIsCiAgICAgICJjb3MoIiwKICAgICAgInBsb3QiLAogICAgICAic3FydCgiLAogICAgICAiZGVibGFuaygiLAogICAgICAiZmluZHN0cigiLAogICAgICAic3RycmVwKCIsCiAgICAgICJzdHJjbXAoIiwKICAgICAgImRpc3BsYXkoIiwKICAgICAgInN0cmNhdCgiLAogICAgICAiaXNjZWxsc3RyKCIsCiAgICAgICJzdHJmaW5kKCIsCiAgICAgICIlIiwKICAgICAgImZwcmludGYoIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIlIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIiV7IiwKICAgICAgICAifSUiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIk1EWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm1keCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiTW9kdWxhMyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibTMiLAogICAgICAibWciLAogICAgICAiaWciLAogICAgICAiaTMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJNb2R1bGUtRGVmaW5pdGlvbiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZGVmIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICI7IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJNb25rZXkgQyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibWMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiTXVzdGFjaGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm11c3RhY2hlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInt7ISIsCiAgICAgICAgIn19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiTmlhbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiY2FzZSAiLAogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAicmVwZWF0ICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAib3IgIiwKICAgICAgImFuZCAiLAogICAgICAiPSAiLAogICAgICAiZXF1YWwgIiwKICAgICAgIn49ICIsCiAgICAgICJ1bmVxdWFsICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm5kZiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJOaW0iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm5pbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCJcXFwiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCJcXFwiXFxcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk5peCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibml4IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk9DYW1sIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJtbCIsCiAgICAgICJtbGkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJPYmplY3RpdmUgQyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibSIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICIjaW5jbHVkZSIsCiAgICAgICJwcmludGYiLAogICAgICAic3RkaW8uaCIsCiAgICAgICIuaCIsCiAgICAgICJAaW1wb3J0IiwKICAgICAgIkBpbnRlcmZhY2UiLAogICAgICAiQHByb3BlcnR5IiwKICAgICAgIkBpbXBsZW1lbnRhdGlvbiIsCiAgICAgICJOU0FycmF5IiwKICAgICAgIiNwcmFnbWEiLAogICAgICAic3RhdGljIiwKICAgICAgImNvbnN0IiwKICAgICAgImF0b21pYyIsCiAgICAgICJAZW5kIiwKICAgICAgIi8vIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk9iamVjdGl2ZSBDKysiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm1tIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIk9wYWxhbmciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm9wYSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJPcmciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm9yZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyAiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIk96IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJveiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlBIUCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicGhwIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIiwKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJwaHAiLAogICAgICAicGhwNSIKICAgIF0KICB9LAogICJQS0dCVUlMRCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBrZ2J1aWxkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJQa2wiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZ1bmN0aW9uICIsCiAgICAgICI/PyAiLAogICAgICAiPy4iLAogICAgICAiaWZOb25OdWxsKCIsCiAgICAgICJpZiAiLAogICAgICAiIGVsc2UgIiwKICAgICAgIi5tYXAiLAogICAgICAiZm9yICIsCiAgICAgICJ3aGVuICIsCiAgICAgICIuLi4iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwa2wiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICIjXCIiLAogICAgICAgICJzdGFydCI6ICJcIiMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiMjXCIiLAogICAgICAgICJzdGFydCI6ICJcIiMjIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcIlwiXCIiLAogICAgICAgICJpZ25vcmVFc2NhcGUiOiB0cnVlLAogICAgICAgICJzdGFydCI6ICJcIlwiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJQTC9TUUwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImFuZCAiLAogICAgICAiYW5kKCIsCiAgICAgICJlbHNlICIsCiAgICAgICJlbHNlKCIsCiAgICAgICJlbHNlaWYgIiwKICAgICAgImVsc2VpZigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJsb29wICIsCiAgICAgICJub3QgIiwKICAgICAgIm5vdCgiLAogICAgICAib3IgIiwKICAgICAgIm9yKCIsCiAgICAgICI8PiAiLAogICAgICAiPD4oIiwKICAgICAgIj0gIiwKICAgICAgIj0oIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZm5jIiwKICAgICAgInBrYiIsCiAgICAgICJwa3MiLAogICAgICAicHJjIiwKICAgICAgInRyZyIsCiAgICAgICJ2dyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLS0iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiUFNMIEFzc2VydGlvbiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHNsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlBhc2NhbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicGFzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7IiwKICAgICAgICAifSIKICAgICAgXSwKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJQYXRjaCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBhdGNoIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJQZXJsIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwbCIsCiAgICAgICJwbSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI9cG9kIiwKICAgICAgICAiPWN1dCIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgInBlcmwiLAogICAgICAicGVybDUiCiAgICBdCiAgfSwKICAiUGljYXQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImRvICIsCiAgICAgICJmb3JlYWNoICIsCiAgICAgICJmb3JlYWNoKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwaSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlBsYWluIFRleHQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0ZXh0IiwKICAgICAgInR4dCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiUG9sbHkiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBvbGx5IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiUG9ueSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAibWF0Y2ggIiwKICAgICAgInJlcGVhdCIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAiZWxzZWlmICIsCiAgICAgICJ8ICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwb255IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIlxcXCJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIlxcXCJcXFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiUG93ZXJzaGVsbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJ1bnRpbCAiLAogICAgICAidW50aWwoIiwKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJmb3JlYWNoICIsCiAgICAgICJmb3JlYWNoKCIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZWlmICIsCiAgICAgICJlbHNlICIsCiAgICAgICJzd2l0Y2giLAogICAgICAic3dpdGNoKCIsCiAgICAgICItZ3QiLAogICAgICAiLWx0IiwKICAgICAgIi1lcSIsCiAgICAgICItbmUiLAogICAgICAiLWdlIiwKICAgICAgIi1sZSIsCiAgICAgICItaW4iLAogICAgICAiLW5vdGluIiwKICAgICAgIi1jb250YWlucyIsCiAgICAgICItbm90Y29udGFpbnMiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwczEiLAogICAgICAicHNtMSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IyIsCiAgICAgICAgIiM+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlByb2Nlc3NpbmciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBkZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJQcm9sb2ciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInAiLAogICAgICAicHJvIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIlIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiUHJvcGVydGllcyBGaWxlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHJvcGVydGllcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiUHJvdG9jb2wgQnVmZmVycyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHJvdG8iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJQdXBwZXQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInBwIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIj1iZWdpbiIsCiAgICAgICAgIj1lbmQiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJQdXJlU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJwdXJzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ7LSIsCiAgICAgICAgIi19IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiUHl0aG9uIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAid2hpbGUgIiwKICAgICAgIndoaWxlKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgImVsaWYgIiwKICAgICAgImVsaWYoIiwKICAgICAgImVsc2UgIiwKICAgICAgImVsc2U6IiwKICAgICAgIm1hdGNoICIsCiAgICAgICJtYXRjaCgiLAogICAgICAidHJ5ICIsCiAgICAgICJ0cnk6IiwKICAgICAgImV4Y2VwdCAiLAogICAgICAiZXhjZXB0KCIsCiAgICAgICJmaW5hbGx5ICIsCiAgICAgICJmaW5hbGx5OiIsCiAgICAgICJ3aXRoICIsCiAgICAgICJ3aXRoICgiLAogICAgICAiYW5kICIsCiAgICAgICJhbmQoIiwKICAgICAgIm9yICIsCiAgICAgICJvcigiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJweSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZG9jU3RyaW5nIjogdHJ1ZSwKICAgICAgICAiZW5kIjogIlwiXCJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiXCJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJkb2NTdHJpbmciOiB0cnVlLAogICAgICAgICJlbmQiOiAiJycnIiwKICAgICAgICAic3RhcnQiOiAiJycnIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICJcIlwiXCIiLAogICAgICAgICJzdGFydCI6ICJyXCJcIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICJyJycnIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAicHl0aG9uIiwKICAgICAgInB5dGhvbjIiLAogICAgICAicHl0aG9uMyIKICAgIF0KICB9LAogICJQUlFMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJjYXNlICIsCiAgICAgICImJiAiLAogICAgICAifHwgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiLAogICAgICAifj0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicHJxbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZG9jU3RyaW5nIjogdHJ1ZSwKICAgICAgICAiZW5kIjogIlwiXCJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiXCJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJkb2NTdHJpbmciOiB0cnVlLAogICAgICAgICJlbmQiOiAiJycnIiwKICAgICAgICAic3RhcnQiOiAiJycnIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICJcIlwiXCIiLAogICAgICAgICJzdGFydCI6ICJyXCJcIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImRvY1N0cmluZyI6IHRydWUsCiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICJyJycnIgogICAgICB9CiAgICBdCiAgfSwKICAiUSMiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJyZXBlYXQgIiwKICAgICAgInJlcGVhdHsiLAogICAgICAidW50aWwgKCIsCiAgICAgICJ1bnRpbCgiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJlbGlmICIsCiAgICAgICJlbGlmeyIsCiAgICAgICJlbHNlICIsCiAgICAgICJlbHNleyIsCiAgICAgICJ8fHwgIiwKICAgICAgIiYmJiAiLAogICAgICAiPDw8IiwKICAgICAgIj4+PiIsCiAgICAgICJeXl4iLAogICAgICAifn5+IiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJxcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJRQ0wiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInFjbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJRTUwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInFtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJSIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJSYWtlZmlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogW10sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAicmFrZSIsCiAgICAgICJyYWtlZmlsZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI9YmVnaW4iLAogICAgICAgICI9ZW5kIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiUmFrdSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiPT0gIiwKICAgICAgIuKJoSAiLAogICAgICAiIT0gIiwKICAgICAgIuKJoCAiLAogICAgICAiIT09ICIsCiAgICAgICLiiaIgIiwKICAgICAgIjwgIiwKICAgICAgIuKKgiAiLAogICAgICAiITwgIiwKICAgICAgIuKKhCAiLAogICAgICAiPD0gIiwKICAgICAgIuKJpCAiLAogICAgICAi4oqGICIsCiAgICAgICIhPD0gIiwKICAgICAgIuKKiCAiLAogICAgICAiPiAiLAogICAgICAi4oqDICIsCiAgICAgICIhPiAiLAogICAgICAi4oqFICIsCiAgICAgICI+PSAiLAogICAgICAi4omlICIsCiAgICAgICLiiocgIiwKICAgICAgIiE+PSAiLAogICAgICAi4oqJICIsCiAgICAgICI9fj0gIiwKICAgICAgIuKJhSAiLAogICAgICAiPT09ICIsCiAgICAgICJlcSAiLAogICAgICAiIWVxICIsCiAgICAgICJlcXYgIiwKICAgICAgIm5lICIsCiAgICAgICJndCAiLAogICAgICAiZ2UgIiwKICAgICAgImx0ICIsCiAgICAgICJsZSAiLAogICAgICAiPTo9IiwKICAgICAgIkNBVENIICIsCiAgICAgICJDT05UUk9MICIsCiAgICAgICJET0MgIiwKICAgICAgIk5FWFQgIiwKICAgICAgImFuZCAiLAogICAgICAiZGVmYXVsdCAiLAogICAgICAiZG8geyIsCiAgICAgICJlbHNlICIsCiAgICAgICJlbHNpZiAiLAogICAgICAiZW1pdCAiLAogICAgICAiZm9yICIsCiAgICAgICJnYXRoZXIgIiwKICAgICAgImdpdmVuICIsCiAgICAgICJpZiAiLAogICAgICAibGFzdCAiLAogICAgICAibG9vcCAoIiwKICAgICAgIm5leHQgIiwKICAgICAgIm9uY2UgIiwKICAgICAgIm9yICIsCiAgICAgICJvcndpdGggIiwKICAgICAgInJlYWN0IHsiLAogICAgICAicmVkbyAiLAogICAgICAicmVwZWF0ICIsCiAgICAgICJzdGFydCB7IiwKICAgICAgInN1cHBseSAiLAogICAgICAidW5sZXNzICIsCiAgICAgICJ1bnRpbCAiLAogICAgICAid2hlbiAiLAogICAgICAid2hlbmV2ZXIgIiwKICAgICAgIndoaWxlICIsCiAgICAgICJ3aXRoICIsCiAgICAgICJ3aXRob3V0ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJha3UiLAogICAgICAicmFrdW1vZCIsCiAgICAgICJyYWt1dGVzdCIsCiAgICAgICJyYWt1ZG9jIiwKICAgICAgInQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPWJlZ2luIiwKICAgICAgICAiPWVuZCIKICAgICAgXSwKICAgICAgWwogICAgICAgICIjYCgiLAogICAgICAgICIpIgogICAgICBdLAogICAgICBbCiAgICAgICAgIiNgWyIsCiAgICAgICAgIl0iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiI2B7IiwKICAgICAgICAifSIKICAgICAgXSwKICAgICAgWwogICAgICAgICIjYO+9oiIsCiAgICAgICAgIu+9oyIKICAgICAgXQoKICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIuKAnCIsCiAgICAgICAgInN0YXJ0IjogIuKAniIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiwrsiLAogICAgICAgICJzdGFydCI6ICLCqyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiPj4iLAogICAgICAgICJzdGFydCI6ICI8PCIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAi4oCdIiwKICAgICAgICAic3RhcnQiOiAi4oCcIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICLigJgiLAogICAgICAgICJzdGFydCI6ICLigJkiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIu+9oyIsCiAgICAgICAgInN0YXJ0IjogIu+9oiIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgInJha3UiCiAgICBdCiAgfSwKICAiUmF6b3IiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNzaHRtbCIsCiAgICAgICJyYXpvciIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdLAogICAgICBbCiAgICAgICAgIkAqIiwKICAgICAgICAiKkAiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJSZVNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgIj09PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJyZXMiLAogICAgICAicmVzaSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJSZVN0cnVjdHVyZWRUZXh0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicnN0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJSZXBvcnQgRGVmaW5pdGlvbiBMYW5ndWFnZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJkbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIldpbmRvd3MgUmVzb3VyY2UtRGVmaW5pdGlvbiBTY3JpcHQiOiB7CiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJjIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXSwKICAgICJrZXl3b3JkcyI6IFsKICAgICAgIiNpbmNsdWRlIiwKICAgICAgIiNkZWZpbmUiLAogICAgICAiUkNfSU5WT0tFRCIsCiAgICAgICJWRVJTSU9OSU5GTyIsCiAgICAgICJGSUxFVkVSU0lPTiIsCiAgICAgICJQUk9EVUNUVkVSU0lPTiIsCiAgICAgICJGSUxFT1MiLAogICAgICAiRklMRVRZUEUiLAogICAgICAiQkxPQ0siLAogICAgICAiVkFMVUUiLAogICAgICAiU3RyaW5nRmlsZUluZm8iLAogICAgICAiVmFyRmlsZUluZm8iCiAgICBdCiAgfSwKICAiUm9ib3QgRnJhbWV3b3JrIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicm9ib3QiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlJ1YnkiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJiIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIj1iZWdpbiIsCiAgICAgICAgIj1lbmQiCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0sCiAgICAic2hlYmFuZ3MiOiBbCiAgICAgICJydWJ5IgogICAgXQogIH0sCiAgIlJ1YnkgSFRNTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAicmh0bWwiLAogICAgICAiZXJiIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiUnVzdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgIm1hdGNoICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU0FTIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJkbyIsCiAgICAgICIlZG8iLAogICAgICAiaWYiLAogICAgICAiJWlmIiwKICAgICAgImVsc2UiLAogICAgICAiJWVsc2UiLAogICAgICAiY2FzZSIsCiAgICAgICJvciIsCiAgICAgICJhbmQiLAogICAgICAiXj0iLAogICAgICAiwqw9IiwKICAgICAgIn49IiwKICAgICAgIm5lIiwKICAgICAgImVxIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic2FzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIqIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIlNLSUxMIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJpbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlNOT0JPTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiOigiLAogICAgICAiOnMoIiwKICAgICAgIjpmKCIsCiAgICAgICJlcSAiLAogICAgICAibmUgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic25vIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIqIgogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiU1BEWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInNwZHgiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlNRTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic3FsIiwKICAgICAgImRtbCIsCiAgICAgICJkZGwiLAogICAgICAiZHFsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICItLSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJTUmVjb2RlIFRlbXBsYXRlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzcnQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjs7IgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJTVkciOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInN2ZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlNhc3MiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInNhc3MiLAogICAgICAic2NzcyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJTY2FsYSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic2MiLAogICAgICAic2NhbGEiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU2NoZW1lIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzY20iLAogICAgICAic3MiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIjsiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiI3wiLAogICAgICAgICJ8IyIKICAgICAgXQogICAgXSwKICAgICJuZXN0ZWRtdWx0aWxpbmUiOiB0cnVlLAogICAgInF1b3RlcyI6IFtdLAogICAgInNoZWJhbmdzIjogW10KICB9LAogICJSYWNrZXQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgIihpZiIsCiAgICAgICIoY29uZCIsCiAgICAgICJbZWxzZSIsCiAgICAgICIoYW5kIiwKICAgICAgIihvciIsCiAgICAgICIoZm9yIiwKICAgICAgIiM6d2hlbiIsCiAgICAgICIjOnVubGVzcyIsCiAgICAgICIjOmJyZWFrIiwKICAgICAgIiM6ZmluYWwiLAogICAgICAiKGRvIiwKICAgICAgIih3aGVuIiwKICAgICAgIih1bmxlc3MiLAogICAgICAiKHNoYXJlZCIsCiAgICAgICIoY2FzZSIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInJrdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiOyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICJ8IyIsCiAgICAgICAgIiN8IgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAicmFja2V0IgogICAgXQogIH0sCiAgIlNjb25zIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjc2lnIiwKICAgICAgInNjb25zdHJ1Y3QiLAogICAgICAic2NvbnNjcmlwdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICJcXFwiXFxcIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiXFxcIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIicnJyIsCiAgICAgICAgInN0YXJ0IjogIicnJyIKICAgICAgfQogICAgXQogIH0sCiAgIlNoZWxsIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzaCIKICAgIF0sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAiLnRjc2hyYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAic2giCiAgICBdCiAgfSwKICAiTnVzaGVsbCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJkbyB7ICIsCiAgICAgICJlYWNoIHsiLAogICAgICAiaWYgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm51IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgIm51IgogICAgXQogIH0sCiAgIlNtYXJ0eSBUZW1wbGF0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgImluY2x1ZGUgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidHBsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgInsqIiwKICAgICAgICAiKn0iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJTb2Z0YnJpZGdlIEJhc2ljIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJlbHNlaWYgIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInNibCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJTb2xpZGl0eSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIiwKICAgICAgImFzc2VtYmx5ICIsCiAgICAgICJhc3NlbWJseXsiLAogICAgICAidW5jaGVja2VkICIsCiAgICAgICJ1bmNoZWNrZWR7IgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic29sIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlNwZWNtYW4gZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLS0iLAogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiJz4iLAogICAgICAgICI8JyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlNwaWNlIE5ldGxpc3QiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImNrdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiKiIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiU3RhbmRhcmQgTUwgKFNNTCkiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInNtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlN0YXRhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3JlYWNoIiwKICAgICAgImZvcnZhbHVlcyIsCiAgICAgICJpZiIsCiAgICAgICJlbHNlIiwKICAgICAgIndoaWxlIiwKICAgICAgInN3aXRjaCIsCiAgICAgICJ8IiwKICAgICAgIiYiLAogICAgICAiIT0iLAogICAgICAiPT0iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJkbyIsCiAgICAgICJhZG8iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIiwKICAgICAgIioiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiJyIsCiAgICAgICAgInN0YXJ0IjogImBcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlN0eWx1cyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAidW5sZXNzICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzdHlsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlN2ZWx0ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic3ZlbHRlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdLAogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU3dpZnQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInN3aWZ0IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU3dpZyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJTeXN0ZW1WZXJpbG9nIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8ICIsCiAgICAgICImICIsCiAgICAgICIhPSAiLAogICAgICAiIT09ICIsCiAgICAgICI9PSAiLAogICAgICAiZm9yZWFjaCAiLAogICAgICAiZm9yZWFjaCgiLAogICAgICAiY2FzZSAiLAogICAgICAiY2FzZSgiLAogICAgICAiY2FzZXggIiwKICAgICAgImNhc2V4KCIsCiAgICAgICJjYXNleiAiLAogICAgICAiY2FzZXooIiwKICAgICAgImNhc2V4eiAiLAogICAgICAiY2FzZXh6KCIsCiAgICAgICJmb3JrICIsCiAgICAgICIgPyAiLAogICAgICAiaW5zaWRlIiwKICAgICAgIndpdGgiLAogICAgICAiZXZlbnQgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAic3YiLAogICAgICAic3ZoIgogICAgXSwKICAgICJrZXl3b3JkcyI6IFsKICAgICAgImVuZG1vZHVsZSIsCiAgICAgICJwb3NlZGdlIiwKICAgICAgImVkZ2UiLAogICAgICAiYWx3YXlzIiwKICAgICAgIndpcmUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiU3lzdGVtZCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImF1dG9tb3VudCIsCiAgICAgICJkZXZpY2UiLAogICAgICAibGluayIsCiAgICAgICJtb3VudCIsCiAgICAgICJwYXRoIiwKICAgICAgInNjb3BlIiwKICAgICAgInNlcnZpY2UiLAogICAgICAic2xpY2UiLAogICAgICAic29ja2V0IiwKICAgICAgInN3YXAiLAogICAgICAidGFyZ2V0IiwKICAgICAgInRpbWVyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJUQ0wiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRjbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdLAogICAgInNoZWJhbmdzIjogWwogICAgICAidGNsIgogICAgXQogIH0sCiAgIlRPTUwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRvbWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIlxcXCJcXFwiIiwKICAgICAgICAic3RhcnQiOiAiXFxcIlxcXCJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInJyciLAogICAgICAgICJzdGFydCI6ICInJyciCiAgICAgIH0KICAgIF0KICB9LAogICJUYXNrUGFwZXIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0YXNrcGFwZXIiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlRlYWwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImxvb3A6IiwKICAgICAgInJldHN1YiIsCiAgICAgICJjYWxsc3ViICIsCiAgICAgICImJiIsCiAgICAgICI9PSIsCiAgICAgICJ8fCIsCiAgICAgICI8PSIsCiAgICAgICI+PSIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRlYWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJUZW1wbGF0ZVRvb2xraXQiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgIlslIEJMT0NLIiwKICAgICAgIlslIEZJTFRFUiIsCiAgICAgICJbJSBGT1IiLAogICAgICAiWyUgRk9SRUFDSCIsCiAgICAgICJbJSBJRiIsCiAgICAgICJbJSBJTkNMVURFIiwKICAgICAgIlslIE1BQ1JPIiwKICAgICAgIlslIFBST0NFU1MiLAogICAgICAiWyUgU1dJVENIIiwKICAgICAgIlslIFVOTEVTUyIsCiAgICAgICJbJSBXUkFQUEVSIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidHQiLAogICAgICAidHQyIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIlslIyIsCiAgICAgICAgIiVdIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiVGVtcGwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImlmICIsCiAgICAgICIgZWxzZSAiLAogICAgICAic3dpdGNoICIsCiAgICAgICJjYXNlICIsCiAgICAgICJkZWZhdWx0OiIsCiAgICAgICJmb3IgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRlbXBsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiYCIsCiAgICAgICAgImlnbm9yZUVzY2FwZSI6IHRydWUsCiAgICAgICAgInN0YXJ0IjogImAiCiAgICAgIH0KICAgIF0KICB9LAogICJUZXJyYWZvcm0iOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImNvdW50IiwKICAgICAgImZvciIsCiAgICAgICJmb3JfZWFjaCIsCiAgICAgICJpZiIsCiAgICAgICI6ICIsCiAgICAgICI/ICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI+ICIsCiAgICAgICI+PSAiLAogICAgICAiPCAiLAogICAgICAiPD0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRmIiwKICAgICAgInRmLmpzb24iCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiLAogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlRlWCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidGV4IiwKICAgICAgInN0eSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJSIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiVGV4dGlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRleHRpbGUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMjIy4gIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIiMjIy4uICIsCiAgICAgICAgInAuICIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlRocmlmdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInRocmlmdCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iLAogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfSwKICAgICAgewogICAgICAgICJlbmQiOiAiJyIsCiAgICAgICAgInN0YXJ0IjogIiciCiAgICAgIH0KICAgIF0KICB9LAogICJUd2lnIFRlbXBsYXRlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJ7JSBmb3IgIiwKICAgICAgInslIGlmICIsCiAgICAgICJ7JSBlbHNlICIsCiAgICAgICJ7JSBlbHNlaWYgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidHdpZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiVHlwZVNjcmlwdCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifCAiLAogICAgICAifHwgIiwKICAgICAgIiYgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiIT09ICIsCiAgICAgICI9PSAiLAogICAgICAiPT09ICIsCiAgICAgICJmb3JlYWNoKCIsCiAgICAgICJjYXNlICIsCiAgICAgICJjYXNlKCIsCiAgICAgICJjYXNleCAiLAogICAgICAiY2FzZXgoIiwKICAgICAgImNhc2V6ICIsCiAgICAgICJjYXNleigiLAogICAgICAiY2FzZXh6ICIsCiAgICAgICJjYXNleHooIiwKICAgICAgImZvcmsiLAogICAgICAiPyIsCiAgICAgICI6IiwKICAgICAgImluc2lkZSIsCiAgICAgICJ3aXRoIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidHMiLAogICAgICAidHN4IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlR5cGVTY3JpcHQgVHlwaW5ncyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifCAiLAogICAgICAifHwgIiwKICAgICAgIiYgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiIT09ICIsCiAgICAgICI9PSAiLAogICAgICAiPT09ICIsCiAgICAgICJmb3JlYWNoKCIsCiAgICAgICJjYXNlICIsCiAgICAgICJjYXNlKCIsCiAgICAgICJjYXNleCAiLAogICAgICAiY2FzZXgoIiwKICAgICAgImNhc2V6ICIsCiAgICAgICJjYXNleigiLAogICAgICAiY2FzZXh6ICIsCiAgICAgICJjYXNleHooIiwKICAgICAgImZvcmsiLAogICAgICAiPyIsCiAgICAgICI6IiwKICAgICAgImluc2lkZSIsCiAgICAgICJ3aXRoIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAiZC50cyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiVEwiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ0bCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iLAogICAgICAiLy8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogW10KICB9LAogICJVbnJlYWwgU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ1YyIsCiAgICAgICJ1Y2kiLAogICAgICAidXBrZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJVci9XZWIiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInVyIiwKICAgICAgInVycyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIoKiIsCiAgICAgICAgIiopIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlVyL1dlYiBQcm9qZWN0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ1cnAiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIlYiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInYiCiAgICBdLAogICAgImtleXdvcmRzIjogWwogICAgICAiYnJlYWsiLAogICAgICAiY29uc3QgIiwKICAgICAgImNvbnRpbnVlIiwKICAgICAgImRlZmVyIiwKICAgICAgImVsc2UgIiwKICAgICAgImVudW0iLAogICAgICAiZm4gIiwKICAgICAgImdvdG8iLAogICAgICAiaW1wb3J0ICIsCiAgICAgICJpbiAiLAogICAgICAiaW50ZXJmYWNlIiwKICAgICAgIm1hdGNoIiwKICAgICAgIm11dCIsCiAgICAgICJwcmludGxuIiwKICAgICAgInB1YiIsCiAgICAgICJyZXR1cm4iLAogICAgICAic3RydWN0ICIsCiAgICAgICJ0eXBlICIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogImAiLAogICAgICAgICJzdGFydCI6ICJgIgogICAgICB9CiAgICBdCiAgfSwKICAiVkhETCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidmhkIiwKICAgICAgInZoZGwiCiAgICBdLAogICAgImtleXdvcmRzIjogWwogICAgICAiYWJzIiwKICAgICAgImFjY2VzcyIsCiAgICAgICJhZnRlciIsCiAgICAgICJhbGlhcyIsCiAgICAgICJhbGwiLAogICAgICAiYW5kIiwKICAgICAgImFyY2hpdGVjdHVyZSIsCiAgICAgICJhcnJheSIsCiAgICAgICJhc3NlcnQiLAogICAgICAiYXR0cmlidXRlIiwKICAgICAgImJlZ2luIiwKICAgICAgImJsb2NrIiwKICAgICAgImJvZHkiLAogICAgICAiYnVmZmVyIiwKICAgICAgImJ1cyIsCiAgICAgICJjYXNlIiwKICAgICAgImNvbXBvbmVudCIsCiAgICAgICJjb25maWd1cmF0aW9uIiwKICAgICAgImNvbnN0YW50IiwKICAgICAgImRpc2Nvbm5lY3QiLAogICAgICAiZG93bnRvIiwKICAgICAgImVsc2UiLAogICAgICAiZWxzaWYiLAogICAgICAiZW5kIiwKICAgICAgImVudGl0eSIsCiAgICAgICJleGl0IiwKICAgICAgImZpbGUiLAogICAgICAiZm9yIiwKICAgICAgImZ1bmN0aW9uIiwKICAgICAgImdlbmVyYXRlIiwKICAgICAgImdlbmVyaWMiLAogICAgICAiZ3JvdXAiLAogICAgICAiZ3VhcmRlZCIsCiAgICAgICJpZiIsCiAgICAgICJpbXB1cmUiLAogICAgICAiaW4iLAogICAgICAiaW5lcnRpYWwiLAogICAgICAiaW5vdXQiLAogICAgICAiaXMiLAogICAgICAibGFiZWwiLAogICAgICAibGlicmFyeSIsCiAgICAgICJsaW5rYWdlIiwKICAgICAgImxpdGVyYWwiLAogICAgICAibG9vcCIsCiAgICAgICJtYXAiLAogICAgICAibW9kIiwKICAgICAgIm5hbmQiLAogICAgICAibmV3IiwKICAgICAgIm5leHQiLAogICAgICAibm9yIiwKICAgICAgIm5vdCIsCiAgICAgICJudWxsIiwKICAgICAgIm9mIiwKICAgICAgIm9uIiwKICAgICAgIm9wZW4iLAogICAgICAib3IiLAogICAgICAib3RoZXJzIiwKICAgICAgIm91dCIsCiAgICAgICJwYWNrYWdlIiwKICAgICAgInBvcnQiLAogICAgICAicG9zdHBvbmVkIiwKICAgICAgInByb2NlZHVyZSIsCiAgICAgICJwcm9jZXNzIiwKICAgICAgInB1cmUiLAogICAgICAicmFuZ2UiLAogICAgICAicmVjb3JkIiwKICAgICAgInJlZ2lzdGVyIiwKICAgICAgInJlamVjdCIsCiAgICAgICJyZW0iLAogICAgICAicmVwb3J0IiwKICAgICAgInJldHVybiIsCiAgICAgICJyb2wiLAogICAgICAicm9yIiwKICAgICAgInNlbGVjdCIsCiAgICAgICJzZXZlcml0eSIsCiAgICAgICJzaGFyZWQiLAogICAgICAic2lnbmFsIiwKICAgICAgInNsYSIsCiAgICAgICJzbGwiLAogICAgICAic3JhIiwKICAgICAgInNybCIsCiAgICAgICJzdWJ0eXBlIiwKICAgICAgInRoZW4iLAogICAgICAidG8iLAogICAgICAidHJhbnNwb3J0IiwKICAgICAgInR5cGUiLAogICAgICAidW5hZmZlY3RlZCIsCiAgICAgICJ1bml0cyIsCiAgICAgICJ1bnRpbCIsCiAgICAgICJ1c2UiLAogICAgICAidmFyaWFibGUiLAogICAgICAid2FpdCIsCiAgICAgICJ3aGVuIiwKICAgICAgIndoaWxlIiwKICAgICAgIndpdGgiLAogICAgICAieG5vciIsCiAgICAgICJ4b3IiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi0tIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJWYWxhIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2YWxhIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlZhcm5pc2ggQ29uZmlndXJhdGlvbiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInZjbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIsCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiVmVyaWxvZyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAidmciLAogICAgICAidmgiLAogICAgICAidiIKICAgIF0sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJtb2R1bGUiLAogICAgICAiZW5kbW9kdWxlIiwKICAgICAgInRpbWVzY2FsZSIsCiAgICAgICJpbnB1dCIsCiAgICAgICJvdXRwdXQiLAogICAgICAicmVnIiwKICAgICAgIndpcmUiLAogICAgICAicG9zZWRnZSIsCiAgICAgICJuZWdlZGdlIiwKICAgICAgImFsd2F5cyIsCiAgICAgICJiZWdpbiIsCiAgICAgICJzd2l0Y2giLAogICAgICAiY2FzZSIsCiAgICAgICJlbmQiLAogICAgICAiZW5kY2FzZSIsCiAgICAgICJlbHNlIiwKICAgICAgImxvY2FscGFyYW0iLAogICAgICAiaW5pdGlhbCIsCiAgICAgICJzaWduZWQiLAogICAgICAiYXNzaWduIiwKICAgICAgImdlbmVyYXRlIiwKICAgICAgImdlbnZhciIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJWZXJpbG9nIEFyZ3MgRmlsZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgImlydW5hcmdzIiwKICAgICAgInhydW5hcmdzIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJWZXJ0ZXggU2hhZGVyIEZpbGUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFsKICAgICAgImZvciAiLAogICAgICAiZm9yKCIsCiAgICAgICJpZiAiLAogICAgICAiaWYoIiwKICAgICAgInN3aXRjaCAiLAogICAgICAid2hpbGUgIiwKICAgICAgImVsc2UgIiwKICAgICAgInx8ICIsCiAgICAgICImJiAiLAogICAgICAiIT0gIiwKICAgICAgIj09ICIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInZzaCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJWaW0gU2NyaXB0IjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2aW0iLAogICAgICAidmltcmMiLAogICAgICAiZ3ZpbXJjIgogICAgXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICJfdmltcmMiLAogICAgICAiLnZpbXJjIiwKICAgICAgIl9ndmltcmMiLAogICAgICAiLmd2aW1yYyIsCiAgICAgICJ2aW1yYyIsCiAgICAgICJndmltcmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIlwiIiwKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXQogIH0sCiAgIlZpc3VhbCBCYXNpYyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAiZWxzZWlmICIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2YiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiJyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJWaXN1YWwgQmFzaWMgZm9yIEFwcGxpY2F0aW9ucyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAiZWxzZWlmICIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJjbHMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiciCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9CiAgICBdCiAgfSwKICAiVnVlIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ2dWUiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0sCiAgICAgIFsKICAgICAgICAiLyoiLAogICAgICAgICIqLyIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIiciLAogICAgICAgICJzdGFydCI6ICInIgogICAgICB9CiAgICBdCiAgfSwKICAiV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIjogewogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ3c2RsIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIjwhLS0iLAogICAgICAgICItLT4iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiV29sZnJhbSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAibmIiLAogICAgICAid2wiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiKCoiLAogICAgICAgICIqKSIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJXcmVuIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ3cmVuIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgIm5lc3RlZG11bHRpbGluZSI6IHRydWUsCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiWEFNTCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieGFtbCIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlhjb2RlIENvbmZpZyI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInhjY29uZmlnIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFtdLAogICAgInF1b3RlcyI6IFtdCiAgfSwKICAiWE1MIjogewogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJ4bWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFtdLAogICAgIm11bHRpX2xpbmUiOiBbCiAgICAgIFsKICAgICAgICAiPCEtLSIsCiAgICAgICAgIi0tPiIKICAgICAgXQogICAgXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlwiIiwKICAgICAgICAic3RhcnQiOiAiXCIiCiAgICAgIH0KICAgIF0KICB9LAogICJYTUwgU2NoZW1hIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieHNkIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJYdGVuZCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieHRlbmQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiWWFybiI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiPDxpZiAiLAogICAgICAiPDxlbHNlaWYgIiwKICAgICAgIjw8ZWxzZSAiLAogICAgICAiIGVxICIsCiAgICAgICIgPT0gIiwKICAgICAgIiBuZXEgIiwKICAgICAgIiAhICIsCiAgICAgICIgZ3QgIiwKICAgICAgIiA+ICIsCiAgICAgICIgbHQgIiwKICAgICAgIiA8ICIsCiAgICAgICIgbHRlICIsCiAgICAgICIgPD0gIiwKICAgICAgIiBndGUgIiwKICAgICAgIiA+PSAiLAogICAgICAiIHhvciAiLAogICAgICAiIF4gIiwKICAgICAgIiBhbmQgIiwKICAgICAgIiAmJiAiLAogICAgICAiIHx8ICIsCiAgICAgICIgb3IgIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieWFybiIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJZQU1MIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieWFtbCIsCiAgICAgICJ5bWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXQogIH0sCiAgIkNsb3VkRm9ybWF0aW9uIChZQU1MKSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiIUdldEF0dCIsCiAgICAgICIhU3ViIiwKICAgICAgIiFTZWxlY3QiLAogICAgICAiIUVxdWFscyIsCiAgICAgICIhSWYiLAogICAgICAiRGVwZW5kc09uOiIsCiAgICAgICIhU2VsZWN0IiwKICAgICAgIiFFcXVhbHMiLAogICAgICAiIUlmIiwKICAgICAgIkZuOjpJZiIsCiAgICAgICJGbjo6QW5kIiwKICAgICAgIkZuOjpFcXVhbHMiLAogICAgICAiRm46Ok5vdCIsCiAgICAgICJGbjo6T3IiLAogICAgICAiRm46OkJhc2U2NCIsCiAgICAgICJGbjo6Q2lkciIsCiAgICAgICJGbjo6RmluZEluTWFwIiwKICAgICAgIkZuOjpHZXRBdHQiLAogICAgICAiRm46OkdldEFacyIsCiAgICAgICJGbjo6SW1wb3J0VmFsdWUiLAogICAgICAiRm46OkpvaW4iLAogICAgICAiRm46OlNlbGVjdCIsCiAgICAgICJGbjo6U3BsaXQiLAogICAgICAiRm46OlN1YiIsCiAgICAgICJGbjo6VHJhbnNmb3JtIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAieWFtbCIsCiAgICAgICJ5bWwiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXSwKICAgICJrZXl3b3JkcyI6IFsKICAgICAgIlJlc291cmNlczoiLAogICAgICAiQVdTVGVtcGxhdGVGb3JtYXRWZXJzaW9uOiIsCiAgICAgICJEZXNjcmlwdGlvbjoiLAogICAgICAiQVdTOjoiLAogICAgICAiUHJvcGVydGllczoiLAogICAgICAiTmFtZToiLAogICAgICAiVHlwZToiLAogICAgICAiIUdldEF0dCIsCiAgICAgICIhU3ViIiwKICAgICAgIlN0YXRlbWVudDoiLAogICAgICAiUmVmOiIsCiAgICAgICJEZXBlbmRzT246IiwKICAgICAgIiFTZWxlY3QiLAogICAgICAiIUVxdWFscyIsCiAgICAgICIhSWYiLAogICAgICAiRm46OklmIiwKICAgICAgIkZuOjpBbmQiLAogICAgICAiRm46OkVxdWFscyIsCiAgICAgICJGbjo6Tm90IiwKICAgICAgIkZuOjpPciIsCiAgICAgICJGbjo6QmFzZTY0IiwKICAgICAgIkZuOjpDaWRyIiwKICAgICAgIkZuOjpGaW5kSW5NYXAiLAogICAgICAiRm46OkdldEF0dCIsCiAgICAgICJGbjo6R2V0QVpzIiwKICAgICAgIkZuOjpJbXBvcnRWYWx1ZSIsCiAgICAgICJGbjo6Sm9pbiIsCiAgICAgICJGbjo6U2VsZWN0IiwKICAgICAgIkZuOjpTcGxpdCIsCiAgICAgICJGbjo6U3ViIiwKICAgICAgIkZuOjpUcmFuc2Zvcm0iCiAgICBdCiAgfSwKICAiQ2xvdWRGb3JtYXRpb24gKEpTT04pIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICIhR2V0QXR0IiwKICAgICAgIiFTdWIiLAogICAgICAiIVNlbGVjdCIsCiAgICAgICIhRXF1YWxzIiwKICAgICAgIiFJZiIsCiAgICAgICJEZXBlbmRzT246IiwKICAgICAgIiFTZWxlY3QiLAogICAgICAiIUVxdWFscyIsCiAgICAgICIhSWYiLAogICAgICAiRm46OklmIiwKICAgICAgIkZuOjpBbmQiLAogICAgICAiRm46OkVxdWFscyIsCiAgICAgICJGbjo6Tm90IiwKICAgICAgIkZuOjpPciIsCiAgICAgICJGbjo6QmFzZTY0IiwKICAgICAgIkZuOjpDaWRyIiwKICAgICAgIkZuOjpGaW5kSW5NYXAiLAogICAgICAiRm46OkdldEF0dCIsCiAgICAgICJGbjo6R2V0QVpzIiwKICAgICAgIkZuOjpJbXBvcnRWYWx1ZSIsCiAgICAgICJGbjo6Sm9pbiIsCiAgICAgICJGbjo6U2VsZWN0IiwKICAgICAgIkZuOjpTcGxpdCIsCiAgICAgICJGbjo6U3ViIiwKICAgICAgIkZuOjpUcmFuc2Zvcm0iCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJqc29uIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10sCiAgICAia2V5d29yZHMiOiBbCiAgICAgICJcIkFXU1RlbXBsYXRlRm9ybWF0VmVyc2lvblwiIiwKICAgICAgIkFXUzo6IiwKICAgICAgIiFHZXRBdHQiLAogICAgICAiIVN1YiIsCiAgICAgICJcIkRlcGVuZHNPblwiIiwKICAgICAgIiFTZWxlY3QiLAogICAgICAiIUVxdWFscyIsCiAgICAgICIhSWYiLAogICAgICAiRm46OklmIiwKICAgICAgIkZuOjpBbmQiLAogICAgICAiRm46OkVxdWFscyIsCiAgICAgICJGbjo6Tm90IiwKICAgICAgIkZuOjpPciIsCiAgICAgICJGbjo6QmFzZTY0IiwKICAgICAgIkZuOjpDaWRyIiwKICAgICAgIkZuOjpGaW5kSW5NYXAiLAogICAgICAiRm46OkdldEF0dCIsCiAgICAgICJGbjo6R2V0QVpzIiwKICAgICAgIkZuOjpJbXBvcnRWYWx1ZSIsCiAgICAgICJGbjo6Sm9pbiIsCiAgICAgICJGbjo6U2VsZWN0IiwKICAgICAgIkZuOjpTcGxpdCIsCiAgICAgICJGbjo6U3ViIiwKICAgICAgIkZuOjpUcmFuc2Zvcm0iCiAgICBdCiAgfSwKICAiWmlnIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJ3aGlsZSAiLAogICAgICAiZm9yICIsCiAgICAgICJpZiAiLAogICAgICAiZWxzZSAiLAogICAgICAiZGVmZXIgIiwKICAgICAgInN3aXRjaCIsCiAgICAgICJ8fCIsCiAgICAgICImJiIsCiAgICAgICIhPSIsCiAgICAgICI9PSIKICAgIF0sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgInppZyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiLy8iCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXFxcIiIsCiAgICAgICAgInN0YXJ0IjogIlxcXCIiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxuIiwKICAgICAgICAic3RhcnQiOiAiXFxcXCIKICAgICAgfQogICAgXQogIH0sCiAgIlpzaCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAifHwgIiwKICAgICAgIiYmICIsCiAgICAgICIhPSAiLAogICAgICAiPT0gIgogICAgXSwKICAgICJleHRlbnNpb25zIjogWwogICAgICAienNoIiwKICAgICAgInpzaGVudiIsCiAgICAgICJ6bG9naW4iLAogICAgICAiemxvZ291dCIsCiAgICAgICJ6cHJvZmlsZSIsCiAgICAgICJ6c2hyYyIKICAgIF0sCiAgICAiZmlsZW5hbWVzIjogWwogICAgICAiLnpzaGVudiIsCiAgICAgICIuemxvZ2luIiwKICAgICAgIi56bG9nb3V0IiwKICAgICAgIi56cHJvZmlsZSIsCiAgICAgICIuenNocmMiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbCiAgICAgIHsKICAgICAgICAiZW5kIjogIlxcXCIiLAogICAgICAgICJzdGFydCI6ICJcXFwiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImVuZCI6ICInIiwKICAgICAgICAic3RhcnQiOiAiJyIKICAgICAgfQogICAgXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgInpzaCIKICAgIF0KICB9LAogICJnaXRpZ25vcmUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICIuZ2l0aWdub3JlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJpZ25vcmUiOiB7CiAgICAiY29tcGxleGl0eWNoZWNrcyI6IFtdLAogICAgImV4dGVuc2lvbnMiOiBbXSwKICAgICJmaWxlbmFtZXMiOiBbCiAgICAgICIuaWdub3JlIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJtNCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogW10sCiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm00IgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIjIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogW10sCiAgICAicXVvdGVzIjogW10KICB9LAogICJudXNwZWMiOiB7CiAgICAiZXh0ZW5zaW9ucyI6IFsKICAgICAgIm51c3BlYyIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogW10sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICI8IS0tIiwKICAgICAgICAiLS0+IgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgInNlZCI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiZm9yICIsCiAgICAgICJmb3IoIiwKICAgICAgImlmICIsCiAgICAgICJpZigiLAogICAgICAic3dpdGNoICIsCiAgICAgICJ3aGlsZSAiLAogICAgICAiZWxzZSAiLAogICAgICAiYW5kICIsCiAgICAgICJvciAiLAogICAgICAibm90ICIsCiAgICAgICJpbiAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzZWQiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIiMiCiAgICBdLAogICAgIm11bHRpX2xpbmUiOiBbXSwKICAgICJxdW90ZXMiOiBbXSwKICAgICJzaGViYW5ncyI6IFsKICAgICAgInNlZCIKICAgIF0KICB9LAogICJTaWV2ZSI6IHsKICAgICJjb21wbGV4aXR5Y2hlY2tzIjogWwogICAgICAiaWYiLAogICAgICAiaWYgIiwKICAgICAgImVsc2lmIiwKICAgICAgImVsc2lmICIsCiAgICAgICJhbGxvZiIsCiAgICAgICJhbGxvZiAiLAogICAgICAiYW55b2YiLAogICAgICAiYW55b2YgIiwKICAgICAgImFsbG9mKCIsCiAgICAgICJhbnlvZigiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJzaWV2ZSIKICAgIF0sCiAgICAibGluZV9jb21tZW50IjogWwogICAgICAiIyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0sCiAgIlJlYXNvbk1MIjogewogICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgIndoaWxlICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJyZSIsCiAgICAgICJyZWkiCiAgICBdLAogICAgImxpbmVfY29tbWVudCI6IFsKICAgICAgIi8vIgogICAgXSwKICAgICJtdWx0aV9saW5lIjogWwogICAgICBbCiAgICAgICAgIi8qIiwKICAgICAgICAiKi8iCiAgICAgIF0KICAgIF0sCiAgICAicXVvdGVzIjogWwogICAgICB7CiAgICAgICAgImVuZCI6ICJcIiIsCiAgICAgICAgInN0YXJ0IjogIlwiIgogICAgICB9CiAgICBdCiAgfSwKICAiT2RpbiI6IHsKICAgImNvbXBsZXhpdHljaGVja3MiOiBbCiAgICAgICJmb3IgIiwKICAgICAgImZvcigiLAogICAgICAiaWYgIiwKICAgICAgImlmKCIsCiAgICAgICJ3aGVuICIsCiAgICAgICJzd2l0Y2ggIiwKICAgICAgImRlZmVyICIsCiAgICAgICJlbHNlICIsCiAgICAgICJ8fCAiLAogICAgICAiJiYgIiwKICAgICAgIiE9ICIsCiAgICAgICI9PSAiCiAgICBdLAogICAgImV4dGVuc2lvbnMiOiBbCiAgICAgICJvZGluIgogICAgXSwKICAgICJsaW5lX2NvbW1lbnQiOiBbCiAgICAgICIvLyIKICAgIF0sCiAgICAibXVsdGlfbGluZSI6IFsKICAgICAgWwogICAgICAgICIvKiIsCiAgICAgICAgIiovIgogICAgICBdCiAgICBdLAogICAgInF1b3RlcyI6IFsKICAgICAgewogICAgICAgICJlbmQiOiAiXCIiLAogICAgICAgICJzdGFydCI6ICJcIiIKICAgICAgfQogICAgXQogIH0KfQo=` ) diff --git a/processor/file.go b/processor/file.go index bf7c4e23..46ce71a4 100644 --- a/processor/file.go +++ b/processor/file.go @@ -6,12 +6,8 @@ import ( "fmt" "os" "path/filepath" - "regexp" "strings" "sync" - - "github.com/boyter/scc/v3/processor/gitignore" - "github.com/dbaggerman/cuba" ) // Used as quick lookup for files with the same name to avoid some processing @@ -46,168 +42,6 @@ func getExtension(name string) string { return extension.(string) } -// DirectoryJob is a struct for dealing with directories we want to walk -type DirectoryJob struct { - root string - path string - ignores []gitignore.IgnoreMatcher -} - -// DirectoryWalker is responsible for actually walking directories using cuba -type DirectoryWalker struct { - buffer *cuba.Pool - output chan<- *FileJob - excludes []*regexp.Regexp -} - -// NewDirectoryWalker create the new directory walker -func NewDirectoryWalker(output chan<- *FileJob) *DirectoryWalker { - directoryWalker := &DirectoryWalker{ - output: output, - } - for _, exclude := range Exclude { - regexpResult, err := regexp.Compile(exclude) - if err == nil { - directoryWalker.excludes = append(directoryWalker.excludes, regexpResult) - } else { - printError(err.Error()) - } - } - - directoryWalker.buffer = cuba.New(directoryWalker.Walk, cuba.NewStack()) - directoryWalker.buffer.SetMaxWorkers(int32(DirectoryWalkerJobWorkers)) - - return directoryWalker -} - -// Start actually starts directory traversal -func (dw *DirectoryWalker) Start(root string) error { - root = filepath.Clean(root) - - fileInfo, err := os.Lstat(root) - if err != nil { - return err - } - - if !fileInfo.IsDir() { - fileJob := newFileJob(root, filepath.Base(root), fileInfo) - if fileJob != nil { - dw.output <- fileJob - } - - return nil - } - - _ = dw.buffer.Push( - &DirectoryJob{ - root: root, - path: root, - ignores: nil, - }, - ) - - return nil -} - -// Run continues to run everything -func (dw *DirectoryWalker) Run() { - dw.buffer.Finish() - close(dw.output) -} - -// Walk walks the directory as quickly as it can -func (dw *DirectoryWalker) Walk(handle *cuba.Handle) { - job := handle.Item().(*DirectoryJob) - - ignores := job.ignores - - dirents, err := dw.Readdir(job.path) - if err != nil { - printError(err.Error()) - return - } - - for _, dirent := range dirents { - name := dirent.Name() - - if (!GitIgnore && name == ".gitignore") || (!Ignore && name == ".ignore") { - path := filepath.Join(job.path, name) - - ignore, err := gitignore.NewGitIgnore(path) - if err != nil { - printError(fmt.Sprintf("failed to load gitignore %s: %v", job.path, err)) - } else { - ignores = append(ignores, ignore) - } - } - } - -DIRENTS: - for _, dirent := range dirents { - name := dirent.Name() - path := filepath.Join(job.path, name) - isDir := dirent.IsDir() - - for _, deny := range PathDenyList { - if strings.HasSuffix(path, deny) { - if Verbose { - printWarn(fmt.Sprintf("skipping directory due to being in denylist: %s", path)) - } - continue DIRENTS - } - } - - for _, exclude := range dw.excludes { - if exclude.MatchString(name) || exclude.MatchString(path) { - if Verbose { - printWarn("skipping file/directory due to match exclude: " + name) - } - continue DIRENTS - } - } - - for _, ignore := range ignores { - if ignore.Match(path, isDir) { - if Verbose { - printWarn("skipping directory due to ignore: " + path) - } - continue DIRENTS - } - } - - if isDir { - handle.Push( - &DirectoryJob{ - root: job.root, - path: path, - ignores: ignores, - }, - ) - } else { - fileJob := newFileJob(path, name, dirent) - if fileJob != nil { - dw.output <- fileJob - } - } - } -} - -// Readdir reads a directory such that we know what files are in there -func (dw *DirectoryWalker) Readdir(path string) ([]os.FileInfo, error) { - file, err := os.Open(path) - if err != nil { - return []os.FileInfo{}, fmt.Errorf("failed to open %s: %v", path, err) - } - defer file.Close() - - dirents, err := file.Readdir(-1) - if err != nil { - return []os.FileInfo{}, fmt.Errorf("failed to read %s: %v", path, err) - } - - return dirents, nil -} - func newFileJob(path, name string, fileInfo os.FileInfo) *FileJob { if NoLarge { if fileInfo.Size() >= LargeByteCount { @@ -230,8 +64,17 @@ func newFileJob(path, name string, fileInfo os.FileInfo) *FileJob { return nil } - symPath, _ = filepath.EvalSymlinks(path) - fileInfo, _ = os.Lstat(symPath) + var err error + symPath, err = filepath.EvalSymlinks(path) + if err != nil { + printError(err.Error()) + return nil + } + fileInfo, err = os.Lstat(symPath) + if err != nil { + printError(err.Error()) + return nil + } } // Skip non-regular files. They are unlikely to be code and may hang if we diff --git a/processor/file_test.go b/processor/file_test.go index b7c41ed3..c0578cbe 100644 --- a/processor/file_test.go +++ b/processor/file_test.go @@ -5,8 +5,6 @@ package processor import ( "math/rand" "os" - "path/filepath" - "strings" "testing" ) @@ -74,146 +72,6 @@ func TestGetExtensionSecondPass(t *testing.T) { } } -func TestWalkDirectoryParallel(t *testing.T) { - isLazy = false - ProcessConstants() - - AllowListExtensions = []string{"go"} - Exclude = []string{} - PathDenyList = []string{} - Verbose = true - Trace = true - Debug = true - GcFileCount = 10 - - inputChan := make(chan *FileJob, 10000) - - dirwalker := NewDirectoryWalker(inputChan) - err := dirwalker.Start("../") - if err != nil { - t.Errorf("dirwalker.Start returned error: %v", err) - t.FailNow() - } - dirwalker.Run() - - count := 0 - for range inputChan { - count++ - } - - if count == 0 { - t.Errorf("Expected at least one file got %d", count) - } -} - -func TestWalkDirectoryParallelWorksWithSingleInputFile(t *testing.T) { - isLazy = false - ProcessConstants() - - AllowListExtensions = []string{"go"} - Exclude = []string{"vendor"} - PathDenyList = []string{"vendor"} - Verbose = true - Trace = true - Debug = true - GcFileCount = 10 - - inputChan := make(chan *FileJob, 10000) - - dirwalker := NewDirectoryWalker(inputChan) - err := dirwalker.Start("file_test.go") - if err != nil { - t.Errorf("dirwalker.Start returned error: %v", err) - t.FailNow() - } - dirwalker.Run() - - count := 0 - for range inputChan { - count++ - } - - if count != 1 { - t.Errorf("Expected exactly one file got %d", count) - } -} - -func TestWalkDirectoryParallelIgnoresRootTrailingSlash(t *testing.T) { - isLazy = false - ProcessConstants() - - AllowListExtensions = []string{"go"} - Exclude = []string{"vendor"} - PathDenyList = []string{"vendor"} - Verbose = true - Trace = true - Debug = true - GcFileCount = 10 - - inputChan := make(chan *FileJob, 10000) - - dirwalker := NewDirectoryWalker(inputChan) - err := dirwalker.Start("file_test.go/") - if err != nil { - t.Errorf("dirwalker.Start returned error: %v", err) - t.FailNow() - } - dirwalker.Run() - - count := 0 - for range inputChan { - count++ - } - - if count != 1 { - t.Errorf("Expected exactly one file got %d", count) - } -} - -// Issue #82 - project .git directory not being filtered when using absolute -// path argument -func TestWalkDirectoryParallelIgnoresAbsoluteGitPath(t *testing.T) { - isLazy = false - ProcessConstants() - - // master is a file extension for ASP.NET, and also a filename (almost) - // certain to appear in the .git directory. - // This test also relies on the behaviour of treating `master` as a file - // with the `master` file extension. - AllowListExtensions = []string{"master", "go"} - Exclude = []string{"vendor"} - PathDenyList = []string{".git", "vendor"} - Verbose = true - Trace = true - Debug = true - GcFileCount = 10 - - inputChan := make(chan *FileJob, 10000) - absBaseDir, _ := filepath.Abs("../") - absGitDir := filepath.Join(absBaseDir, ".git") - - dirwalker := NewDirectoryWalker(inputChan) - err := dirwalker.Start(absBaseDir) - if err != nil { - t.Errorf("dirwalker.Start returned error: %v", err) - t.FailNow() - } - dirwalker.Run() - - sawGit := false - for fileJob := range inputChan { - // We do have .gitignore file to worry about here, so if the suffix is that then ignore - if strings.HasPrefix(fileJob.Location, absGitDir) && !strings.HasSuffix(fileJob.Location, ".gitignore") && !strings.Contains(fileJob.Location, ".github") { - sawGit = true - break - } - } - - if sawGit { - t.Errorf("Expected .git folder to be ignored") - } -} - func TestNewFileJobFullname(t *testing.T) { ProcessConstants() AllowListExtensions = []string{} diff --git a/processor/processor.go b/processor/processor.go index cfd388a6..43eecf33 100644 --- a/processor/processor.go +++ b/processor/processor.go @@ -14,6 +14,8 @@ import ( "strings" "sync" + "github.com/boyter/gocodewalker" + jsoniter "github.com/json-iterator/go" ) @@ -529,44 +531,84 @@ func Process() { DirFilePaths = append(DirFilePaths, ".") } + filePaths := []string{} + dirPaths := []string{} + // Check if the paths or files added exist and exit if not for _, f := range DirFilePaths { fpath := filepath.Clean(f) - if _, err := os.Stat(fpath); os.IsNotExist(err) { + s, err := os.Stat(fpath) + if os.IsNotExist(err) { fmt.Println("file or directory does not exist: " + fpath) os.Exit(1) } + + if s.IsDir() { + dirPaths = append(dirPaths, fpath) + } else { + filePaths = append(filePaths, fpath) + } } SortBy = strings.ToLower(SortBy) - if Debug { - printDebug(fmt.Sprintf("NumCPU: %d", runtime.NumCPU())) - printDebug(fmt.Sprintf("SortBy: %s", SortBy)) - printDebug(fmt.Sprintf("PathDenyList: %v", PathDenyList)) - } + printDebug(fmt.Sprintf("NumCPU: %d", runtime.NumCPU())) + printDebug(fmt.Sprintf("SortBy: %s", SortBy)) + printDebug(fmt.Sprintf("PathDenyList: %v", PathDenyList)) + + potentialFilesQueue := make(chan *gocodewalker.File, FileListQueueSize) // files that pass the .gitignore checks + fileListQueue := make(chan *FileJob, FileListQueueSize) // Files ready to be read from disk + fileSummaryJobQueue := make(chan *FileJob, FileSummaryJobQueueSize) // Files ready to be summarised - fileListQueue := make(chan *FileJob, FileListQueueSize) // Files ready to be read from disk - fileSummaryJobQueue := make(chan *FileJob, FileSummaryJobQueueSize) // Files ready to be summarised + fileWalker := gocodewalker.NewParallelFileWalker(dirPaths, potentialFilesQueue) + fileWalker.SetErrorHandler(func(e error) bool { + printError(e.Error()) + return true + }) + fileWalker.IgnoreGitIgnore = GitIgnore + fileWalker.IgnoreIgnoreFile = Ignore + fileWalker.IncludeHidden = true go func() { - directoryWalker := NewDirectoryWalker(fileListQueue) + err := fileWalker.Start() + if err != nil { + printError(err.Error()) + } + }() - for _, f := range DirFilePaths { - err := directoryWalker.Start(f) + go func() { + for _, f := range filePaths { + fileInfo, err := os.Lstat(f) if err != nil { - fmt.Printf("failed to walk %s: %v", f, err) - os.Exit(1) + continue + } + + fileJob := newFileJob(f, f, fileInfo) + if fileJob != nil { + fileListQueue <- fileJob } } - directoryWalker.Run() + for fi := range potentialFilesQueue { + fileInfo, err := os.Lstat(fi.Location) + if err != nil { + continue + } + + if !fileInfo.IsDir() { + fileJob := newFileJob(fi.Location, fi.Filename, fileInfo) + if fileJob != nil { + fileListQueue <- fileJob + } + } + } + close(fileListQueue) }() + go fileProcessorWorker(fileListQueue, fileSummaryJobQueue) result := fileSummarize(fileSummaryJobQueue) - if FileOutput == "" { fmt.Println(result) } else { diff --git a/test-all.sh b/test-all.sh index 66723b80..de1eaf47 100755 --- a/test-all.sh +++ b/test-all.sh @@ -254,15 +254,6 @@ else exit fi -if ./scc -v . | grep -q "skipping directory due to ignore: vendor" ; then - echo -e "${GREEN}PASSED ignore file directory check" -else - echo -e "${RED}=======================================================" - echo -e "FAILED ignore file directory check" - echo -e "=======================================================${NC}" - exit -fi - # Try out duplicates for i in {1..100} do @@ -602,15 +593,6 @@ else exit fi -if ./scc ./examples/issue149/ | grep -q "gitignore"; then - echo -e "${GREEN}PASSED empty gitignore" -else - echo -e "${RED}=======================================================" - echo -e "FAILED empty gitignore" - echo -e "=======================================================${NC}" - exit -fi - if ./scc -i css ./examples/issue152/ | grep -q "CSS"; then echo -e "${GREEN}PASSED -i extension check" else diff --git a/vendor/github.com/boyter/gocodewalker/.gitignore b/vendor/github.com/boyter/gocodewalker/.gitignore new file mode 100644 index 00000000..eb240298 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/.gitignore @@ -0,0 +1,18 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +.idea +dist/ diff --git a/vendor/github.com/boyter/gocodewalker/.goreleaser.yml b/vendor/github.com/boyter/gocodewalker/.goreleaser.yml new file mode 100644 index 00000000..6f8696c7 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/.goreleaser.yml @@ -0,0 +1,32 @@ +# This is an example .goreleaser.yml file with some sensible defaults. +# Make sure to check the documentation at https://goreleaser.com +before: + hooks: + # You may remove this if you don't use go modules. + - go mod tidy + # you may remove this if you don't need go generate + - go generate ./... +builds: + - env: + - CGO_ENABLED=0 + goos: + - linux + - windows + - darwin +archives: + - replacements: + darwin: Darwin + linux: Linux + windows: Windows + 386: i386 + amd64: x86_64 +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ incpatch .Version }}-next" +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' diff --git a/vendor/github.com/boyter/gocodewalker/.ignore b/vendor/github.com/boyter/gocodewalker/.ignore new file mode 100644 index 00000000..5ef06f7a --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/.ignore @@ -0,0 +1,2 @@ +/ +go-gitignore \ No newline at end of file diff --git a/vendor/github.com/boyter/gocodewalker/LICENSE b/vendor/github.com/boyter/gocodewalker/LICENSE new file mode 100644 index 00000000..f3374c9a --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/LICENSE @@ -0,0 +1,7 @@ +MIT License Copyright (c) 2021 Ben Boyter + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/boyter/gocodewalker/README.md b/vendor/github.com/boyter/gocodewalker/README.md new file mode 100644 index 00000000..a52c1aa2 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/README.md @@ -0,0 +1,110 @@ +# gocodewalker + +[![Go Report Card](https://goreportcard.com/badge/github.com/boyter/gocodewalker)](https://goreportcard.com/report/github.com/boyter/gocodewalker) +[![Str Count Badge](https://sloc.xyz/github/boyter/gocodewalker/)](https://github.com/boyter/gocodewalker/) + +Library to help with walking of code directories in Go. + +The problem. You want to walk the directories of a code repository. You want to respect .gitignore and .ignore files, and +some are nested. This library is the answer. + + - Designed to walk code repositories or find the root of them. + - By default, respects both .gitignore and .ignore files (can be disabled) and nested ones for accuracy + - Has configurable options for skipping files based on regex, extension or general match + - Uses readdir to provide as fast as possible file walking + +NB this was moved from go-code-walker due to the name being annoying and to ensure it has a unique package name. Should still be drop in replaceable +so long as you refer to the new package name. + +https://pkg.go.dev/github.com/boyter/gocodewalker + +Package provides file operations specific to code repositories such as walking the file tree obeying .ignore and .gitignore files +or looking for the root directory assuming already in a git project. + +Example of usage, + +```go +fileListQueue := make(chan *gocodewalker.File, 100) + +fileWalker := gocodewalker.NewFileWalker(".", fileListQueue) + +// restrict to only process files that have the .go extension +fileWalker.AllowListExtensions = append(fileWalker.AllowListExtensions, "go") + +// handle the errors by printing them out and then ignore +errorHandler := func(e error) bool { + fmt.Println("ERR", e.Error()) + return true +} +fileWalker.SetErrorHandler(errorHandler) + +go fileWalker.Start() + +for f := range fileListQueue { + fmt.Println(f.Location) +} +``` + +The above by default will recursively add files to the fileListQueue respecting both .ignore and .gitignore files if found, and +only adding files with the go extension into the queue. + +You can also run the walker in parallel with the results intermixed if required, + +```go +fileListQueue := make(chan *gocodewalker.File, 100) + +fileWalker := gocodewalker.NewParallelFileWalker([]string{".", "someotherdir"}, fileListQueue) +go fileWalker.Start() + +for f := range fileListQueue { + fmt.Println(f.Location) +} +``` + +All code is dual-licenced as either MIT or Unlicence. + +### Error Handler + +You can supply your own error handler when walking. This allows you to perform an action when there is an error +and decide if the walker should continue to process, or return. + +The simplest handler is the below, which if set will swallow all errors and continue as best it can. + +```go +errorHandler := func(e error) bool { + return true +} +fileWalker.SetErrorHandler(errorHandler) +``` + +If you wanted to return on errors you could use the following. + +```go +errorHandler := func(e error) bool { + return false +} +fileWalker.SetErrorHandler(errorHandler) +``` + +If you wanted to terminate walking on an error you could use the following, which would cause it to return the error, +and then terminate all walking. This might be desirable where any error indicates a total failure. + +```go +errorHandler := func(e error) bool { + fileWalker.Terminate() + return false +} +fileWalker.SetErrorHandler(errorHandler) +``` + +### Testing + +Done through unit/integration tests. Otherwise see https://github.com/svent/gitignore-test + +See `./cmd/gocodewalker/main.go` for an example of how to implement and validate + +### Info + +Details on how gitignores work + +https://stackoverflow.com/questions/71735516/proper-way-to-setup-multiple-gitignore-files-in-nested-folders-of-a-repository diff --git a/vendor/github.com/boyter/gocodewalker/UNLICENSE b/vendor/github.com/boyter/gocodewalker/UNLICENSE new file mode 100644 index 00000000..00d2e135 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/UNLICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to \ No newline at end of file diff --git a/vendor/github.com/boyter/gocodewalker/check.sh b/vendor/github.com/boyter/gocodewalker/check.sh new file mode 100644 index 00000000..22355698 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/check.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +# SPDX-License-Identifier: MIT OR Unlicense + +set -e + +if [ -t 1 ] +then + YELLOW='\033[0;33m' + GREEN='\033[0;32m' + RED='\033[0;31m' + NC='\033[0m' +fi + +yellow() { printf "${YELLOW}%s${NC}" "$*"; } +green() { printf "${GREEN}%s${NC}" "$*"; } +red() { printf "${RED}%s${NC}" "$*"; } + +good() { + echo "$(green "● success:")" "$@" +} + +bad() { + ret=$1 + shift + echo "$(red "● failed:")" "$@" + exit $ret +} + +try() { + "$@" || bad $? "$@" && good "$@" +} + + +echo "Running go fmt..." +gofmt -s -w ./.. + +echo "Running unit tests..." +go test -cover -race ./... || exit + +{ + { + opt='shopt -s extglob nullglob' + gofmt='gofmt -s -w -l !(vendor)/ *.go' + notice=" running: ( $opt; $gofmt; )" + prefix=" $(yellow modified)" + trap 'echo "$notice"; $opt; $gofmt | sed -e "s#^#$prefix #g"' EXIT + } + + # comma separate linters (e.g. "gofmt,stylecheck") + additional_linters="gofmt" + try golangci-lint run --enable $additional_linters ./... + trap '' EXIT +} + +echo "Running fuzz tests..." +go test -fuzz=FuzzTestGitIgnore -fuzztime 30s + +echo -e "${GREEN}=================================================" +echo -e "ALL CHECKS PASSED" +echo -e "=================================================${NC}" diff --git a/vendor/github.com/boyter/gocodewalker/file.go b/vendor/github.com/boyter/gocodewalker/file.go new file mode 100644 index 00000000..1af5ba85 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/file.go @@ -0,0 +1,571 @@ +// Package file provides file operations specific to code repositories +// such as walking the file tree obeying .ignore and .gitignore files +// or looking for the root directory assuming already in a git project + +// SPDX-License-Identifier: MIT OR Unlicense + +package gocodewalker + +import ( + "bytes" + "errors" + "github.com/boyter/gocodewalker/go-gitignore" + "golang.org/x/sync/errgroup" + "os" + "path" + "path/filepath" + "regexp" + "strings" + "sync" +) + +const ( + GitIgnore = ".gitignore" + Ignore = ".ignore" +) + +// ErrTerminateWalk error which indicates that the walker was terminated +var ErrTerminateWalk = errors.New("gocodewalker terminated") + +// File is a struct returned which contains the location and the filename of the file that passed all exclusion rules +type File struct { + Location string + Filename string +} + +type FileWalker struct { + fileListQueue chan *File + errorsHandler func(error) bool // If returns true will continue to process where possible, otherwise returns if possible + directory string + directories []string + LocationExcludePattern []string // Case-sensitive patterns which exclude directory/file matches + IncludeDirectory []string + ExcludeDirectory []string // Paths to always ignore such as .git,.svn and .hg + IncludeFilename []string + ExcludeFilename []string + IncludeDirectoryRegex []*regexp.Regexp // Must match regex as logical OR IE can match any of them + ExcludeDirectoryRegex []*regexp.Regexp + IncludeFilenameRegex []*regexp.Regexp + ExcludeFilenameRegex []*regexp.Regexp + AllowListExtensions []string // Which extensions should be allowed case sensitive + ExcludeListExtensions []string // Which extensions should be excluded case sensitive + walkMutex sync.Mutex + terminateWalking bool + isWalking bool + IgnoreIgnoreFile bool // Should .ignore files be respected? + IgnoreGitIgnore bool // Should .gitignore files be respected? + IncludeHidden bool // Should hidden files and directories be included/walked + osOpen func(name string) (*os.File, error) + osReadFile func(name string) ([]byte, error) +} + +// NewFileWalker constructs a filewalker, which will walk the supplied directory +// and output File results to the supplied queue as it finds them +func NewFileWalker(directory string, fileListQueue chan *File) *FileWalker { + return &FileWalker{ + fileListQueue: fileListQueue, + errorsHandler: func(e error) bool { return true }, // a generic one that just swallows everything + directory: directory, + LocationExcludePattern: nil, + IncludeDirectory: nil, + ExcludeDirectory: nil, + IncludeFilename: nil, + ExcludeFilename: nil, + IncludeDirectoryRegex: nil, + ExcludeDirectoryRegex: nil, + IncludeFilenameRegex: nil, + ExcludeFilenameRegex: nil, + AllowListExtensions: nil, + ExcludeListExtensions: nil, + walkMutex: sync.Mutex{}, + terminateWalking: false, + isWalking: false, + IgnoreIgnoreFile: false, + IgnoreGitIgnore: false, + IncludeHidden: false, + osOpen: os.Open, + osReadFile: os.ReadFile, + } +} + +// NewParallelFileWalker constructs a filewalker, which will walk the supplied directories in parallel +// and output File results to the supplied queue as it finds them +func NewParallelFileWalker(directories []string, fileListQueue chan *File) *FileWalker { + return &FileWalker{ + fileListQueue: fileListQueue, + errorsHandler: func(e error) bool { return true }, // a generic one that just swallows everything + directories: directories, + LocationExcludePattern: nil, + IncludeDirectory: nil, + ExcludeDirectory: nil, + IncludeFilename: nil, + ExcludeFilename: nil, + IncludeDirectoryRegex: nil, + ExcludeDirectoryRegex: nil, + IncludeFilenameRegex: nil, + ExcludeFilenameRegex: nil, + AllowListExtensions: nil, + ExcludeListExtensions: nil, + walkMutex: sync.Mutex{}, + terminateWalking: false, + isWalking: false, + IgnoreIgnoreFile: false, + IgnoreGitIgnore: false, + IncludeHidden: false, + osOpen: os.Open, + osReadFile: os.ReadFile, + } +} + +// Walking gets the state of the file walker and determine +// if we are walking or not +func (f *FileWalker) Walking() bool { + f.walkMutex.Lock() + defer f.walkMutex.Unlock() + return f.isWalking +} + +// Terminate have the walker break out of walking and return as +// soon as it possibly can. This is needed because +// this walker needs to work in a TUI interactive mode and +// as such we need to be able to end old processes +func (f *FileWalker) Terminate() { + f.walkMutex.Lock() + defer f.walkMutex.Unlock() + f.terminateWalking = true +} + +// SetErrorHandler sets the function that is called on processing any error +// where if you return true it will attempt to continue processing, and if false +// will return the error instantly +func (f *FileWalker) SetErrorHandler(errors func(error) bool) { + if errors != nil { + f.errorsHandler = errors + } +} + +// Start will start walking the supplied directory with the supplied settings +// and putting files that mach into the supplied channel. +// Returns usual ioutil errors if there is a file issue +// and a ErrTerminateWalk if terminate is called while walking +func (f *FileWalker) Start() error { + f.walkMutex.Lock() + f.isWalking = true + f.walkMutex.Unlock() + + var err error + if len(f.directories) != 0 { + eg := errgroup.Group{} + for _, directory := range f.directories { + eg.Go(func() error { + return f.walkDirectoryRecursive(directory, []gitignore.GitIgnore{}, []gitignore.GitIgnore{}) + }) + } + + err = eg.Wait() + } else { + if f.directory != "" { + err = f.walkDirectoryRecursive(f.directory, []gitignore.GitIgnore{}, []gitignore.GitIgnore{}) + } + } + + close(f.fileListQueue) + + f.walkMutex.Lock() + f.isWalking = false + f.walkMutex.Unlock() + + return err +} + +func (f *FileWalker) walkDirectoryRecursive(directory string, gitignores []gitignore.GitIgnore, ignores []gitignore.GitIgnore) error { + // NB have to call unlock not using defer because method is recursive + // and will deadlock if not done manually + f.walkMutex.Lock() + if f.terminateWalking { + f.walkMutex.Unlock() + return ErrTerminateWalk + } + f.walkMutex.Unlock() + + d, err := f.osOpen(directory) + if err != nil { + // nothing we can do with this so return nil and process as best we can + if f.errorsHandler(err) { + return nil + } + return err + } + defer d.Close() + + foundFiles, err := d.Readdir(-1) + if err != nil { + // nothing we can do with this so return nil and process as best we can + if f.errorsHandler(err) { + return nil + } + return err + } + + files := []os.FileInfo{} + dirs := []os.FileInfo{} + + // We want to break apart the files and directories from the + // return as we loop over them differently and this avoids some + // nested if logic at the expense of a "redundant" loop + for _, file := range foundFiles { + if file.IsDir() { + dirs = append(dirs, file) + } else { + files = append(files, file) + } + } + + // Pull out all ignore and gitignore files and add them + // to out collection of gitignores to be applied for this pass + // and any subdirectories + // Since they can apply to the current list of files we need to ensure + // we do this before processing files themselves + for _, file := range files { + if !f.IgnoreGitIgnore { + if file.Name() == GitIgnore { + c, err := f.osReadFile(filepath.Join(directory, file.Name())) + if err != nil { + if f.errorsHandler(err) { + continue // if asked to ignore it lets continue + } + return err + } + + abs, err := filepath.Abs(directory) + if err != nil { + if f.errorsHandler(err) { + continue // if asked to ignore it lets continue + } + return err + } + + gitIgnore := gitignore.New(bytes.NewReader(c), abs, nil) + gitignores = append(gitignores, gitIgnore) + } + } + + if !f.IgnoreIgnoreFile { + if file.Name() == Ignore { + c, err := f.osReadFile(filepath.Join(directory, file.Name())) + if err != nil { + if f.errorsHandler(err) { + continue // if asked to ignore it lets continue + } + return err + } + + abs, err := filepath.Abs(directory) + if err != nil { + if f.errorsHandler(err) { + continue // if asked to ignore it lets continue + } + return err + } + + gitIgnore := gitignore.New(bytes.NewReader(c), abs, nil) + ignores = append(ignores, gitIgnore) + } + } + } + + // Process files first to start feeding whatever process is consuming + // the output before traversing into directories for more files + for _, file := range files { + shouldIgnore := false + joined := filepath.Join(directory, file.Name()) + + for _, ignore := range gitignores { + // we have the following situations + // 1. none of the gitignores match + // 2. one or more match + // for #1 this means we should include the file + // for #2 this means the last one wins since it should be the most correct + if ignore.MatchIsDir(joined, false) != nil { + shouldIgnore = ignore.Ignore(joined) + } + } + + for _, ignore := range ignores { + // same rules as above + if ignore.MatchIsDir(joined, false) != nil { + shouldIgnore = ignore.Ignore(joined) + } + } + + if len(f.IncludeFilename) != 0 { + // include files + found := false + for _, allow := range f.IncludeFilename { + if file.Name() == allow { + found = true + } + } + if !found { + shouldIgnore = true + } + } + // Exclude comes after include as it takes precedence + for _, deny := range f.ExcludeFilename { + if file.Name() == deny { + shouldIgnore = true + } + } + + if len(f.IncludeFilenameRegex) != 0 { + found := false + for _, allow := range f.IncludeFilenameRegex { + if allow.Match([]byte(file.Name())) { + found = true + } + } + if !found { + shouldIgnore = true + } + } + // Exclude comes after include as it takes precedence + for _, deny := range f.ExcludeFilenameRegex { + if deny.Match([]byte(file.Name())) { + shouldIgnore = true + } + } + + // Ignore hidden files + if !f.IncludeHidden { + s, err := IsHidden(file, directory) + if err != nil { + if !f.errorsHandler(err) { + return err + } + } + + if s { + shouldIgnore = true + } + } + + // Check against extensions + if len(f.AllowListExtensions) != 0 { + ext := GetExtension(file.Name()) + + a := false + for _, v := range f.AllowListExtensions { + if v == ext { + a = true + } + } + + // try again because we could have one of those pesky ones such as something.spec.tsx + // but only if we didn't already find something to save on a bit of processing + if !a { + ext = GetExtension(ext) + for _, v := range f.AllowListExtensions { + if v == ext { + a = true + } + } + } + + if !a { + shouldIgnore = true + } + } + + for _, deny := range f.ExcludeListExtensions { + ext := GetExtension(file.Name()) + if ext == deny { + shouldIgnore = true + } + + if !shouldIgnore { + ext = GetExtension(ext) + if ext == deny { + shouldIgnore = true + } + } + } + + for _, p := range f.LocationExcludePattern { + if strings.Contains(joined, p) { + shouldIgnore = true + } + } + + if !shouldIgnore { + f.fileListQueue <- &File{ + Location: joined, + Filename: file.Name(), + } + } + } + + // Now we process the directories after hopefully giving the + // channel some files to process + for _, dir := range dirs { + var shouldIgnore bool + joined := filepath.Join(directory, dir.Name()) + + // Check against the ignore files we have if the file we are looking at + // should be ignored + // It is safe to always call this because the gitignores will not be added + // in previous steps + for _, ignore := range gitignores { + // we have the following situations + // 1. none of the gitignores match + // 2. one or more match + // for #1 this means we should include the file + // for #2 this means the last one wins since it should be the most correct + if ignore.MatchIsDir(joined, true) != nil { + shouldIgnore = ignore.Ignore(joined) + } + } + for _, ignore := range ignores { + // same rules as above + if ignore.MatchIsDir(joined, true) != nil { + shouldIgnore = ignore.Ignore(joined) + } + } + + // start by saying we didn't find it then check each possible + // choice to see if we did find it + // if we didn't find it then we should ignore + if len(f.IncludeDirectory) != 0 { + found := false + for _, allow := range f.IncludeDirectory { + if dir.Name() == allow { + found = true + } + } + if !found { + shouldIgnore = true + } + } + // Confirm if there are any files in the path deny list which usually includes + // things like .git .hg and .svn + // Comes after include as it takes precedence + for _, deny := range f.ExcludeDirectory { + if dir.Name() == deny { + shouldIgnore = true + } + } + + if len(f.IncludeDirectoryRegex) != 0 { + found := false + for _, allow := range f.IncludeDirectoryRegex { + if allow.Match([]byte(dir.Name())) { + found = true + } + } + if !found { + shouldIgnore = true + } + } + // Exclude comes after include as it takes precedence + for _, deny := range f.ExcludeDirectoryRegex { + if deny.Match([]byte(dir.Name())) { + shouldIgnore = true + } + } + + // Ignore hidden directories + if !f.IncludeHidden { + s, err := IsHidden(dir, directory) + if err != nil { + if !f.errorsHandler(err) { + return err + } + } + + if s { + shouldIgnore = true + } + } + + if !shouldIgnore { + for _, p := range f.LocationExcludePattern { + if strings.Contains(joined, p) { + shouldIgnore = true + } + } + + err = f.walkDirectoryRecursive(joined, gitignores, ignores) + if err != nil { + return err + } + } + } + + return nil +} + +// FindRepositoryRoot given the supplied directory backwards looking for .git or .hg +// directories indicating we should start our search from that +// location as it's the root. +// Returns the first directory below supplied with .git or .hg in it +// otherwise the supplied directory +func FindRepositoryRoot(startDirectory string) string { + // Firstly try to determine our real location + curdir, err := os.Getwd() + if err != nil { + return startDirectory + } + + // Check if we have .git or .hg where we are and if + // so just return because we are already there + if checkForGitOrMercurial(curdir) { + return startDirectory + } + + // We did not find something, so now we need to walk the file tree + // backwards in a cross platform way and if we find + // a match we return that + lastIndex := strings.LastIndex(curdir, string(os.PathSeparator)) + for lastIndex != -1 { + curdir = curdir[:lastIndex] + + if checkForGitOrMercurial(curdir) { + return curdir + } + + lastIndex = strings.LastIndex(curdir, string(os.PathSeparator)) + } + + // If we didn't find a good match return the supplied directory + // so that we start the search from where we started at least + // rather than the root + return startDirectory +} + +// Check if there is a .git or .hg folder in the supplied directory +func checkForGitOrMercurial(curdir string) bool { + if stat, err := os.Stat(filepath.Join(curdir, ".git")); err == nil && stat.IsDir() { + return true + } + + if stat, err := os.Stat(filepath.Join(curdir, ".hg")); err == nil && stat.IsDir() { + return true + } + + return false +} + +// GetExtension is a custom version of extracting extensions for a file +// which deals with extensions specific to code such as +// .travis.yml and the like +func GetExtension(name string) string { + name = strings.ToLower(name) + if !strings.Contains(name, ".") { + return name + } + + if strings.LastIndex(name, ".") == 0 { + return name + } + + return path.Ext(name)[1:] +} diff --git a/vendor/github.com/dbaggerman/cuba/LICENSE b/vendor/github.com/boyter/gocodewalker/go-gitignore/LICENSE similarity index 61% rename from vendor/github.com/dbaggerman/cuba/LICENSE rename to vendor/github.com/boyter/gocodewalker/go-gitignore/LICENSE index 4460111e..7c7d093d 100644 --- a/vendor/github.com/dbaggerman/cuba/LICENSE +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/LICENSE @@ -1,11 +1,13 @@ -Copyright 2019 David Baggerman +MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Copyright (c) 2016 Denormal Limited + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/README.md b/vendor/github.com/boyter/gocodewalker/go-gitignore/README.md new file mode 100644 index 00000000..b9acf36e --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/README.md @@ -0,0 +1,94 @@ +# go-gitignore + +Package `go-gitignore` provides an interface for parsing `.gitignore` files, +either individually, or within a repository, and +matching paths against the retrieved patterns. Path matching is done using +[fnmatch](https://github.com/danwakefield/fnmatch) as specified by +[git](https://git-scm.com/docs/gitignore), with +support for recursive matching via the `**` pattern. + +```go +import "github.com/denormal/go-gitignore" + +// match a file against a particular .gitignore +ignore, err := gitignore.NewFromFile("/my/.gitignore") +if err != nil { + panic(err) +} +match := ignore.Match("/my/file/to.check") +if match != nil { + if match.Ignore() { + return true + } +} + +// or match against a repository +// - here we match a directory path relative to the repository +ignore, err := gitignore.NewRepository( "/my/git/repository" ) +if err != nil { + panic(err) +} +match := ignore.Relative("src/examples", true) +if match != nil { + if match.Include() { + fmt.Printf( + "include src/examples/ because of pattern %q at %s", + match, match.Position(), + ) + } +} + +// if it's not important whether a path matches, but whether it is +// ignored or included... +if ignore.Ignore("src/test") { + fmt.Println("ignore src/test") +} else if ignore.Include("src/github.com") { + fmt.Println("include src/github.com") +} +``` + +For more information see `godoc github.com/denormal/go-gitignore`. + +## Patterns + +`go-gitignore` supports the same `.gitignore` pattern format and matching rules as defined by [git](https://git-scm.com/docs/gitignore): + +* A blank line matches no files, so it can serve as a separator for readability. + +* A line starting with `#` serves as a comment. Put a backslash `\` in front of the first hash for patterns that begin with a hash. + +* Trailing spaces are ignored unless they are quoted with backslash `\`. + +* An optional prefix `!` which negates the pattern; any matching file excluded by a previous pattern will become included again. It is not possible to re-include a file if a parent directory of that file is excluded. Git doesn’t list excluded directories for performance reasons, so any patterns on contained files have no effect, no matter where they are defined. Put a backslash `\` in front of the first `!` for patterns that begin with a literal `!`, for example, `\!important!.txt`. + +* If the pattern ends with a slash, it is removed for the purpose of the following description, but it would only find a match with a directory. In other words, `foo/` will match a directory foo and paths underneath it, but will not match a regular file or a symbolic link `foo` (this is consistent with the way how pathspec works in general in Git). + +* If the pattern does not contain a slash `/`, Git treats it as a shell glob pattern and checks for a match against the pathname relative to the location of the `.gitignore` file (relative to the toplevel of the work tree if not from a `.gitignore` file). + +* Otherwise, Git treats the pattern as a shell glob suitable for consumption by `fnmatch(3)` with the `FNM_PATHNAME` flag: wildcards in the pattern will not match a `/` in the pathname. For example, `Documentation/*.html` matches `Documentation/git.html` but not `Documentation/ppc/ppc.html` or `tools/perf/Documentation/perf.html`. + +* A leading slash matches the beginning of the pathname. For example, `/*.c` matches `cat-file.c` but not `mozilla-sha1/sha1.c`. + +Two consecutive asterisks `**` in patterns matched against full pathname may have special meaning: + +* A leading `**` followed by a slash means match in all directories. For example, `**/foo` matches file or directory `foo` anywhere, the same as pattern `foo`. `**/foo/bar` matches file or directory `bar` anywhere that is directly under directory `foo`. + +* A trailing `/**` matches everything inside. For example, `abc/**` matches all files inside directory `abc`, relative to the location of the `.gitignore` file, with infinite depth. + +* A slash followed by two consecutive asterisks then a slash matches zero or more directories. For example, `a/**/b` matches `a/b`, `a/x/b`, `a/x/y/b` and so on. + +* Other consecutive asterisks are considered invalid. + +## Installation + +`go-gitignore` can be installed using the standard Go approach: + +```go +go get github.com/denormal/go-gitignore +``` + +## License + +Copyright (c) 2016 Denormal Limited + +[MIT License](LICENSE) diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/cache.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/cache.go new file mode 100644 index 00000000..f66e352c --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/cache.go @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "sync" +) + +// Cache is the interface for the GitIgnore cache +type Cache interface { + // Set stores the GitIgnore ignore against its path. + Set(path string, ig GitIgnore) + + // Get attempts to retrieve an GitIgnore instance associated with the given + // path. If the path is not known nil is returned. + Get(path string) GitIgnore +} + +// cache is the default thread-safe cache implementation +type cache struct { + _i map[string]GitIgnore + _lock sync.Mutex +} + +// NewCache returns a Cache instance. This is a thread-safe, in-memory cache +// for GitIgnore instances. +func NewCache() Cache { + return &cache{} +} // Cache() + +// Set stores the GitIgnore ignore against its path. +func (c *cache) Set(path string, ignore GitIgnore) { + if ignore == nil { + return + } + + // ensure the map is defined + if c._i == nil { + c._i = make(map[string]GitIgnore) + } + + // set the cache item + c._lock.Lock() + c._i[path] = ignore + c._lock.Unlock() +} // Set() + +// Get attempts to retrieve an GitIgnore instance associated with the given +// path. If the path is not known nil is returned. +func (c *cache) Get(path string) GitIgnore { + c._lock.Lock() + _ignore, _ok := c._i[path] + c._lock.Unlock() + if _ok { + return _ignore + } else { + return nil + } +} // Get() + +// ensure cache supports the Cache interface +var _ Cache = &cache{} diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/doc.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/doc.go new file mode 100644 index 00000000..3882a8e4 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/doc.go @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT + +/* +Package gitignore provides an interface for parsing .gitignore files, +either individually, or within a repository, and +matching paths against the retrieved patterns. Path matching is done using +fnmatch as specified by git (see https://git-scm.com/docs/gitignore), with +support for recursive matching via the "**" pattern. +*/ +package gitignore diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/error.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/error.go new file mode 100644 index 00000000..7d94ffcf --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/error.go @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +type Error interface { + error + + // Position returns the position of the error within the .gitignore file + // (if any) + Position() Position + + // Underlying returns the underlying error, permitting direct comparison + // against the wrapped error. + Underlying() error +} + +type err struct { + error + _position Position +} // err() + +// NewError returns a new Error instance for the given error e and position p. +func NewError(e error, p Position) Error { + return &err{error: e, _position: p} +} // NewError() + +func (e *err) Position() Position { return e._position } + +func (e *err) Underlying() error { return e.error } + +// ensure err satisfies the Error interface +var _ Error = &err{} diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/errors.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/errors.go new file mode 100644 index 00000000..578baa57 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/errors.go @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "errors" +) + +var ( + CarriageReturnError = errors.New("unexpected carriage return '\\r'") + InvalidPatternError = errors.New("invalid pattern") + InvalidDirectoryError = errors.New("invalid directory") +) diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/exclude.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/exclude.go new file mode 100644 index 00000000..40180745 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/exclude.go @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "os" + "path/filepath" +) + +// exclude attempts to return the GitIgnore instance for the +// $GIT_DIR/info/exclude from the working copy to which path belongs. +func exclude(path string) (GitIgnore, error) { + // attempt to locate GIT_DIR + _gitdir := os.Getenv("GIT_DIR") + if _gitdir == "" { + _gitdir = filepath.Join(path, ".git") + } + _info, _err := os.Stat(_gitdir) + if _err != nil { + if os.IsNotExist(_err) { + return nil, nil + } else { + return nil, _err + } + } else if !_info.IsDir() { + return nil, nil + } + + // is there an info/exclude file within this directory? + _file := filepath.Join(_gitdir, "info", "exclude") + _, _err = os.Stat(_file) + if _err != nil { + if os.IsNotExist(_err) { + return nil, nil + } else { + return nil, _err + } + } + + // attempt to load the exclude file + return NewFromFile(_file) +} // exclude() diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/gitignore.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/gitignore.go new file mode 100644 index 00000000..52face7b --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/gitignore.go @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "io" + "os" + "path/filepath" + "runtime" + "strings" +) + +// use an empty GitIgnore for cached lookups +var empty = &ignore{} + +// GitIgnore is the interface to .gitignore files and repositories. It defines +// methods for testing files for matching the .gitignore file, and then +// determining whether a file should be ignored or included. +type GitIgnore interface { + // Base returns the directory containing the .gitignore file. + Base() string + + // Match attempts to match the path against this GitIgnore, and will + // return its Match if successful. Match will invoke the GitIgnore error + // handler (if defined) if it is not possible to determine the absolute + // path of the given path, or if its not possible to determine if the + // path represents a file or a directory. If an error occurs, Match + // returns nil and the error handler (if defined via New, NewWithErrors + // or NewWithCache) will be invoked. + Match(path string) Match + + MatchIsDir(path string, _isdir bool) Match + + // Absolute attempts to match an absolute path against this GitIgnore. If + // the path is not located under the base directory of this GitIgnore, or + // is not matched by this GitIgnore, nil is returned. + Absolute(string, bool) Match + + // Relative attempts to match a path relative to the GitIgnore base + // directory. isdir is used to indicate whether the path represents a file + // or a directory. If the path is not matched by the GitIgnore, nil is + // returned. + Relative(path string, isdir bool) Match + + // Ignore returns true if the path is ignored by this GitIgnore. Paths + // that are not matched by this GitIgnore are not ignored. Internally, + // Ignore uses Match, and will return false if Match() returns nil for path. + Ignore(path string) bool + + // Include returns true if the path is included by this GitIgnore. Paths + // that are not matched by this GitIgnore are always included. Internally, + // Include uses Match, and will return true if Match() returns nil for path. + Include(path string) bool +} + +// ignore is the implementation of a .gitignore file. +type ignore struct { + _base string + _pattern []Pattern + _errors func(Error) bool +} + +// NewGitIgnore creates a new GitIgnore instance from the patterns listed in t, +// representing a .gitignore file in the base directory. If errors is given, it +// will be invoked for every error encountered when parsing the .gitignore +// patterns. Parsing will terminate if errors is called and returns false, +// otherwise, parsing will continue until end of file has been reached. +func New(r io.Reader, base string, errors func(Error) bool) GitIgnore { + // do we have an error handler? + _errors := errors + if _errors == nil { + _errors = func(e Error) bool { return true } + } + + // extract the patterns from the reader + _parser := NewParser(r, _errors) + _patterns := _parser.Parse() + + return &ignore{_base: base, _pattern: _patterns, _errors: _errors} +} // New() + +// NewFromFile creates a GitIgnore instance from the given file. An error +// will be returned if file cannot be opened or its absolute path determined. +func NewFromFile(file string) (GitIgnore, error) { + // define an error handler to catch any file access errors + // - record the first encountered error + var _error Error + _errors := func(e Error) bool { + if _error == nil { + _error = e + } + return true + } + + // attempt to retrieve the GitIgnore represented by this file + _ignore := NewWithErrors(file, _errors) + + // did we encounter an error? + // - if the error has a zero Position then it was encountered + // before parsing was attempted, so we return that error + if _error != nil { + if _error.Position().Zero() { + return nil, _error.Underlying() + } + } + + // otherwise, we ignore the parser errors + return _ignore, nil +} // NewFromFile() + +// NewWithErrors creates a GitIgnore instance from the given file. +// If errors is given, it will be invoked for every error encountered when +// parsing the .gitignore patterns. Parsing will terminate if errors is called +// and returns false, otherwise, parsing will continue until end of file has +// been reached. NewWithErrors returns nil if the .gitignore could not be read. +func NewWithErrors(file string, errors func(Error) bool) GitIgnore { + var _err error + + // do we have an error handler? + _file := file + _errors := errors + if _errors == nil { + _errors = func(e Error) bool { return true } + } else { + // augment the error handler to include the .gitignore file name + // - we do this here since the parser and lexer interfaces are + // not aware of file names + _errors = func(e Error) bool { + // augment the position with the file name + _position := e.Position() + _position.File = _file + + // create a new error with the updated Position + _error := NewError(e.Underlying(), _position) + + // invoke the original error handler + return errors(_error) + } + } + + // we need the absolute path for the GitIgnore base + _file, _err = filepath.Abs(file) + if _err != nil { + _errors(NewError(_err, Position{})) + return nil + } + _base := filepath.Dir(_file) + + // attempt to open the ignore file to create the io.Reader + _fh, _err := os.Open(_file) + if _err != nil { + _errors(NewError(_err, Position{})) + return nil + } + + // return the GitIgnore instance + return New(_fh, _base, _errors) +} // NewWithErrors() + +// NewWithCache returns a GitIgnore instance (using NewWithErrors) +// for the given file. If the file has been loaded before, its GitIgnore +// instance will be returned from the cache rather than being reloaded. If +// cache is not defined, NewWithCache will behave as NewWithErrors +// +// If NewWithErrors returns nil, NewWithCache will store an empty +// GitIgnore (i.e. no patterns) against the file to prevent repeated parse +// attempts on subsequent requests for the same file. Subsequent calls to +// NewWithCache for a file that could not be loaded due to an error will +// return nil. +// +// If errors is given, it will be invoked for every error encountered when +// parsing the .gitignore patterns. Parsing will terminate if errors is called +// and returns false, otherwise, parsing will continue until end of file has +// been reached. +func NewWithCache(file string, cache Cache, errors func(Error) bool) GitIgnore { + // do we have an error handler? + _errors := errors + if _errors == nil { + _errors = func(e Error) bool { return true } + } + + // use the file absolute path as its key into the cache + _abs, _err := filepath.Abs(file) + if _err != nil { + _errors(NewError(_err, Position{})) + return nil + } + + var _ignore GitIgnore + if cache != nil { + _ignore = cache.Get(_abs) + } + if _ignore == nil { + _ignore = NewWithErrors(file, _errors) + if _ignore == nil { + // if the load failed, cache an empty GitIgnore to prevent + // further attempts to load this file + _ignore = empty + } + if cache != nil { + cache.Set(_abs, _ignore) + } + } + + // return the ignore (if we have it) + if _ignore == empty { + return nil + } else { + return _ignore + } +} // NewWithCache() + +// Base returns the directory containing the .gitignore file for this GitIgnore. +func (i *ignore) Base() string { + return i._base +} // Base() + +// Match attempts to match the path against this GitIgnore, and will +// return its Match if successful. Match will invoke the GitIgnore error +// handler (if defined) if it is not possible to determine the absolute +// path of the given path, or if its not possible to determine if the +// path represents a file or a directory. If an error occurs, Match +// returns nil and the error handler (if defined via New, NewWithErrors +// or NewWithCache) will be invoked. +func (i *ignore) Match(path string) Match { + // ensure we have the absolute path for the given file + _path, _err := filepath.Abs(path) + if _err != nil { + i._errors(NewError(_err, Position{})) + return nil + } + + // is the path a file or a directory? + _info, _err := os.Stat(_path) + if _err != nil { + i._errors(NewError(_err, Position{})) + return nil + } + _isdir := _info.IsDir() + + // attempt to match the absolute path + return i.Absolute(_path, _isdir) +} // Match() + +func (i *ignore) MatchIsDir(path string, _isdir bool) Match { + // ensure we have the absolute path for the given file + _path, _err := filepath.Abs(path) + if _err != nil { + i._errors(NewError(_err, Position{})) + return nil + } + + // attempt to match the absolute path + return i.Absolute(_path, _isdir) +} // Match() + +// Absolute attempts to match an absolute path against this GitIgnore. If +// the path is not located under the base directory of this GitIgnore, or +// is not matched by this GitIgnore, nil is returned. +func (i *ignore) Absolute(path string, isdir bool) Match { + // does the file share the same directory as this ignore file? + if !strings.HasPrefix(path, i._base) { + return nil + } + + // extract the relative path of this file + _prefix := len(i._base) + 1 // BOYTERWASHERE + //_prefix := len(i._base) + _rel := string(path[_prefix:]) + return i.Relative(_rel, isdir) +} // Absolute() + +// Relative attempts to match a path relative to the GitIgnore base +// directory. isdir is used to indicate whether the path represents a file +// or a directory. If the path is not matched by the GitIgnore, nil is +// returned. +func (i *ignore) Relative(path string, isdir bool) Match { + // if we are on Windows, then translate the path to Unix form + _rel := path + if runtime.GOOS == "windows" { + _rel = filepath.ToSlash(_rel) + } + + // iterate over the patterns for this ignore file + // - iterate in reverse, since later patterns overwrite earlier + for _i := len(i._pattern) - 1; _i >= 0; _i-- { + _pattern := i._pattern[_i] + if _pattern.Match(_rel, isdir) { + return _pattern + } + } + + // we don't match this file + return nil +} // Relative() + +// Ignore returns true if the path is ignored by this GitIgnore. Paths +// that are not matched by this GitIgnore are not ignored. Internally, +// Ignore uses Match, and will return false if Match() returns nil for path. +func (i *ignore) Ignore(path string) bool { + _match := i.Match(path) + if _match != nil { + return _match.Ignore() + } + + // we didn't match this path, so we don't ignore it + return false +} // Ignore() + +// Include returns true if the path is included by this GitIgnore. Paths +// that are not matched by this GitIgnore are always included. Internally, +// Include uses Match, and will return true if Match() returns nil for path. +func (i *ignore) Include(path string) bool { + _match := i.Match(path) + if _match != nil { + return _match.Include() + } + + // we didn't match this path, so we include it + return true +} // Include() + +// ensure Ignore satisfies the GitIgnore interface +var _ GitIgnore = &ignore{} diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/lexer.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/lexer.go new file mode 100644 index 00000000..03380383 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/lexer.go @@ -0,0 +1,476 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "bufio" + "io" +) + +// +// inspired by https://blog.gopheracademy.com/advent-2014/parsers-lexers/ +// + +// lexer is the implementation of the .gitignore lexical analyser +type lexer struct { + _r *bufio.Reader + _unread []rune + _offset int + _line int + _column int + _previous []int +} // lexer{} + +// Lexer is the interface to the lexical analyser for .gitignore files +type Lexer interface { + // Next returns the next Token from the Lexer reader. If an error is + // encountered, it will be returned as an Error instance, detailing the + // error and its position within the stream. + Next() (*Token, Error) + + // Position returns the current position of the Lexer. + Position() Position + + // String returns the string representation of the current position of the + // Lexer. + String() string +} + +// NewLexer returns a Lexer instance for the io.Reader r. +func NewLexer(r io.Reader) Lexer { + return &lexer{_r: bufio.NewReader(r), _line: 1, _column: 1} +} // NewLexer() + +// Next returns the next Token from the Lexer reader. If an error is +// encountered, it will be returned as an Error instance, detailing the error +// and its position within the stream. +func (l *lexer) Next() (*Token, Error) { + // are we at the beginning of the line? + _beginning := l.beginning() + + // read the next rune + _r, _err := l.read() + if _err != nil { + return nil, _err + } + + switch _r { + // end of file + case _EOF: + return l.token(EOF, nil, nil) + + // whitespace ' ', '\t' + case _SPACE: + fallthrough + case _TAB: + l.unread(_r) + _rtn, _err := l.whitespace() + return l.token(WHITESPACE, _rtn, _err) + + // end of line '\n' or '\r\n' + case _CR: + fallthrough + case _NEWLINE: + l.unread(_r) + _rtn, _err := l.eol() + return l.token(EOL, _rtn, _err) + + // separator '/' + case _SEPARATOR: + return l.token(SEPARATOR, []rune{_r}, nil) + + // '*' or any '**' + case _WILDCARD: + // is the wildcard followed by another wildcard? + // - does this represent the "any" token (i.e. "**") + _next, _err := l.peek() + if _err != nil { + return nil, _err + } else if _next == _WILDCARD { + // we know read() will succeed here since we used peek() above + _, _ = l.read() + return l.token(ANY, []rune{_WILDCARD, _WILDCARD}, nil) + } + + // we have a single wildcard, so treat this as a pattern + l.unread(_r) + _rtn, _err := l.pattern() + return l.token(PATTERN, _rtn, _err) + + // comment '#' + case _COMMENT: + l.unread(_r) + + // if we are at the start of the line, then we treat this as a comment + if _beginning { + _rtn, _err := l.comment() + return l.token(COMMENT, _rtn, _err) + } + + // otherwise, we regard this as a pattern + _rtn, _err := l.pattern() + return l.token(PATTERN, _rtn, _err) + + // negation '!' + case _NEGATION: + if _beginning { + return l.token(NEGATION, []rune{_r}, nil) + } + fallthrough + + // pattern + default: + l.unread(_r) + _rtn, _err := l.pattern() + return l.token(PATTERN, _rtn, _err) + } +} // Next() + +// Position returns the current position of the Lexer. +func (l *lexer) Position() Position { + return Position{"", l._line, l._column, l._offset} +} // Position() + +// String returns the string representation of the current position of the +// Lexer. +func (l *lexer) String() string { + return l.Position().String() +} // String() + +// +// private methods +// + +// read the next rune from the stream. Return an Error if there is a problem +// reading from the stream. If the end of stream is reached, return the EOF +// Token. +func (l *lexer) read() (rune, Error) { + var _r rune + var _err error + + // do we have any unread runes to read? + _length := len(l._unread) + if _length > 0 { + _r = l._unread[_length-1] + l._unread = l._unread[:_length-1] + + // otherwise, attempt to read a new rune + } else { + _r, _, _err = l._r.ReadRune() + if _err == io.EOF { + return _EOF, nil + } + } + + // increment the offset and column counts + l._offset++ + l._column++ + + return _r, l.err(_err) +} // read() + +// unread returns the given runes to the stream, making them eligible to be +// read again. The runes are returned in the order given, so the last rune +// specified will be the next rune read from the stream. +func (l *lexer) unread(r ...rune) { + // ignore EOF runes + _r := make([]rune, 0) + for _, _rune := range r { + if _rune != _EOF { + _r = append(_r, _rune) + } + } + + // initialise the unread rune list if necessary + if l._unread == nil { + l._unread = make([]rune, 0) + } + if len(_r) != 0 { + l._unread = append(l._unread, _r...) + } + + // decrement the offset and column counts + // - we have to take care of column being 0 + // - at present we can only unwind across a single line boundary + _length := len(_r) + for ; _length > 0; _length-- { + l._offset-- + if l._column == 1 { + _length := len(l._previous) + if _length > 0 { + l._column = l._previous[_length-1] + l._previous = l._previous[:_length-1] + l._line-- + } + } else { + l._column-- + } + } +} // unread() + +// peek returns the next rune in the stream without consuming it (i.e. it will +// be returned by the next call to read or peek). peek will return an error if +// there is a problem reading from the stream. +func (l *lexer) peek() (rune, Error) { + // read the next rune + _r, _err := l.read() + if _err != nil { + return _r, _err + } + + // unread & return the rune + l.unread(_r) + return _r, _err +} // peek() + +// newline adjusts the positional counters when an end of line is reached +func (l *lexer) newline() { + // adjust the counters for the new line + if l._previous == nil { + l._previous = make([]int, 0) + } + l._previous = append(l._previous, l._column) + l._column = 1 + l._line++ +} // newline() + +// comment reads all runes until a newline or end of file is reached. An +// error is returned if an error is encountered reading from the stream. +func (l *lexer) comment() ([]rune, Error) { + _comment := make([]rune, 0) + + // read until we reach end of line or end of file + // - as we are in a comment, we ignore escape characters + for { + _next, _err := l.read() + if _err != nil { + return _comment, _err + } + + // read until we have end of line or end of file + switch _next { + case _CR: + fallthrough + case _NEWLINE: + fallthrough + case _EOF: + // return the read run to the stream and stop + l.unread(_next) + return _comment, nil + } + + // otherwise, add this run to the comment + _comment = append(_comment, _next) + } +} // comment() + +// escape attempts to read an escape sequence (e.g. '\ ') form the input +// stream. An error will be returned if there is an error reading from the +// stream. escape returns just the escape rune if the following rune is either +// end of line or end of file (since .gitignore files do not support line +// continuations). +func (l *lexer) escape() ([]rune, Error) { + // attempt to process the escape sequence + _peek, _err := l.peek() + if _err != nil { + return nil, _err + } + + // what is the next rune after the escape? + switch _peek { + // are we at the end of the line or file? + // - we return just the escape rune + case _CR: + fallthrough + case _NEWLINE: + fallthrough + case _EOF: + return []rune{_ESCAPE}, nil + } + + // otherwise, return the escape and the next rune + // - we know read() will succeed here since we used peek() above + _, _ = l.read() + return []rune{_ESCAPE, _peek}, nil +} // escape() + +// eol returns all runes from the current position to the end of the line. An +// error is returned if there is a problem reading from the stream, or if a +// carriage return character '\r' is encountered that is not followed by a +// newline '\n'. +func (l *lexer) eol() ([]rune, Error) { + // read the to the end of the line + // - we should only be called here when we encounter an end of line + // sequence + _line := make([]rune, 0, 1) + + // loop until there's nothing more to do + for { + _next, _err := l.read() + if _err != nil { + return _line, _err + } + + // read until we have a newline or we're at end of file + switch _next { + // end of file + case _EOF: + return _line, nil + + // carriage return - we expect to see a newline next + case _CR: + _line = append(_line, _next) + _next, _err = l.read() + if _err != nil { + return _line, _err + } else if _next != _NEWLINE { + l.unread(_next) + return _line, l.err(CarriageReturnError) + } + fallthrough + + // newline + case _NEWLINE: + _line = append(_line, _next) + return _line, nil + } + } +} // eol() + +// whitespace returns all whitespace (i.e. ' ' and '\t') runes in a sequence, +// or an error if there is a problem reading the next runes. +func (l *lexer) whitespace() ([]rune, Error) { + // read until we hit the first non-whitespace rune + _ws := make([]rune, 0, 1) + + // loop until there's nothing more to do + for { + _next, _err := l.read() + if _err != nil { + return _ws, _err + } + + // what is this next rune? + switch _next { + // space or tab is consumed + case _SPACE: + fallthrough + case _TAB: + break + + // non-whitespace rune + default: + // return the rune to the buffer and we're done + l.unread(_next) + return _ws, nil + } + + // add this rune to the whitespace + _ws = append(_ws, _next) + } +} // whitespace() + +// pattern returns all runes representing a file or path pattern, delimited +// either by unescaped whitespace, a path separator '/' or enf of file. An +// error is returned if a problem is encountered reading from the stream. +func (l *lexer) pattern() ([]rune, Error) { + // read until we hit the first whitespace/end of line/eof rune + _pattern := make([]rune, 0, 1) + + // loop until there's nothing more to do + for { + _r, _err := l.read() + if _err != nil { + return _pattern, _err + } + + // what is the next rune? + switch _r { + // whitespace, newline, end of file, separator + // - this is the end of the pattern + case _SPACE: + fallthrough + case _TAB: + fallthrough + case _CR: + fallthrough + case _NEWLINE: + fallthrough + case _SEPARATOR: + fallthrough + case _EOF: + // return what we have + l.unread(_r) + return _pattern, nil + + // a wildcard is the end of the pattern if it is part of any '**' + case _WILDCARD: + _next, _err := l.peek() + if _err != nil { + return _pattern, _err + } else if _next == _WILDCARD { + l.unread(_r) + return _pattern, _err + } else { + _pattern = append(_pattern, _r) + } + + // escape sequence - consume the next rune + case _ESCAPE: + _escape, _err := l.escape() + if _err != nil { + return _pattern, _err + } + + // add the escape sequence as part of the pattern + _pattern = append(_pattern, _escape...) + + // any other character, we add to the pattern + default: + _pattern = append(_pattern, _r) + } + } +} // pattern() + +// token returns a Token instance of the given type_ represented by word runes. +func (l *lexer) token(type_ TokenType, word []rune, e Error) (*Token, Error) { + // if we have an error, then we return a BAD token + if e != nil { + type_ = BAD + } + + // extract the lexer position + // - the column is taken from the current column position + // minus the length of the consumed "word" + _word := len(word) + _column := l._column - _word + _offset := l._offset - _word + position := Position{"", l._line, _column, _offset} + + // if this is a newline token, we adjust the line & column counts + if type_ == EOL { + l.newline() + } + + // return the Token + return NewToken(type_, word, position), e +} // token() + +// err returns an Error encapsulating the error e and the current Lexer +// position. +func (l *lexer) err(e error) Error { + // do we have an error? + if e == nil { + return nil + } else { + return NewError(e, l.Position()) + } +} // err() + +// beginning returns true if the Lexer is at the start of a new line. +func (l *lexer) beginning() bool { + return l._column == 1 +} // beginning() + +// ensure the lexer conforms to the lexer interface +var _ Lexer = &lexer{} diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/match.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/match.go new file mode 100644 index 00000000..5871ede7 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/match.go @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +// Match represents the interface of successful matches against a .gitignore +// pattern set. A Match can be queried to determine whether the matched path +// should be ignored or included (i.e. was the path matched by a negated +// pattern), and to extract the position of the pattern within the .gitignore, +// and a string representation of the pattern. +type Match interface { + // Ignore returns true if the match pattern describes files or paths that + // should be ignored. + Ignore() bool + + // Include returns true if the match pattern describes files or paths that + // should be included. + Include() bool + + // String returns a string representation of the matched pattern. + String() string + + // Position returns the position in the .gitignore file at which the + // matching pattern was defined. + Position() Position +} diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/parser.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/parser.go new file mode 100644 index 00000000..09aa1073 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/parser.go @@ -0,0 +1,446 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "io" +) + +// Parser is the interface for parsing .gitignore files and extracting the set +// of patterns specified in the .gitignore file. +type Parser interface { + // Parse returns all well-formed .gitignore Patterns contained within the + // parser stream. Parsing will terminate at the end of the stream, or if + // the parser error handler returns false. + Parse() []Pattern + + // Next returns the next well-formed .gitignore Pattern from the parser + // stream. If an error is encountered, and the error handler is either + // not defined, or returns true, Next will skip to the end of the current + // line and attempt to parse the next Pattern. If the error handler + // returns false, or the parser reaches the end of the stream, Next + // returns nil. + Next() Pattern + + // Position returns the current position of the parser in the input stream. + Position() Position +} // Parser{} + +// parser is the implementation of the .gitignore parser +type parser struct { + _lexer Lexer + _undo []*Token + _error func(Error) bool +} // parser{} + +// NewParser returns a new Parser instance for the given stream r. +// If err is not nil, it will be called for every error encountered during +// parsing. Parsing will terminate at the end of the stream, or if err +// returns false. +func NewParser(r io.Reader, err func(Error) bool) Parser { + return &parser{_lexer: NewLexer(r), _error: err} +} // NewParser() + +// Parse returns all well-formed .gitignore Patterns contained within the +// parser stream. Parsing will terminate at the end of the stream, or if +// the parser error handler returns false. +func (p *parser) Parse() []Pattern { + // keep parsing until there's no more patterns + _patterns := make([]Pattern, 0) + for { + _pattern := p.Next() + if _pattern == nil { + return _patterns + } + _patterns = append(_patterns, _pattern) + } +} // Parse() + +// Next returns the next well-formed .gitignore Pattern from the parser stream. +// If an error is encountered, and the error handler is either not defined, or +// returns true, Next will skip to the end of the current line and attempt to +// parse the next Pattern. If the error handler returns false, or the parser +// reaches the end of the stream, Next returns nil. +func (p *parser) Next() Pattern { + // keep searching until we find the next pattern, or until we + // reach the end of the file + for { + _token, _err := p.next() + if _err != nil { + if !p.errors(_err) { + return nil + } + + // we got an error from the lexer, so skip the remainder + // of this line and try again from the next line + for _err != nil { + _err = p.skip() + if _err != nil { + if !p.errors(_err) { + return nil + } + } + } + continue + } + + switch _token.Type { + // we're at the end of the file + case EOF: + return nil + + // we have a blank line or comment + case EOL: + continue + case COMMENT: + continue + + // otherwise, attempt to build the next pattern + default: + _pattern, _err := p.build(_token) + if _err != nil { + if !p.errors(_err) { + return nil + } + + // we encountered an error parsing the retrieved tokens + // - skip to the end of the line + for _err != nil { + _err = p.skip() + if _err != nil { + if !p.errors(_err) { + return nil + } + } + } + + // skip to the next token + continue + } else if _pattern != nil { + return _pattern + } + } + } +} // Next() + +// Position returns the current position of the parser in the input stream. +func (p *parser) Position() Position { + // if we have any previously read tokens, then the token at + // the end of the "undo" list (most recently "undone") gives the + // position of the parser + _length := len(p._undo) + if _length != 0 { + return p._undo[_length-1].Position + } + + // otherwise, return the position of the lexer + return p._lexer.Position() +} // Position() + +// +// private methods +// + +// build attempts to build a well-formed .gitignore Pattern starting from the +// given Token t. An Error will be returned if the sequence of tokens returned +// by the Lexer does not represent a valid Pattern. +func (p *parser) build(t *Token) (Pattern, Error) { + // attempt to create a valid pattern + switch t.Type { + // we have a negated pattern + case NEGATION: + return p.negation(t) + + // attempt to build a path specification + default: + return p.path(t) + } +} // build() + +// negation attempts to build a well-formed negated .gitignore Pattern starting +// from the negation Token t. As with build, negation returns an Error if the +// sequence of tokens returned by the Lexer does not represent a valid Pattern. +func (p *parser) negation(t *Token) (Pattern, Error) { + // a negation appears before a path specification, so + // skip the negation token + _next, _err := p.next() + if _err != nil { + return nil, _err + } + + // extract the sequence of tokens for this path + _tokens, _err := p.sequence(_next) + if _err != nil { + return nil, _err + } + + // include the "negation" token at the front of the sequence + _tokens = append([]*Token{t}, _tokens...) + + // return the Pattern instance + return NewPattern(_tokens), nil +} // negation() + +// path attempts to build a well-formed .gitignore Pattern representing a path +// specification, starting with the Token t. If the sequence of tokens returned +// by the Lexer does not represent a valid Pattern, path returns an Error. +// Trailing whitespace is dropped from the sequence of pattern tokens. +func (p *parser) path(t *Token) (Pattern, Error) { + // extract the sequence of tokens for this path + _tokens, _err := p.sequence(t) + if _err != nil { + return nil, _err + } + + // remove trailing whitespace tokens + _length := len(_tokens) + for _length > 0 { + // if we have a non-whitespace token, we can stop + _length-- + if _tokens[_length].Type != WHITESPACE { + break + } + + // otherwise, truncate the token list + _tokens = _tokens[:_length] + } + + // return the Pattern instance + return NewPattern(_tokens), nil +} // path() + +// sequence attempts to extract a well-formed Token sequence from the Lexer +// representing a .gitignore Pattern. sequence returns an Error if the +// retrieved sequence of tokens does not represent a valid Pattern. +func (p *parser) sequence(t *Token) ([]*Token, Error) { + // extract the sequence of tokens for a valid path + // - this excludes the negation token, which is handled as + // a special case before sequence() is called + switch t.Type { + // the path starts with a separator + case SEPARATOR: + return p.separator(t) + + // the path starts with the "any" pattern ("**") + case ANY: + return p.any(t) + + // the path starts with whitespace, wildcard or a pattern + case WHITESPACE: + fallthrough + case PATTERN: + return p.pattern(t) + } + + // otherwise, we have an invalid specification + p.undo(t) + return nil, p.err(InvalidPatternError) +} // sequence() + +// separator attempts to retrieve a valid sequence of tokens that may appear +// after the path separator '/' Token t. An Error is returned if the sequence if +// tokens is not valid, or if there is an error extracting tokens from the +// input stream. +func (p *parser) separator(t *Token) ([]*Token, Error) { + // build a list of tokens that may appear after a separator + _tokens := []*Token{t} + _token, _err := p.next() + if _err != nil { + return _tokens, _err + } + + // what tokens are we allowed to have follow a separator? + switch _token.Type { + // a separator can be followed by a pattern or + // an "any" pattern (i.e. "**") + case ANY: + _next, _err := p.any(_token) + return append(_tokens, _next...), _err + + case WHITESPACE: + fallthrough + case PATTERN: + _next, _err := p.pattern(_token) + return append(_tokens, _next...), _err + + // if we encounter end of line or file we are done + case EOL: + fallthrough + case EOF: + return _tokens, nil + + // a separator can be followed by another separator + // - it's not ideal, and not very useful, but it's interpreted + // as a single separator + // - we could clean it up here, but instead we pass + // everything down to the matching later on + case SEPARATOR: + _next, _err := p.separator(_token) + return append(_tokens, _next...), _err + } + + // any other token is invalid + p.undo(_token) + return _tokens, p.err(InvalidPatternError) +} // separator() + +// any attempts to retrieve a valid sequence of tokens that may appear +// after the any '**' Token t. An Error is returned if the sequence if +// tokens is not valid, or if there is an error extracting tokens from the +// input stream. +func (p *parser) any(t *Token) ([]*Token, Error) { + // build the list of tokens that may appear after "any" (i.e. "**") + _tokens := []*Token{t} + _token, _err := p.next() + if _err != nil { + return _tokens, _err + } + + // what tokens are we allowed to have follow an "any" symbol? + switch _token.Type { + // an "any" token may only be followed by a separator + case SEPARATOR: + _next, _err := p.separator(_token) + return append(_tokens, _next...), _err + + // whitespace is acceptable if it takes us to the end of the line + case WHITESPACE: + return _tokens, p.eol() + + // if we encounter end of line or file we are done + case EOL: + fallthrough + case EOF: + return _tokens, nil + } + + // any other token is invalid + p.undo(_token) + return _tokens, p.err(InvalidPatternError) +} // any() + +// pattern attempts to retrieve a valid sequence of tokens that may appear +// after the path pattern Token t. An Error is returned if the sequence if +// tokens is not valid, or if there is an error extracting tokens from the +// input stream. +func (p *parser) pattern(t *Token) ([]*Token, Error) { + // build the list of tokens that may appear after a pattern + _tokens := []*Token{t} + _token, _err := p.next() + if _err != nil { + return _tokens, _err + } + + // what tokens are we allowed to have follow a pattern? + var _next []*Token + switch _token.Type { + case SEPARATOR: + _next, _err = p.separator(_token) + return append(_tokens, _next...), _err + + case WHITESPACE: + fallthrough + case PATTERN: + _next, _err = p.pattern(_token) + return append(_tokens, _next...), _err + + // if we encounter end of line or file we are done + case EOL: + fallthrough + case EOF: + return _tokens, nil + } + + // any other token is invalid + p.undo(_token) + return _tokens, p.err(InvalidPatternError) +} // pattern() + +// eol attempts to consume the next Lexer token to read the end of line or end +// of file. If a EOL or EOF is not reached , eol will return an error. +func (p *parser) eol() Error { + // are we at the end of the line? + _token, _err := p.next() + if _err != nil { + return _err + } + + // have we encountered whitespace only? + switch _token.Type { + // if we're at the end of the line or file, we're done + case EOL: + fallthrough + case EOF: + p.undo(_token) + return nil + } + + // otherwise, we have an invalid pattern + p.undo(_token) + return p.err(InvalidPatternError) +} // eol() + +// next returns the next token from the Lexer, or an error if there is a +// problem reading from the input stream. +func (p *parser) next() (*Token, Error) { + // do we have any previously read tokens? + _length := len(p._undo) + if _length > 0 { + _token := p._undo[_length-1] + p._undo = p._undo[:_length-1] + return _token, nil + } + + // otherwise, attempt to retrieve the next token from the lexer + return p._lexer.Next() +} // next() + +// skip reads Tokens from the input until the end of line or end of file is +// reached. If there is a problem reading tokens, an Error is returned. +func (p *parser) skip() Error { + // skip to the next end of line or end of file token + for { + _token, _err := p.next() + if _err != nil { + return _err + } + + // if we have an end of line or file token, then we can stop + switch _token.Type { + case EOL: + fallthrough + case EOF: + return nil + } + } +} // skip() + +// undo returns the given Token t to the parser input stream to be retrieved +// again on a subsequent call to next. +func (p *parser) undo(t *Token) { + // add this token to the list of previously read tokens + // - initialise the undo list if required + if p._undo == nil { + p._undo = make([]*Token, 0, 1) + } + p._undo = append(p._undo, t) +} // undo() + +// err returns an Error for the error e, capturing the current parser Position. +func (p *parser) err(e error) Error { + // convert the error to include the parser position + return NewError(e, p.Position()) +} // err() + +// errors returns the response from the parser error handler to the Error e. If +// no error handler has been configured for this parser, errors returns true. +func (p *parser) errors(e Error) bool { + // do we have an error handler? + if p._error == nil { + return true + } + + // pass the error through to the error handler + // - if this returns false, parsing will stop + return p._error(e) +} // errors() diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/pattern.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/pattern.go new file mode 100644 index 00000000..41dfe9d7 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/pattern.go @@ -0,0 +1,288 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "path/filepath" + "strings" + + "github.com/danwakefield/fnmatch" +) + +// Pattern represents per-line patterns within a .gitignore file +type Pattern interface { + Match + + // Match returns true if the given path matches the name pattern. If the + // pattern is meant for directories only, and the path is not a directory, + // Match will return false. The matching is performed by fnmatch(). It + // is assumed path is relative to the base path of the owning GitIgnore. + Match(string, bool) bool +} + +// pattern is the base implementation of a .gitignore pattern +type pattern struct { + _negated bool + _anchored bool + _directory bool + _string string + _fnmatch string + _position Position +} // pattern() + +// name represents patterns matching a file or path name (i.e. the last +// component of a path) +type name struct { + pattern +} // name{} + +// path represents a pattern that contains at least one path separator within +// the pattern (i.e. not at the start or end of the pattern) +type path struct { + pattern + _depth int +} // path{} + +// any represents a pattern that contains at least one "any" token "**" +// allowing for recursive matching. +type any struct { + pattern + _tokens []*Token +} // any{} + +// NewPattern returns a Pattern from the ordered slice of Tokens. The tokens are +// assumed to represent a well-formed .gitignore pattern. A Pattern may be +// negated, anchored to the start of the path (relative to the base directory +// of tie containing .gitignore), or match directories only. +func NewPattern(tokens []*Token) Pattern { + // if we have no tokens there is no pattern + if len(tokens) == 0 { + return nil + } + + // extract the pattern position from first token + _position := tokens[0].Position + _string := tokenset(tokens).String() + + // is this a negated pattern? + _negated := false + if tokens[0].Type == NEGATION { + _negated = true + tokens = tokens[1:] + } + + // is this pattern anchored to the start of the path? + _anchored := false + if tokens[0].Type == SEPARATOR { + _anchored = true + tokens = tokens[1:] + } + + // is this pattern for directories only? + _directory := false + _last := len(tokens) - 1 + if len(tokens) != 0 { + if tokens[_last].Type == SEPARATOR { + _directory = true + tokens = tokens[:_last] + } + } + + // build the pattern expression + _fnmatch := tokenset(tokens).String() + _pattern := &pattern{ + _negated: _negated, + _anchored: _anchored, + _position: _position, + _directory: _directory, + _string: _string, + _fnmatch: _fnmatch, + } + return _pattern.compile(tokens) +} // NewPattern() + +// compile generates a specific Pattern (i.e. name, path or any) +// represented by the list of tokens. +func (p *pattern) compile(tokens []*Token) Pattern { + // what tokens do we have in this pattern? + // - ANY token means we can match to any depth + // - SEPARATOR means we have path rather than file matching + _separator := false + for _, _token := range tokens { + switch _token.Type { + case ANY: + return p.any(tokens) + case SEPARATOR: + _separator = true + } + } + + // should we perform path or name/file matching? + if _separator { + return p.path(tokens) + } else { + return p.name(tokens) + } +} // compile() + +// Ignore returns true if the pattern describes files or paths that should be +// ignored. +func (p *pattern) Ignore() bool { return !p._negated } + +// Include returns true if the pattern describes files or paths that should be +// included (i.e. not ignored) +func (p *pattern) Include() bool { return p._negated } + +// Position returns the position of the first token of this pattern. +func (p *pattern) Position() Position { return p._position } + +// String returns the string representation of the pattern. +func (p *pattern) String() string { return p._string } + +// +// name patterns +// - designed to match trailing file/directory names only +// + +// name returns a Pattern designed to match file or directory names, with no +// path elements. +func (p *pattern) name(tokens []*Token) Pattern { + return &name{*p} +} // name() + +// Match returns true if the given path matches the name pattern. If the +// pattern is meant for directories only, and the path is not a directory, +// Match will return false. The matching is performed by fnmatch(). It +// is assumed path is relative to the base path of the owning GitIgnore. +func (n *name) Match(path string, isdir bool) bool { + // are we expecting a directory? + if n._directory && !isdir { + return false + } + + // should we match the whole path, or just the last component? + if n._anchored { + return fnmatch.Match(n._fnmatch, path, 0) + } else { + _, _base := filepath.Split(path) + return fnmatch.Match(n._fnmatch, _base, 0) + } +} // Match() + +// +// path patterns +// - designed to match complete or partial paths (not just filenames) +// + +// path returns a Pattern designed to match paths that include at least one +// path separator '/' neither at the end nor the start of the pattern. +func (p *pattern) path(tokens []*Token) Pattern { + // how many directory components are we expecting? + _depth := 0 + for _, _token := range tokens { + if _token.Type == SEPARATOR { + _depth++ + } + } + + // return the pattern instance + return &path{pattern: *p, _depth: _depth} +} // path() + +// Match returns true if the given path matches the path pattern. If the +// pattern is meant for directories only, and the path is not a directory, +// Match will return false. The matching is performed by fnmatch() +// with flags set to FNM_PATHNAME. It is assumed path is relative to the +// base path of the owning GitIgnore. +func (p *path) Match(path string, isdir bool) bool { + // are we expecting a directory + if p._directory && !isdir { + return false + } + + if fnmatch.Match(p._fnmatch, path, fnmatch.FNM_PATHNAME) { + return true + } else if p._anchored { + return false + } + + // match against the trailing path elements + return fnmatch.Match(p._fnmatch, path, fnmatch.FNM_PATHNAME) +} // Match() + +// +// "any" patterns +// + +// any returns a Pattern designed to match paths that include at least one +// any pattern '**', specifying recursive matching. +func (p *pattern) any(tokens []*Token) Pattern { + // consider only the non-SEPARATOR tokens, as these will be matched + // against the path components + _tokens := make([]*Token, 0) + for _, _token := range tokens { + if _token.Type != SEPARATOR { + _tokens = append(_tokens, _token) + } + } + + return &any{*p, _tokens} +} // any() + +// Match returns true if the given path matches the any pattern. If the +// pattern is meant for directories only, and the path is not a directory, +// Match will return false. The matching is performed by recursively applying +// fnmatch() with flags set to FNM_PATHNAME. It is assumed path is relative to +// the base path of the owning GitIgnore. +func (a *any) Match(path string, isdir bool) bool { + // are we expecting a directory? + if a._directory && !isdir { + return false + } + + // split the path into components + _parts := strings.Split(path, string(_SEPARATOR)) + + // attempt to match the parts against the pattern tokens + return a.match(_parts, a._tokens) +} // Match() + +// match performs the recursive matching for 'any' patterns. An 'any' +// token '**' may match any path component, or no path component. +func (a *any) match(path []string, tokens []*Token) bool { + // if we have no more tokens, then we have matched this path + // if there are also no more path elements, otherwise there's no match + if len(tokens) == 0 { + return len(path) == 0 + } + + // what token are we trying to match? + _token := tokens[0] + switch _token.Type { + case ANY: + if len(path) == 0 { + return a.match(path, tokens[1:]) + } else { + return a.match(path, tokens[1:]) || a.match(path[1:], tokens) + } + + default: + // if we have a non-ANY token, then we must have a non-empty path + if len(path) != 0 { + // if the current path element matches this token, + // we match if the remainder of the path matches the + // remaining tokens + if fnmatch.Match(_token.Token(), path[0], fnmatch.FNM_PATHNAME) { + return a.match(path[1:], tokens[1:]) + } + } + } + + // if we are here, then we have no match + return false +} // match() + +// ensure the patterns confirm to the Pattern interface +var _ Pattern = &name{} +var _ Pattern = &path{} +var _ Pattern = &any{} diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/position.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/position.go new file mode 100644 index 00000000..236a0c39 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/position.go @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "fmt" +) + +// Position represents the position of the .gitignore parser, and the position +// of a .gitignore pattern within the parsed stream. +type Position struct { + File string + Line int + Column int + Offset int +} + +// String returns a string representation of the current position. +func (p Position) String() string { + _prefix := "" + if p.File != "" { + _prefix = p.File + ": " + } + + if p.Line == 0 { + return fmt.Sprintf("%s+%d", _prefix, p.Offset) + } else if p.Column == 0 { + return fmt.Sprintf("%s%d", _prefix, p.Line) + } else { + return fmt.Sprintf("%s%d:%d", _prefix, p.Line, p.Column) + } +} // String() + +// Zero returns true if the Position represents the zero Position +func (p Position) Zero() bool { + return p.Line+p.Column+p.Offset == 0 +} // Zero() diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/repository.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/repository.go new file mode 100644 index 00000000..1f71fd8f --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/repository.go @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "os" + "path/filepath" + "strings" +) + +const File = ".gitignore" + +// repository is the implementation of the set of .gitignore files within a +// repository hierarchy +type repository struct { + ignore + _errors func(e Error) bool + _cache Cache + _file string + _exclude GitIgnore +} // repository{} + +// NewRepository returns a GitIgnore instance representing a git repository +// with root directory base. If base is not a directory, or base cannot be +// read, NewRepository will return an error. +// +// Internally, NewRepository uses NewRepositoryWithFile. +func NewRepository(base string) (GitIgnore, error) { + return NewRepositoryWithFile(base, File) +} // NewRepository() + +// NewRepositoryWithFile returns a GitIgnore instance representing a git +// repository with root directory base. The repository will use file as +// the name of the files within the repository from which to load the +// .gitignore patterns. If file is the empty string, NewRepositoryWithFile +// uses ".gitignore". If the ignore file name is ".gitignore", the returned +// GitIgnore instance will also consider patterns listed in +// $GIT_DIR/info/exclude when performing repository matching. +// +// Internally, NewRepositoryWithFile uses NewRepositoryWithErrors. +func NewRepositoryWithFile(base, file string) (GitIgnore, error) { + // define an error handler to catch any file access errors + // - record the first encountered error + var _error Error + _errors := func(e Error) bool { + if _error == nil { + _error = e + } + return true + } + + // attempt to retrieve the repository represented by this file + _repository := NewRepositoryWithErrors(base, file, _errors) + + // did we encounter an error? + // - if the error has a zero Position then it was encountered + // before parsing was attempted, so we return that error + if _error != nil { + if _error.Position().Zero() { + return nil, _error.Underlying() + } + } + + // otherwise, we ignore the parser errors + return _repository, nil +} // NewRepositoryWithFile() + +// NewRepositoryWithErrors returns a GitIgnore instance representing a git +// repository with a root directory base. As with NewRepositoryWithFile, file +// specifies the name of the files within the repository containing the +// .gitignore patterns, and defaults to ".gitignore" if file is not specified. +// If the ignore file name is ".gitignore", the returned GitIgnore instance +// will also consider patterns listed in $GIT_DIR/info/exclude when performing +// repository matching. +// +// If errors is given, it will be invoked for each error encountered while +// matching a path against the repository GitIgnore (such as file permission +// denied, or errors during .gitignore parsing). See Match below. +// +// Internally, NewRepositoryWithErrors uses NewRepositoryWithCache. +func NewRepositoryWithErrors(base, file string, errors func(e Error) bool) GitIgnore { + return NewRepositoryWithCache(base, file, NewCache(), errors) +} // NewRepositoryWithErrors() + +// NewRepositoryWithCache returns a GitIgnore instance representing a git +// repository with a root directory base. As with NewRepositoryWithErrors, +// file specifies the name of the files within the repository containing the +// .gitignore patterns, and defaults to ".gitignore" if file is not specified. +// If the ignore file name is ".gitignore", the returned GitIgnore instance +// will also consider patterns listed in $GIT_DIR/info/exclude when performing +// repository matching. +// +// NewRepositoryWithCache will attempt to load each .gitignore within the +// repository only once, using NewWithCache to store the corresponding +// GitIgnore instance in cache. If cache is given as nil, +// NewRepositoryWithCache will create a Cache instance for this repository. +// +// If errors is given, it will be invoked for each error encountered while +// matching a path against the repository GitIgnore (such as file permission +// denied, or errors during .gitignore parsing). See Match below. +func NewRepositoryWithCache(base, file string, cache Cache, errors func(e Error) bool) GitIgnore { + // do we have an error handler? + _errors := errors + if _errors == nil { + _errors = func(e Error) bool { return true } + } + + // extract the absolute path of the base directory + _base, _err := filepath.Abs(base) + if _err != nil { + _errors(NewError(_err, Position{})) + return nil + } + + // ensure the given base is a directory + _info, _err := os.Stat(_base) + if _info != nil { + if !_info.IsDir() { + _err = InvalidDirectoryError + } + } + if _err != nil { + _errors(NewError(_err, Position{})) + return nil + } + + // if we haven't been given a base file name, use the default + if file == "" { + file = File + } + + // are we matching .gitignore files? + // - if we are, we also consider $GIT_DIR/info/exclude + var _exclude GitIgnore + if file == File { + _exclude, _err = exclude(_base) + if _err != nil { + _errors(NewError(_err, Position{})) + return nil + } + } + + // create the repository instance + _ignore := ignore{_base: _base} + _repository := &repository{ + ignore: _ignore, + _errors: _errors, + _exclude: _exclude, + _cache: cache, + _file: file, + } + + return _repository +} // NewRepositoryWithCache() + +// Match attempts to match the path against this repository. Matching proceeds +// according to normal gitignore rules, where .gtignore files in the same +// directory as path, take precedence over .gitignore files higher up the +// path hierarchy, and child files and directories are ignored if the parent +// is ignored. If the path is matched by a gitignore pattern in the repository, +// a Match is returned detailing the matched pattern. The returned Match +// can be used to determine if the path should be ignored or included according +// to the repository. +// +// If an error is encountered during matching, the repository error handler +// (if configured via NewRepositoryWithErrors or NewRepositoryWithCache), will +// be called. If the error handler returns false, matching will terminate and +// Match will return nil. If handler returns true, Match will continue +// processing in an attempt to match path. +// +// Match will raise an error and return nil if the absolute path cannot be +// determined, or if its not possible to determine if path represents a file +// or a directory. +// +// If path is not located under the root of this repository, Match returns nil. +func (r *repository) Match(path string) Match { + // ensure we have the absolute path for the given file + _path, _err := filepath.Abs(path) + if _err != nil { + r._errors(NewError(_err, Position{})) + return nil + } + + // is the path a file or a directory? + _info, _err := os.Stat(_path) + if _err != nil { + r._errors(NewError(_err, Position{})) + return nil + } + _isdir := _info.IsDir() + + // attempt to match the absolute path + return r.Absolute(_path, _isdir) +} // Match() + +// Absolute attempts to match an absolute path against this repository. If the +// path is not located under the base directory of this repository, or is not +// matched by this repository, nil is returned. +func (r *repository) Absolute(path string, isdir bool) Match { + // does the file share the same directory as this ignore file? + if !strings.HasPrefix(path, r.Base()) { + return nil + } + + // extract the relative path of this file + _prefix := len(r.Base()) + 1 + _rel := string(path[_prefix:]) + return r.Relative(_rel, isdir) +} // Absolute() + +// Relative attempts to match a path relative to the repository base directory. +// If the path is not matched by the repository, nil is returned. +func (r *repository) Relative(path string, isdir bool) Match { + // if there's no path, then there's nothing to match + _path := filepath.Clean(path) + if _path == "." { + return nil + } + + // repository matching: + // - a child path cannot be considered if its parent is ignored + // - a .gitignore in a lower directory overrides a .gitignore in a + // higher directory + + // first, is the parent directory ignored? + // - extract the parent directory from the current path + _parent, _local := filepath.Split(_path) + _match := r.Relative(_parent, true) + if _match != nil { + if _match.Ignore() { + return _match + } + } + _parent = filepath.Clean(_parent) + + // the parent directory isn't ignored, so we now look at the original path + // - we consider .gitignore files in the current directory first, then + // move up the path hierarchy + var _last string + for { + _file := filepath.Join(r._base, _parent, r._file) + _ignore := NewWithCache(_file, r._cache, r._errors) + if _ignore != nil { + _match := _ignore.Relative(_local, isdir) + if _match != nil { + return _match + } + } + + // if there's no parent, then we're done + // - since we use filepath.Clean() we look for "." + if _parent == "." { + break + } + + // we don't have a match for this file, so we progress up the + // path hierarchy + // - we are manually building _local using the .gitignore + // separator "/", which is how we handle operating system + // file system differences + _parent, _last = filepath.Split(_parent) + _parent = filepath.Clean(_parent) + _local = _last + string(_SEPARATOR) + _local + } + + // do we have a global exclude file? (i.e. GIT_DIR/info/exclude) + if r._exclude != nil { + return r._exclude.Relative(path, isdir) + } + + // we have no match + return nil +} // Relative() + +// ensure repository satisfies the GitIgnore interface +var _ GitIgnore = &repository{} diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/rune.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/rune.go new file mode 100644 index 00000000..72ba469f --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/rune.go @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +const ( + // define the sentinel runes of the lexer + _EOF = rune(0) + _CR = rune('\r') + _NEWLINE = rune('\n') + _COMMENT = rune('#') + _SEPARATOR = rune('/') + _ESCAPE = rune('\\') + _SPACE = rune(' ') + _TAB = rune('\t') + _NEGATION = rune('!') + _WILDCARD = rune('*') +) diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/token.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/token.go new file mode 100644 index 00000000..8402a700 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/token.go @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +import ( + "fmt" +) + +// Token represents a parsed token from a .gitignore stream, encapsulating the +// token type, the runes comprising the token, and the position within the +// stream of the first rune of the token. +type Token struct { + Type TokenType + Word []rune + Position +} + +// NewToken returns a Token instance of the given t, represented by the +// word runes, at the stream position pos. If the token type is not know, the +// returned instance will have type BAD. +func NewToken(t TokenType, word []rune, pos Position) *Token { + // ensure the type is valid + if t < ILLEGAL || t > BAD { + t = BAD + } + + // return the token + return &Token{Type: t, Word: word, Position: pos} +} // NewToken() + +// Name returns a string representation of the Token type. +func (t *Token) Name() string { + return t.Type.String() +} // Name() + +// Token returns the string representation of the Token word. +func (t *Token) Token() string { + return string(t.Word) +} // Token() + +// String returns a string representation of the Token, encapsulating its +// position in the input stream, its name (i.e. type), and its runes. +func (t *Token) String() string { + return fmt.Sprintf("%s: %s %q", t.Position.String(), t.Name(), t.Token()) +} // String() diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/tokenset.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/tokenset.go new file mode 100644 index 00000000..228e702d --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/tokenset.go @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +// tokenset represents an ordered list of Tokens +type tokenset []*Token + +// String() returns a concatenated string of all runes represented by the +// list of tokens. +func (t tokenset) String() string { + // concatenate the tokens into a single string + _rtn := "" + for _, _t := range []*Token(t) { + _rtn = _rtn + _t.Token() + } + return _rtn +} // String() diff --git a/vendor/github.com/boyter/gocodewalker/go-gitignore/tokentype.go b/vendor/github.com/boyter/gocodewalker/go-gitignore/tokentype.go new file mode 100644 index 00000000..d45eabe8 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/go-gitignore/tokentype.go @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT + +package gitignore + +type TokenType int + +const ( + ILLEGAL TokenType = iota + EOF + EOL + WHITESPACE + COMMENT + SEPARATOR + NEGATION + PATTERN + ANY + BAD +) + +// String returns a string representation of the Token type. +func (t TokenType) String() string { + switch t { + case ILLEGAL: + return "ILLEGAL" + case EOF: + return "EOF" + case EOL: + return "EOL" + case WHITESPACE: + return "WHITESPACE" + case COMMENT: + return "COMMENT" + case SEPARATOR: + return "SEPARATOR" + case NEGATION: + return "NEGATION" + case PATTERN: + return "PATTERN" + case ANY: + return "ANY" + default: + return "BAD TOKEN" + } +} // String() diff --git a/vendor/github.com/boyter/gocodewalker/hidden.go b/vendor/github.com/boyter/gocodewalker/hidden.go new file mode 100644 index 00000000..2a8347ff --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/hidden.go @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT OR Unlicense +//go:build !windows +// +build !windows + +package gocodewalker + +import ( + "os" +) + +// IsHidden Returns true if file is hidden +func IsHidden(file os.FileInfo, directory string) (bool, error) { + return file.Name()[0:1] == ".", nil +} diff --git a/vendor/github.com/boyter/gocodewalker/hidden_windows.go b/vendor/github.com/boyter/gocodewalker/hidden_windows.go new file mode 100644 index 00000000..ea0ebf90 --- /dev/null +++ b/vendor/github.com/boyter/gocodewalker/hidden_windows.go @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT OR Unlicense +//go:build windows +// +build windows + +package gocodewalker + +import ( + "os" + "path" + "syscall" +) + +// IsHidden Returns true if file is hidden +func IsHidden(file os.FileInfo, directory string) (bool, error) { + fullpath := path.Join(directory, file.Name()) + pointer, err := syscall.UTF16PtrFromString(fullpath) + if err != nil { + return false, err + } + attributes, err := syscall.GetFileAttributes(pointer) + if err != nil { + return false, err + } + return attributes&syscall.FILE_ATTRIBUTE_HIDDEN != 0, nil +} diff --git a/vendor/github.com/danwakefield/fnmatch/.gitignore b/vendor/github.com/danwakefield/fnmatch/.gitignore new file mode 100644 index 00000000..daf913b1 --- /dev/null +++ b/vendor/github.com/danwakefield/fnmatch/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/danwakefield/fnmatch/LICENSE b/vendor/github.com/danwakefield/fnmatch/LICENSE new file mode 100644 index 00000000..0dc9851a --- /dev/null +++ b/vendor/github.com/danwakefield/fnmatch/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2016, Daniel Wakefield +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/danwakefield/fnmatch/README.md b/vendor/github.com/danwakefield/fnmatch/README.md new file mode 100644 index 00000000..b8d71566 --- /dev/null +++ b/vendor/github.com/danwakefield/fnmatch/README.md @@ -0,0 +1,4 @@ +# fnmatch +Updated clone of kballards golang fnmatch gist (https://gist.github.com/kballard/272720) + + diff --git a/vendor/github.com/danwakefield/fnmatch/fnmatch.go b/vendor/github.com/danwakefield/fnmatch/fnmatch.go new file mode 100644 index 00000000..07ac7b37 --- /dev/null +++ b/vendor/github.com/danwakefield/fnmatch/fnmatch.go @@ -0,0 +1,219 @@ +// Provide string-matching based on fnmatch.3 +package fnmatch + +// There are a few issues that I believe to be bugs, but this implementation is +// based as closely as possible on BSD fnmatch. These bugs are present in the +// source of BSD fnmatch, and so are replicated here. The issues are as follows: +// +// * FNM_PERIOD is no longer observed after the first * in a pattern +// This only applies to matches done with FNM_PATHNAME as well +// * FNM_PERIOD doesn't apply to ranges. According to the documentation, +// a period must be matched explicitly, but a range will match it too + +import ( + "unicode" + "unicode/utf8" +) + +const ( + FNM_NOESCAPE = (1 << iota) + FNM_PATHNAME + FNM_PERIOD + + FNM_LEADING_DIR + FNM_CASEFOLD + + FNM_IGNORECASE = FNM_CASEFOLD + FNM_FILE_NAME = FNM_PATHNAME +) + +func unpackRune(str *string) rune { + rune, size := utf8.DecodeRuneInString(*str) + *str = (*str)[size:] + return rune +} + +// Matches the pattern against the string, with the given flags, +// and returns true if the match is successful. +// This function should match fnmatch.3 as closely as possible. +func Match(pattern, s string, flags int) bool { + // The implementation for this function was patterned after the BSD fnmatch.c + // source found at http://src.gnu-darwin.org/src/contrib/csup/fnmatch.c.html + noescape := (flags&FNM_NOESCAPE != 0) + pathname := (flags&FNM_PATHNAME != 0) + period := (flags&FNM_PERIOD != 0) + leadingdir := (flags&FNM_LEADING_DIR != 0) + casefold := (flags&FNM_CASEFOLD != 0) + // the following is some bookkeeping that the original fnmatch.c implementation did not do + // We are forced to do this because we're not keeping indexes into C strings but rather + // processing utf8-encoded strings. Use a custom unpacker to maintain our state for us + sAtStart := true + sLastAtStart := true + sLastSlash := false + sLastUnpacked := rune(0) + unpackS := func() rune { + sLastSlash = (sLastUnpacked == '/') + sLastUnpacked = unpackRune(&s) + sLastAtStart = sAtStart + sAtStart = false + return sLastUnpacked + } + for len(pattern) > 0 { + c := unpackRune(&pattern) + switch c { + case '?': + if len(s) == 0 { + return false + } + sc := unpackS() + if pathname && sc == '/' { + return false + } + if period && sc == '.' && (sLastAtStart || (pathname && sLastSlash)) { + return false + } + case '*': + // collapse multiple *'s + // don't use unpackRune here, the only char we care to detect is ASCII + for len(pattern) > 0 && pattern[0] == '*' { + pattern = pattern[1:] + } + if period && s[0] == '.' && (sAtStart || (pathname && sLastUnpacked == '/')) { + return false + } + // optimize for patterns with * at end or before / + if len(pattern) == 0 { + if pathname { + return leadingdir || (strchr(s, '/') == -1) + } else { + return true + } + return !(pathname && strchr(s, '/') >= 0) + } else if pathname && pattern[0] == '/' { + offset := strchr(s, '/') + if offset == -1 { + return false + } else { + // we already know our pattern and string have a /, skip past it + s = s[offset:] // use unpackS here to maintain our bookkeeping state + unpackS() + pattern = pattern[1:] // we know / is one byte long + break + } + } + // general case, recurse + for test := s; len(test) > 0; unpackRune(&test) { + // I believe the (flags &^ FNM_PERIOD) is a bug when FNM_PATHNAME is specified + // but this follows exactly from how fnmatch.c implements it + if Match(pattern, test, (flags &^ FNM_PERIOD)) { + return true + } else if pathname && test[0] == '/' { + break + } + } + return false + case '[': + if len(s) == 0 { + return false + } + if pathname && s[0] == '/' { + return false + } + sc := unpackS() + if !rangematch(&pattern, sc, flags) { + return false + } + case '\\': + if !noescape { + if len(pattern) > 0 { + c = unpackRune(&pattern) + } + } + fallthrough + default: + if len(s) == 0 { + return false + } + sc := unpackS() + switch { + case sc == c: + case casefold && unicode.ToLower(sc) == unicode.ToLower(c): + default: + return false + } + } + } + return len(s) == 0 || (leadingdir && s[0] == '/') +} + +func rangematch(pattern *string, test rune, flags int) bool { + if len(*pattern) == 0 { + return false + } + casefold := (flags&FNM_CASEFOLD != 0) + noescape := (flags&FNM_NOESCAPE != 0) + if casefold { + test = unicode.ToLower(test) + } + var negate, matched bool + if (*pattern)[0] == '^' || (*pattern)[0] == '!' { + negate = true + (*pattern) = (*pattern)[1:] + } + for !matched && len(*pattern) > 1 && (*pattern)[0] != ']' { + c := unpackRune(pattern) + if !noescape && c == '\\' { + if len(*pattern) > 1 { + c = unpackRune(pattern) + } else { + return false + } + } + if casefold { + c = unicode.ToLower(c) + } + if (*pattern)[0] == '-' && len(*pattern) > 1 && (*pattern)[1] != ']' { + unpackRune(pattern) // skip the - + c2 := unpackRune(pattern) + if !noescape && c2 == '\\' { + if len(*pattern) > 0 { + c2 = unpackRune(pattern) + } else { + return false + } + } + if casefold { + c2 = unicode.ToLower(c2) + } + // this really should be more intelligent, but it looks like + // fnmatch.c does simple int comparisons, therefore we will as well + if c <= test && test <= c2 { + matched = true + } + } else if c == test { + matched = true + } + } + // skip past the rest of the pattern + ok := false + for !ok && len(*pattern) > 0 { + c := unpackRune(pattern) + if c == '\\' && len(*pattern) > 0 { + unpackRune(pattern) + } else if c == ']' { + ok = true + } + } + return ok && matched != negate +} + +// define strchr because strings.Index() seems a bit overkill +// returns the index of c in s, or -1 if there is no match +func strchr(s string, c rune) int { + for i, sc := range s { + if sc == c { + return i + } + } + return -1 +} diff --git a/vendor/github.com/dbaggerman/cuba/Makefile b/vendor/github.com/dbaggerman/cuba/Makefile deleted file mode 100644 index 8b96f33f..00000000 --- a/vendor/github.com/dbaggerman/cuba/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -.PHONY: test -test: test-unit test-integration - -.PHONY: test-unit -test-unit: - go vet - go test - -.PHONY: test-integration -test-integration: - go run -race ./examples/simple 2>/dev/null - go run -race ./examples/dirwalk 2>/dev/null - go run -race ./examples/abort 2>/dev/null - diff --git a/vendor/github.com/dbaggerman/cuba/README.md b/vendor/github.com/dbaggerman/cuba/README.md deleted file mode 100644 index fbc9026c..00000000 --- a/vendor/github.com/dbaggerman/cuba/README.md +++ /dev/null @@ -1,77 +0,0 @@ -Project Cuba ------------- - -Experiment in allowing workers to own the means of production. - -Go makes many parallel cases easy to implement. Cuba aims to simplify some of -the cases that aren't as easy to implement. - -If your algorithm can handle unbounded parallelism, then just spawn thousands -of goroutines and let the Go runtime figure out how to make it work. However, -this doesn't work if you have limits on external resources like open file -descriptors or database connection handles. It also may not be the most memory -efficient since each goroutine needs its own call stack. - -For bounded parallelism, Go's `chan`s allow splitting a task into a sequence of -steps that happen in parallel. This model supports fanning in and out to -increase the parallelism beyond the number of sequential steps. - -The limitation of using `chan`s is that they only work so long as the pipeline -of work is unidirectional. Simple linear sequences are easiest, but you can -construct any acyclical graph. - -Cuba aims to support parallelism where the dataflow may be cyclical. - -One example is a crawler style algorithm which involves both taking a node to -process, and pushing newly discovered nodes back onto the queue. - -Another example is backing off and retrying without head-of-line blocking. Work -items could be pushed to the back of the queue to be retried when they come -around again. - -Usage -===== - -First, define a worker function: - -```go -func doWork(handle *cuba.Handle) { - item := handle.Item().(myItemType) - - // Do something with item - - for _, newItem := range newItemsFound { - handle.Push(newItem) - // Optionally: handle.Sync() - } -} -``` - -Normally, `handle.Push()` buffers the new items before releasing them back to -the work pool. When the function returns, the pool mutex will be aquired once -and the items pushed as a batch. This means that other threads may sit idle -until the function returns. - -Calling `handle.Sync()` will immediately aquire the lock and push any items in -the buffer. This will increase lock contention, but may improve parallelism if -you have long running workers. - -Then initialize a pool, seed with initial items, and wait for processing to complete. - -```go - // Initialize a new pool. - // Swap `cuba.NewQueue()` for `cuba.NewStack()` for LIFO order - pool := cuba.New(doWork, cuba.NewQueue()) - - // Optionally: pool.SetMaxWorkers(n) - - // Seed the pool with initial work - // Workers are started as soon as something is available to process - pool.Push(myFirstItem) - - // Wait for the workers to finish processing all work and terminate - pool.Finish() -``` - -By default, `cuba` pools have a maximum thread count equal to `runtime.NumCPU()`. This can be changed by calling `pool.SetMaxWorkers`. - diff --git a/vendor/github.com/dbaggerman/cuba/bucket.go b/vendor/github.com/dbaggerman/cuba/bucket.go deleted file mode 100644 index d25b3d60..00000000 --- a/vendor/github.com/dbaggerman/cuba/bucket.go +++ /dev/null @@ -1,75 +0,0 @@ -package cuba - -import ( - "container/list" -) - -type Bucket interface { - Push(interface{}) - PushAll([]interface{}) - Pop() interface{} - IsEmpty() bool - Empty() -} - -type Stack struct { - data []interface{} -} - -func NewStack() *Stack { - return &Stack{} -} - -func (stack *Stack) Push(item interface{}) { - stack.data = append(stack.data, item) -} - -func (stack *Stack) PushAll(items []interface{}) { - stack.data = append(stack.data, items...) -} - -func (stack *Stack) Pop() interface{} { - item := stack.data[len(stack.data)-1] - stack.data = stack.data[:len(stack.data)-1] - return item -} - -func (stack *Stack) IsEmpty() bool { - return len(stack.data) == 0 -} - -func (stack *Stack) Empty() { - stack.data = nil -} - -type Queue struct { - data *list.List -} - -func NewQueue() *Queue { - return &Queue{ - data: list.New().Init(), - } -} - -func (queue *Queue) Push(item interface{}) { - queue.data.PushBack(item) -} - -func (queue *Queue) PushAll(items []interface{}) { - for _, item := range items { - queue.Push(item) - } -} - -func (queue *Queue) Pop() interface{} { - return queue.data.Remove(queue.data.Front()) -} - -func (queue *Queue) IsEmpty() bool { - return queue.data.Len() == 0 -} - -func (queue *Queue) Empty() { - queue.data = list.New().Init() -} diff --git a/vendor/github.com/dbaggerman/cuba/handle.go b/vendor/github.com/dbaggerman/cuba/handle.go deleted file mode 100644 index 25cd86c7..00000000 --- a/vendor/github.com/dbaggerman/cuba/handle.go +++ /dev/null @@ -1,22 +0,0 @@ -package cuba - -type Handle struct { - pool *Pool - item interface{} - items []interface{} -} - -func (handle *Handle) Item() interface{} { - return handle.item -} - -func (handle *Handle) Push(item interface{}) { - handle.items = append(handle.items, item) -} - -func (handle *Handle) Sync() { - // PushAll can return PoolAbortedErr, but we deliberately ignore it - // silently here. - handle.pool.PushAll(handle.items) - handle.items = handle.items[:0] -} diff --git a/vendor/github.com/dbaggerman/cuba/pool.go b/vendor/github.com/dbaggerman/cuba/pool.go deleted file mode 100644 index 56d64da5..00000000 --- a/vendor/github.com/dbaggerman/cuba/pool.go +++ /dev/null @@ -1,169 +0,0 @@ -package cuba - -import ( - "errors" - "runtime" - "sync" - "sync/atomic" -) - -type Task func(*Handle) - -var PoolAbortedErr = errors.New("pool has been aborted") - -const ( - POOL_RUN = iota - POOL_FINISH - POOL_ABORT -) - -type Pool struct { - mutex *sync.Mutex - bucket Bucket - cond *sync.Cond - numWorkers int32 - maxWorkers int32 - state int - task Task - wg *sync.WaitGroup -} - -// Constructs a new Cuba thread pool. -// -// The worker callback will be called by multiple goroutines in parallel, so is -// expected to be thread safe. -// -// Bucket affects the order that items will be processed in. cuba.NewQueue() -// provides FIFO ordering, while cuba.NewStack() provides LIFO ordered work. -func New(task Task, bucket Bucket) *Pool { - m := &sync.Mutex{} - return &Pool{ - mutex: m, - bucket: bucket, - cond: sync.NewCond(m), - task: task, - maxWorkers: int32(runtime.NumCPU()), - wg: &sync.WaitGroup{}, - state: POOL_RUN, - } -} - -// Sets the maximum number of worker goroutines. -// -// Default: runtime.NumCPU() (i.e. the number of CPU cores available) -func (pool *Pool) SetMaxWorkers(n int32) { - pool.maxWorkers = n -} - -// Push an item into the worker pool. This will be scheduled to run on a worker -// immediately. -func (pool *Pool) Push(item interface{}) error { - pool.mutex.Lock() - defer pool.mutex.Unlock() - - if pool.state == POOL_ABORT { - return PoolAbortedErr - } - - // The ideal might be to have a fixed pool of worker goroutines which all - // close down when the work is done. - // However, since the bucket can drain down to 0 and appear done before the - // final worker queues more items it's a little complicated. - // Having a floating pool means we can restart workers as we discover more - // work to be done, which solves this problem at the cost of a little - // inefficiency. - if atomic.LoadInt32(&pool.numWorkers) < pool.maxWorkers { - atomic.AddInt32(&pool.numWorkers, 1) - pool.wg.Add(1) - go pool.runWorker() - } - - pool.bucket.Push(item) - pool.cond.Signal() - - return nil -} - -// Push multiple items into the worker pool. -// -// Compared to Push() this only aquires the lock once, so may reduce lock -// contention. -func (pool *Pool) PushAll(items []interface{}) error { - pool.mutex.Lock() - defer pool.mutex.Unlock() - - if pool.state == POOL_ABORT { - return PoolAbortedErr - } - - for i := 0; i < len(items); i++ { - if atomic.LoadInt32(&pool.numWorkers) >= pool.maxWorkers { - break - } - atomic.AddInt32(&pool.numWorkers, 1) - pool.wg.Add(1) - go pool.runWorker() - } - - pool.bucket.PushAll(items) - pool.cond.Broadcast() - - return nil -} - -// Calling Finish() waits for all work to complete, and allows goroutines to shut -// down. -func (pool *Pool) Finish() { - pool.mutex.Lock() - - pool.state = POOL_FINISH - pool.cond.Broadcast() - - pool.mutex.Unlock() - pool.wg.Wait() -} - -func (pool *Pool) Abort() { - pool.mutex.Lock() - - pool.state = POOL_ABORT - pool.cond.Broadcast() - - pool.mutex.Unlock() - pool.wg.Wait() -} - -func (pool *Pool) next() (interface{}, bool) { - pool.mutex.Lock() - defer pool.mutex.Unlock() - - for pool.bucket.IsEmpty() { - if pool.state == POOL_FINISH || pool.state == POOL_ABORT { - return nil, false - } - pool.cond.Wait() - } - - item := pool.bucket.Pop() - - return item, true -} - -func (pool *Pool) runWorker() { - handle := Handle{ - pool: pool, - } - for { - item, ok := pool.next() - if !ok { - break - } - handle.item = item - - pool.task(&handle) - handle.Sync() - } - atomic.AddInt32(&pool.numWorkers, -1) - - pool.wg.Done() -} diff --git a/vendor/golang.org/x/sync/LICENSE b/vendor/golang.org/x/sync/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/golang.org/x/sync/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/sync/PATENTS b/vendor/golang.org/x/sync/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/golang.org/x/sync/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go new file mode 100644 index 00000000..948a3ee6 --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/errgroup.go @@ -0,0 +1,135 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package errgroup provides synchronization, error propagation, and Context +// cancelation for groups of goroutines working on subtasks of a common task. +// +// [errgroup.Group] is related to [sync.WaitGroup] but adds handling of tasks +// returning errors. +package errgroup + +import ( + "context" + "fmt" + "sync" +) + +type token struct{} + +// A Group is a collection of goroutines working on subtasks that are part of +// the same overall task. +// +// A zero Group is valid, has no limit on the number of active goroutines, +// and does not cancel on error. +type Group struct { + cancel func(error) + + wg sync.WaitGroup + + sem chan token + + errOnce sync.Once + err error +} + +func (g *Group) done() { + if g.sem != nil { + <-g.sem + } + g.wg.Done() +} + +// WithContext returns a new Group and an associated Context derived from ctx. +// +// The derived Context is canceled the first time a function passed to Go +// returns a non-nil error or the first time Wait returns, whichever occurs +// first. +func WithContext(ctx context.Context) (*Group, context.Context) { + ctx, cancel := withCancelCause(ctx) + return &Group{cancel: cancel}, ctx +} + +// Wait blocks until all function calls from the Go method have returned, then +// returns the first non-nil error (if any) from them. +func (g *Group) Wait() error { + g.wg.Wait() + if g.cancel != nil { + g.cancel(g.err) + } + return g.err +} + +// Go calls the given function in a new goroutine. +// It blocks until the new goroutine can be added without the number of +// active goroutines in the group exceeding the configured limit. +// +// The first call to return a non-nil error cancels the group's context, if the +// group was created by calling WithContext. The error will be returned by Wait. +func (g *Group) Go(f func() error) { + if g.sem != nil { + g.sem <- token{} + } + + g.wg.Add(1) + go func() { + defer g.done() + + if err := f(); err != nil { + g.errOnce.Do(func() { + g.err = err + if g.cancel != nil { + g.cancel(g.err) + } + }) + } + }() +} + +// TryGo calls the given function in a new goroutine only if the number of +// active goroutines in the group is currently below the configured limit. +// +// The return value reports whether the goroutine was started. +func (g *Group) TryGo(f func() error) bool { + if g.sem != nil { + select { + case g.sem <- token{}: + // Note: this allows barging iff channels in general allow barging. + default: + return false + } + } + + g.wg.Add(1) + go func() { + defer g.done() + + if err := f(); err != nil { + g.errOnce.Do(func() { + g.err = err + if g.cancel != nil { + g.cancel(g.err) + } + }) + } + }() + return true +} + +// SetLimit limits the number of active goroutines in this group to at most n. +// A negative value indicates no limit. +// +// Any subsequent call to the Go method will block until it can add an active +// goroutine without exceeding the configured limit. +// +// The limit must not be modified while any goroutines in the group are active. +func (g *Group) SetLimit(n int) { + if n < 0 { + g.sem = nil + return + } + if len(g.sem) != 0 { + panic(fmt.Errorf("errgroup: modify limit while %v goroutines in the group are still active", len(g.sem))) + } + g.sem = make(chan token, n) +} diff --git a/vendor/golang.org/x/sync/errgroup/go120.go b/vendor/golang.org/x/sync/errgroup/go120.go new file mode 100644 index 00000000..f93c740b --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/go120.go @@ -0,0 +1,13 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + return context.WithCancelCause(parent) +} diff --git a/vendor/golang.org/x/sync/errgroup/pre_go120.go b/vendor/golang.org/x/sync/errgroup/pre_go120.go new file mode 100644 index 00000000..88ce3343 --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/pre_go120.go @@ -0,0 +1,14 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + ctx, cancel := context.WithCancel(parent) + return ctx, func(error) { cancel() } +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 0070cdf6..9d7cde43 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,6 +1,10 @@ -# github.com/dbaggerman/cuba v0.3.2 -## explicit; go 1.12 -github.com/dbaggerman/cuba +# github.com/boyter/gocodewalker v1.3.1 +## explicit; go 1.20 +github.com/boyter/gocodewalker +github.com/boyter/gocodewalker/go-gitignore +# github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 +## explicit +github.com/danwakefield/fnmatch # github.com/inconshreveable/mousetrap v1.1.0 ## explicit; go 1.18 github.com/inconshreveable/mousetrap @@ -40,6 +44,9 @@ github.com/spf13/cobra # github.com/spf13/pflag v1.0.5 ## explicit; go 1.12 github.com/spf13/pflag +# golang.org/x/sync v0.7.0 +## explicit; go 1.18 +golang.org/x/sync/errgroup # golang.org/x/sys v0.10.0 ## explicit; go 1.17 golang.org/x/sys/unix